[软件架构]模块化编程思想及(C++)实践

模块化思想

1.     将系统分成很多的模块,模块内部关注自身需要实现的核心业务。

2.     模块化的典型特点是:“模块间的低耦合”和“模块内的高聚合”。

模块的构成

1.     名称。全局范围内表明该模块独一无二的标识。

2.     依赖。称模块运行引用的其他模块为依赖。

3.     接口。将模块对外提供的服务称为接口。

模块的管理

1.     扫描模块列表

2.     分析模块依赖

3.     重排模块顺序

4.     初始化前准备

5.     模块的初始化

6.     模块反初始化

7.     模块最终销毁

模块化实践

#include <vector>
#include <string>
#include <functional>
using namespace std;
 
#ifndef _UNICODE
typedef std::string StdString;
#else
typedef std::wstring StdString;
#endif

定义模块结构

/**
 * 定义初始化及反初始化函数类型
 */
typedef function<void()> SelfFunction;
 
/**
 * 定义模块类型
 */
struct SelfModule
{
         /**
          * 模块的ID
          */
         StdString _id;
 
         /**
          * 模块的依赖,不同的依赖项之间用‘;‘分割
          */
         StdString _depends;
 
         /**
          * 初始化之前的操作
          */
         SelfFunction _preinit;
 
         /**
          * 初始化函数
          */
         SelfFunction _init;
 
         /**
          * 反初始化函数
          */
         SelfFunction _uninit;
};

声明模块对象

/**
 * 声明模块的定义
 */
class DefModule
{
public:
         /*
          * 构造函数
          *
          * @Param id
          *        模块的ID
          * @Param depends
          *        模块的依赖
          * @Param preinit
          *        初始化之前的操作
          * @Param init
          *        模块的初始化函数
          * @Param uninit
          *        模块的反初始化函数
          * @Param destructor
          *        模块的析构函数
          */
         DefModule(StdString id
                   , StdString depends
                   , SelfFunction preinit
                   , SelfFunction init
                   , SelfFunction uninit
                   , SelfFunction destructor);
 
         /**
          * 析构函数
          */
         ~DefModule();
 
protected:
         /**
          * 析构函数
          */
         SelfFunction _destructor;
};
 
/**
 * DefModule
 */
DefModule::DefModule(StdString id
         , StdString depends
         , SelfFunction preinit
         , SelfFunction init
         , SelfFunction uninit
         , SelfFunction destructor)
         : _destructor(destructor)
{
         SelfModuleList* list = SelfModuleList::GetInstance();
 
         size_t offset = 0;
         size_t lastOffset = offset;
         while ((offset = depends.find(‘;‘, lastOffset)) != -1)
         {
                   StdString dep = depends.substr(lastOffset, offset - lastOffset);
                  
                   SelfModule& mod = list->FindModule(dep);
                   if (&mod == &SelfModuleList::_NullModule)
                   {
                            SelfModule module;
                            module._id = dep;
                            list->AddModule(module);
                   }
 
                   lastOffset = offset + 1;
         }
 
         SelfModule& mod = list->FindModule(id);
         if (&mod != &SelfModuleList::_NullModule)
         {
                   mod._init = init;
                   mod._uninit = uninit;
                   mod._preinit = preinit;
                   mod._depends = depends;
         }
         else
         {
                   SelfModule module;
                   module._id = id;
                   module._init = init;
                   module._uninit = uninit;
                   module._preinit = preinit;
                   module._depends = depends;
                   list->AddModule(module);               
         }
}
 
DefModule::~DefModule()
{
         _destructor();
}

定义模块列表

/**
 * 模块列表
 */
class SelfModuleList
{
public:
         /**
          * 获取唯一实例
          *
          * @Return 返回全局唯一的实例
          */
         static SelfModuleList* GetInstance()
         {
                   if (_instance != NULL)
                   {
                            return _instance;
                   }
 
                   if (_instance == NULL)
                   {
                            _instance = new SelfModuleList();
                   }
 
                   return _instance;
         }
 
         /**
          * 删除唯一实例
          */
         static void DelInstance()
         {
                   if (_instance != NULL)
                   {
                            delete _instance;
                            _instance = NULL;
                   }
         }
 
public:
         /**
          * 初始化之前的操作
          */
         void PreInits()
         {
                   for (auto iter = _list.begin(); iter != _list.end(); iter++)
                   {
                            (*iter)._preinit();
                   }
         }
 
         /**
          * 初始化函数
          */
         void Inits()
         {
                   for (auto iter = _list.begin(); iter != _list.end(); iter++)
                   {
                            (*iter)._init();
                   }
         }
 
         /**
          * 反初始化函数
          */
         void Uninits()
         {
                   for (auto iter = _list.rbegin(); iter != _list.rend(); iter++)
                   {
                            (*iter)._uninit();
                   }
         }
 
         /**
          * 增加模块
          *
          * @Param mod
          *        模块
          */
         void AddModule(SelfModule mod)
         {
                   _list.push_back(mod);
         }
 
         /**
          * 查找模块
          *
          * @Param id
          *        待查找的模块的ID
          * @Return 返回查找到的模块
          */
         SelfModule& FindModule(StdString id);
 
         /**
          * 模块的空引用
          */
         static SelfModule _NullModule;
 
protected:
         /**
          * 模块列表
          */
         vector<SelfModule> _list;
 
protected:
         SelfModuleList(void) {}
         ~SelfModuleList(void) {}
 
private:
         /**
          * 全局唯一的实例
          */
         static SelfModuleList* _instance;
};
 
/**
 * 模块的空引用
 */
SelfModule SelfModuleList::_NullModule;
 
/**
 * 全局唯一的实例
 */
SelfModuleList* SelfModuleList::_instance = NULL;
 
SelfModule& SelfModuleList::FindModule(StdString id)
{
         for (auto iter = _list.begin(); iter != _list.end(); iter++)
         {
                   if ((*iter)._id.compare(id) == 0)
                   {
                            return (*iter);
                   }
         }
         return _NullModule;
}

模块列表对象

/**
 * 定义当前模块
 */
static DefModule _Module(_T("SelfModuleList")
         , _T("")
         , [](){
         }
         , [](){
         }
         , [](){
         }
         , [](){
                   SelfModuleList::DelInstance();
         });
时间: 2024-07-30 11:48:12

[软件架构]模块化编程思想及(C++)实践的相关文章

iOS-Swift 面向协议编程/组件化(模块化)编程思想

转载注明出处:http://blog.csdn.net/qxuewei/article/details/53945445 因为OC 的局限性, 使得iOS 开发组件化编程变得不可能,得益于面向对象语言的特性 (封装,继承,多态) 在我们熟悉的设计模式中渐渐形成统一的软件开发思想. 在抽取某些功能作为基类的不断运用中,代码的可移植性逐渐减弱. 就如同一棵树,从主干到各个分支,每个分支再长成细枝末叶.代码的耦合性也相应增加. 随着苹果 swift 语言的推出, 对于传统OC 语言取其精华,弃其糟粕.

「干货分享」模块化编程和maven配置实践一则

? 封面 说到模块化编程,对我个人而言首先起因于团队协作的需要,也就是组织架构结构特点来决定,而不是跟风求得自我认同,看看我们团队的组织结构: ? 其中: 基础平台部职责: 1.AI实验室:语音,图像识别算法持续优化:垂直领域不同业务场景下持续提高算法精准度指标:产出通用算法基础服务组件,为基础平台做支持. 2.基础平台组:所有非业务相关的组件的开发:如:缓存,消息,传输,数据库交互,虚拟化等通用组件:非业务相关系统的开发,如:运维平台,交换平台,门户平台,统一用户门台,监控平台等:集成深度学习

Javascript模块化编程(一)模块的写法最佳实践六、输入全局变量 独立性是模块的重要特点,模块内部最好不与程序的其他部分直接交互。 为了在模块内部调用全局变量,必须显式地将其他变量输入模块。

Javascript模块化编程,已经成为一个迫切的需求.理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块但是,Javascript不是一种模块化编程语言,它不支持类class,更遑论模块module了 随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂.网页越来越像桌面程序,需要一个团队分工协作.进度管理.单元测试等等......开发者不得不使用软件工程的方法,管理网页的业务逻辑. Javascript模块化编程,已

Javascript模块化编程(一):模块的写法

作者: 阮一峰 日期: 2012年10月26日 随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂. 网页越来越像桌面程序,需要一个团队分工协作.进度管理.单元测试等等......开发者不得不使用软件工程的方法,管理网页的业务逻辑. Javascript模块化编程,已经成为一个迫切的需求.理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. 但是,Javascript不是一种模块化编程语言,它不支持"类&qu

Javascript模块化编程

(一):模块的写法 网页越来越像桌面程序,需要一个团队分工协作.进度管理.单元测试等等......开发者不得不使用软件工程的方法,管理网页的业务逻辑. Javascript模块化编程,已经成为一个迫切的需求.理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. 但是,Javascript不是一种模块化编程语言,它不支持"类"(class),更遑论"模块"(module)了.(正在制定中的ECMAScript标准第六版,将正式支持"

js 模块化编程

Javascript模块化编程(一):模块的写法 作者: 阮一峰 日期: 2012年10月26日 随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂. 网页越来越像桌面程序,需要一个团队分工协作.进度管理.单元测试等等......开发者不得不使用软件工程的方法,管理网页的业务逻辑. Javascript模块化编程,已经成为一个迫切的需求.理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. 但是,Javascript不

Javascript模块化编程(一):模块的写法(转)

随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂. 网页越来越像桌面程序,需要一个团队分工协作.进度管理.单元测试等等......开发者不得不使用软件工程的方法,管理网页的业务逻辑. Javascript模块化编程,已经成为一个迫切的需求.理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. 但是,Javascript不是一种模块化编程语言,它不支持"类"(class),更遑论"模块&q

Javascript模块化编程(一):模块的写法 作者: 阮一峰

声明:转载自阮一峰的网络日志 随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂. 网页越来越像桌面程序,需要一个团队分工协作.进度管理.单元测试等等......开发者不得不使用软件工程的方法,管理网页的业务逻辑. Javascript模块化编程,已经成为一个迫切的需求.理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. 但是,Javascript不是一种模块化编程语言,它不支持"类"(class

js模块化编程(一):模块的写法

转自 ruanyifeng 系列目录: Javascript模块化编程(一):模块的写法 Javascript模块化编程(二):AMD规范 Javascript模块化编程(三):Require.js的用法 随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂.网页越来越像桌面程序,需要一个团队分工协作.进度管理.单元测试等等......开发者不得不使用软件工程的方法,管理网页的业务逻辑.Javascript模块化编程,已经成为一个迫切的需求.理想