亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

在軟件開發(fā)中,構(gòu)建模塊化、可擴(kuò)展和易維護(hù)的應(yīng)用程序是每位架構(gòu)師的目標(biāo)。本文將介紹如何設(shè)計(jì)和實(shí)現(xiàn)一個(gè)模塊類來構(gòu)建一個(gè)模塊化編程框架,以便更好地管理和擴(kuò)展應(yīng)用程序功能。

引言

在軟件開發(fā)中,模塊化編程是一種重要的架構(gòu)方法。它將應(yīng)用程序分解為多個(gè)相互獨(dú)立的模塊,每個(gè)模塊負(fù)責(zé)不同的任務(wù)。這種方法使得代碼更易維護(hù)、更易擴(kuò)展,也更易重用。本文將介紹一個(gè)簡(jiǎn)單而強(qiáng)大的模塊化編程框架,它包括兩個(gè)主要組件:模塊類(Module)和模塊工廠類(ModuleFactory)。這兩者的結(jié)合為開發(fā)者提供了一種靈活的方式,可以輕松地創(chuàng)建和管理模塊。

模塊類(Module)

設(shè)計(jì)

模塊類是模塊化編程框架的核心。每個(gè)模塊都是一個(gè)繼承自 Module 的類。模塊類有一個(gè)名字屬性,用于唯一標(biāo)識(shí)每個(gè)模塊。

class Module {
public:
    Module() = default;
    virtual ~Module() = default;

    const std::string &getModuleName() const {
        return moduleName_;
    }

protected:
    void setModuleName(const std::string &name) {
        moduleName_ = name;
    }

private:
    std::string moduleName_;
    friend class ModuleFactory;
};

在上述代碼中,Module 類包括了以下主要部分:

  • getModuleName(): 獲取模塊的名字。
  • setModuleName(const std::string &name): 設(shè)置模塊的名字。

setModuleName 方法的私有訪問權(quán)限確保只有 ModuleFactory 類能夠修改模塊的名字。

模塊工廠類(ModuleFactory)

設(shè)計(jì)

模塊工廠類是一個(gè)用于創(chuàng)建和管理模塊的中心樞紐。每個(gè)模塊必須在工廠中進(jìn)行注冊(cè),以便能夠通過工廠創(chuàng)建和獲取模塊的實(shí)例。

 class ModuleFactory {
private:
    // 內(nèi)部結(jié)構(gòu)體,用于標(biāo)識(shí)模塊
    struct moduleid {
        moduleid() = default;
        moduleid(std::string n, std::size_t h)
            : name(std::move(n)), code(h) {}
        explicit moduleid(const std::type_info &info)
            : name(info.name()), code(info.hash_code()) {}

        bool operator==(const moduleid &mid) const {
            return name == mid.name && code == mid.code;
        }

        std::string name;
        std::size_t code = 0;
    };

public:
    // 獲取 ModuleFactory 的單例實(shí)例
    static ModuleFactory &getFactory() {
        static ModuleFactory factory;
        return factory;
    }

    // 獲取注冊(cè)在工廠中的模塊名稱集合
    const std::unordered_set<std::string> &getModuleNames() const {
        return *moduleNames_;
    }

    // 用于注冊(cè)模塊的輔助結(jié)構(gòu)體
    template<typename T, typename C = T>
    struct ModuleRegisterHelper {
        // 構(gòu)造函數(shù),用于注冊(cè)模塊
        template<typename... Args>
        ModuleRegisterHelper(std::string n, Args &&...args) {
            auto mptr = getFactory().moduleMapTable_;
            if (mptr->find(n) != mptr->end()) {
                throw std::invalid_argument("模塊 " + n + " 已經(jīng)注冊(cè)。");
            }
            getFactory().moduleNames_->insert(n);
            std::function<std::unique_ptr<Module>(Args...)> create_func = [](Args... args) {
                return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
            };
            const std::any const_any = std::any(create_func);
            (*mptr)[n] = std::make_pAIr(moduleid(typeid(C)), const_any);
        }
    };

    // 獲取指定名稱和類型的模塊
    template<typename T = Module, typename... Args>
    typename std::enable_if<std::is_base_of<Module, T>::value, std::unique_ptr<T>>::type
    getModule(const std::string &n, Args &&...args) {
        auto mptr = getFactory().moduleMapTable_;
        auto miter = mptr->find(n);
        if (miter == mptr->end()) {
            throw std::runtime_error("找不到名稱為 " + n + " 的模塊。");
        }
        if (miter->second.first == moduleid(typeid(T))) {
            auto moduleCreator = std::any_cast<std::function<std::unique_ptr<Module>(Args...)>>(miter->second.second);
            std::unique_ptr<Module> module = moduleCreator(std::forward<Args>(args)...);
            module->setModuleName(n);
            return std::unique_ptr<T>(static_cast<T *>(module.release()));
        }
        auto moduleCreator = std::any_cast<std::function<std::unique_ptr<Module>(Args...)>>(miter->second.second);
        std::unique_ptr<Module> module = moduleCreator(std::forward<Args>(args)...);
        if (!dynamic_cast<T *>(module.get())) {
            throw std::runtime_error("無法將模塊 " + n + " 產(chǎn)生的類型轉(zhuǎn)換為 " + typeid(T).name());
        }
        module->setModuleName(n);
        return std::unique_ptr<T>(static_cast<T *>(module.release()));
    }

private:
    static std::unordered_map<std::string, std::pair<moduleid, std::any>> *moduleMapTable_;
    static std::unordered_set<std::string> *moduleNames_;

    ModuleFactory() {}
    ModuleFactory(const ModuleFactory &) = delete;
    ModuleFactory(ModuleFactory &&) = delete;
};

在 ModuleFactory 類中,可以創(chuàng)建、獲取和管理已注冊(cè)的模塊。

注冊(cè)模塊

要使用模塊工廠創(chuàng)建模塊,需要首先注冊(cè)模塊。這里是通過
ModuleFactory::ModuleRegisterHelper 模板類來實(shí)現(xiàn)的。在注冊(cè)模塊時(shí),需要提供模塊的類型和名字。

可以使用又愛又恨的宏,避免了手動(dòng)編寫大量的注冊(cè)代碼:

#define MODULE_VARIABLE_NAME(module_name, module_type) Module_##module_name##_##module_type##_
#define REGISTER_MODULE(module_name, module_type, ...) 
    static module::ModuleFactory::ModuleRegisterHelper<module_type> MODULE_VARIABLE_NAME(module_name, module_type)(#module_name, ##__VA_ARGS__)
#define DECLARE_MODULE(module_type, ...) REGISTER_MODULE(module_type, module_type, ##__VA_ARGS__)

解釋如下:

  1. MODULE_VARIABLE_NAME(module_name, module_type) 宏:
  2. 該宏用于生成一個(gè)唯一的變量名稱,通常用于防止沖突。它的作用是在模塊名稱和模塊類型之間創(chuàng)建一個(gè)唯一的標(biāo)識(shí)符。
  3. module_name:模塊名稱,通常是一個(gè)字符串。
  4. module_type:模塊類型,通常是一個(gè)C++類的類型。
  5. 例如,如果你有一個(gè)模塊名稱為 "MyModule",模塊類型為 "MyModuleType",則調(diào)用 MODULE_VARIABLE_NAME 宏后將生成 Module_MyModule_MyModuleType_ 作為標(biāo)識(shí)符。
  6. REGISTER_MODULE(module_name, module_type, ...) 宏:
  7. 該宏用于注冊(cè)模塊并將其添加到工廠中,以便后續(xù)可以根據(jù)名稱獲取該模塊。
  8. module_name:模塊的名稱,通常是一個(gè)字符串。
  9. module_type:模塊的類型,通常是一個(gè)C++類的類型。
  10. ...:可選的額外參數(shù),用于創(chuàng)建模塊對(duì)象。
  11. 該宏的作用是創(chuàng)建一個(gè)靜態(tài)變量,并使用 MODULE_VARIABLE_NAME 宏生成唯一的變量名稱,然后通過 ModuleFactory::ModuleRegisterHelper 類將模塊注冊(cè)到工廠中。這樣,你可以在工廠中使用模塊名稱和類型來創(chuàng)建模塊對(duì)象。
  12. 例如,如果你調(diào)用 REGISTER_MODULE("MyModule", MyModuleType, arg1, arg2),宏將創(chuàng)建一個(gè)靜態(tài)變量 Module_MyModule_MyModuleType_ 并使用 ModuleFactory::ModuleRegisterHelper 來注冊(cè)一個(gè)名為 "MyModule" 類型為 "MyModuleType" 的模塊,同時(shí)傳遞額外的參數(shù) arg1 和 arg2 用于創(chuàng)建該模塊對(duì)象。
  13. 可以很方便的注冊(cè)模塊:
REGISTER_MODULE( "MyModule",MyModule);

不喜歡使用宏則可以:

template<typename T, typename... Args>
void registerModule(const std::string &moduleName, Args &&...args) {
    static ModuleFactory::ModuleRegisterHelper<T> helper(moduleName, std::forward<Args>(args)...);
}

注冊(cè)模塊:

registerModule<MyModuleType>("MyModule", arg1, arg2);

使用模塊

下面是一個(gè)示例,展示如何使用模塊類和模塊工廠類來創(chuàng)建和管理模塊。

// 定義一個(gè)模塊類
class MyModule : public Module {
public:
    // 自定義模塊的行為
};

// 注冊(cè)模塊
REGISTER_MODULE( "MyModule",MyModule);

int main() {
    // 使用模塊工廠創(chuàng)建模塊
    ModuleFactory &factory = ModuleFactory::getFactory();
    MyModule *module = factory.getMultiModule<MyModule>("MyModule");

    // 使用模塊
    if (module) {
        std::cout << "Created module: " << module->getModuleName() << std::endl;
    }

    return 0;
}

項(xiàng)目使用案例:

下面以虛擬商城系統(tǒng)為例,演示如何使用模塊類和模塊工廠類來創(chuàng)建虛擬商城系統(tǒng),包括購物車管理、用戶注冊(cè)和商品管理等多個(gè)模塊。

首先,創(chuàng)建購物車管理模塊:

#include "Module.h"

class ShoppingCartModule : public module::Module {
public:
    ShoppingCartModule() {
        setModuleName("ShoppingCartModule");
    }

    void execute() override {
        std::cout << "Shopping Cart Management Module executed." << std::endl;
        // 添加購物車操作
        addToCart("Product1", 10.0);
        addToCart("Product2", 15.0);
        displayCartContents();
        calculateTotal();
    }

    void addToCart(const std::string& item, double price) {
        cart.push_back(std::make_pair(item, price));
        std::cout << "Added " << item << " to the cart. Price: " << price << " USD" << std::endl;
    }

    void displayCartContents() {
        std::cout << "Cart Contents:" << std::endl;
        for (const auto& item : cart) {
            std::cout << item.first << " - " << item.second << " USD" << std::endl;
        }
    }

    void calculateTotal() {
        double total = 0.0;
        for (const auto& item : cart) {
            total += item.second;
        }
        std::cout << "Total Cart Value: " << total << " USD" << std::endl;
    }

private:
    std::vector<std::pair<std::string, double>> cart;
};

DECLARE_MODULE(ShoppingCartModule);

然后,創(chuàng)建用戶注冊(cè)模塊:

#include "Module.h"

class UserRegistrationModule : public module::Module {
public:
    UserRegistrationModule() {
        setModuleName("UserRegistrationModule");
    }

    void execute() override {
        std::cout << "User Registration Module executed." << std::endl;
        // 用戶注冊(cè)操作
        registerUser("User1");
        registerUser("User2");
        displayRegisteredUsers();
        loginUser("User1");
    }

    void registerUser(const std::string& username) {
        users.push_back(username);
        std::cout << "Registered new user: " << username << std::endl;
    }

    void displayRegisteredUsers() {
        std::cout << "Registered Users:" << std::endl;
        for (const std::string& user : users) {
            std::cout << user << std::endl;
        }
    }

    void loginUser(const std::string& username) {
        std::cout << "User " << username << " logged in." << std::endl;
    }

private:
    std::vector<std::string> users;
};

DECLARE_MODULE(UserRegistrationModule);

最后,創(chuàng)建商品管理模塊:

#include "Module.h"

class ProductManagementModule : public module::Module {
public:
    ProductManagementModule() {
        setModuleName("ProductManagementModule");
    }

    void execute() override {
        std::cout << "Product Management Module executed." << std::endl;
        // 商品管理操作
        addProduct("Product1", 10.0, 20);
        addProduct("Product2", 15.0, 15);
        displayProducts();
        showProductDetails("Product1");
    }

    void addProduct(const std::string& product, double price, int quantity) {
        products.push_back(std::make_pair(product, std::make_pair(price, quantity));
        std::cout << "Added new product: " << product << " Price: " << price << " USD Quantity: " << quantity << std::endl;
    }

    void displayProducts() {
        std::cout << "Available Products:" << std::endl;
        for (const auto& product : products) {
            std::cout << product.first << " - Price: " << product.second.first << " USD Quantity: " << product.second.second << std::endl;
        }
    }

    void showProductDetails(const std::string& product) {
        for (const auto& p : products) {
            if (p.first == product) {
                std::cout << "Product Details - " << product << ":" << std::endl;
                std::cout << "Price: " << p.second.first << " USD" << std::endl;
                std::cout << "Available Quantity: " << p.second.second << std::endl;
                return;
            }
        }
        std::cout << "Product not found: " << product << std::endl;
    }

private:
    std::vector<std::pair<std::string, std::pair<double, int>> products;
};

DECLARE_MODULE(ProductManagementModule);

最終的main函數(shù)會(huì)非常簡(jiǎn)潔:

#include "Module.h"

int main() {
    // 獲取模塊工廠實(shí)例
    module::ModuleFactory& factory = module::ModuleFactory::getFactory();

    // 獲取購物車管理模塊并執(zhí)行
   auto shoppingCartModule = factory.getMultiModule<ShoppingCartModule>("ShoppingCartModule");
    shoppingCartModule->execute();

    // 獲取用戶注冊(cè)模塊并執(zhí)行
    auto  userRegistrationModule = factory.getMultiModule<UserRegistrationModule>("UserRegistrationModule");
    userRegistrationModule->execute();

    // 獲取商品管理模塊并執(zhí)行
   auto  productManagementModule = factory.getMultiModule<ProductManagementModule>("ProductManagementModule");
    productManagementModule->execute();
    return 0;
}

結(jié)論

模塊化編程是一種強(qiáng)大的架構(gòu)方法,它使得應(yīng)用程序更容易維護(hù)、擴(kuò)展和重用。通過使用模塊類和模塊工廠類,能夠更好地管理和擴(kuò)展應(yīng)用程序的功能。模塊化編程框架不僅可以幫助架構(gòu)師構(gòu)建可擴(kuò)展的應(yīng)用程序,還可以幫助開發(fā)者編寫更具模塊性的代碼,提高代碼質(zhì)量和可維護(hù)性。

本文雖然簡(jiǎn)單,但一個(gè)大型框架同樣也是由一招一式構(gòu)成,大道至簡(jiǎn),藏拙于巧。

參考

參考文獻(xiàn): [1] Gamma, E., Helm, R., Johnson, R., & Vlissides, J. (1994). Design patterns: elements of reusable object-oriented software. Pearson Education.

[2] Martin, R. C. (2003). Agile software development, principles, patterns, and practices. Pearson Education.

[3] Fowler, M. (2018). Refactoring: improving the design of existing code. Addison-Wesley Professional.

分享到:
標(biāo)簽:架構(gòu)
用戶無頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定