Repost

内容简介:

模块化思想

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 = ;
size_t lastOffset = offset;
while ((offset = depends.find(';', lastOffset)) != -)
{
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 + ;
} 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) == )
{
return (*iter);
}
}
return _NullModule;
}

模块列表对象

/**
* 定义当前模块
*/
static DefModule _Module(_T("SelfModuleList")
, _T("")
, [](){
}
, [](){
}
, [](){
}
, [](){
SelfModuleList::DelInstance();
});

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

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

    ​ 封面 说到模块化编程,对我个人而言首先起因于团队协作的需要,也就是组织架构结构特点来决定,而不是跟风求得自我认同,看看我们团队的组织结构: ​ 其中: 基础平台部职责: 1.AI实验室:语音,图像 ...

  2. javascript模块化编程思想、实现与规范

    随着BS架构的发展,网站逐渐变成了互联网应用程序,嵌入网络的JavaScript代码越来越庞大,越来越复杂(业务逻辑处理或用户交互很多写在前端).网页越来越像桌面程序,需要一个团队分工协作.进度管理. ...

  3. 第五篇,理解JS模块化编程思想

    模块化编程 ·模块化编程是一种处理复杂系统分解成更好的可管理模块的方式,它可以把系统代码划分为职责单一高度解耦切可替代的模块. ·系统中某一部分的变化将如何影响其他部分就会变得显而易见,系统的可维护性 ...

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

    Javascript模块化编程,已经成为一个迫切的需求.理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块但是,Javascript不是一种模块化编程语言,它不支持类clas ...

  5. Javascript模块化编程(一)模块的写法最佳实践

    Javascript模块化编程,已经成为一个迫切的需求.理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块但是,Javascript不是一种模块化编程语言,它不支持类clas ...

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

    Javascript模块化编程(一):模块的写法 作者: 阮一峰 原文链接:http://www.ruanyifeng.com/blog/2012/10/javascript_module.html ...

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

    随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂. 网页越来越像桌面程序,需要一个团队分工协作.进度管理.单元测试等等......开发者 ...

  8. js 模块化编程

    Javascript模块化编程(一):模块的写法   作者: 阮一峰 日期: 2012年10月26日 随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞 ...

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

    声明:转载自阮一峰的网络日志 随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂. 网页越来越像桌面程序,需要一个团队分工协作.进度管理. ...

随机推荐

  1. Unity中Time.deltaTime的含义及其应用

    The time in scenes it took to complete the last frame.这是使用此函数的时候给出的提示 一般我们会在设置速度的时候看到这个函数.先写出我对Time. ...

  2. 将windows上的文件同步到linux上

    1.首先下载PSCP.exe,下载地址:http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html 2.将PSCP.exe拷贝到C: ...

  3. C# in depth学习(1)

    第一章,C#开发的进化史 1.简单数据类型 2.排序 Sorting an ArrayList using IComparer (C# 1) Sorting a List<Product> ...

  4. C++变量初始化问题

    初始化和赋值的区别 在C++中,变量初始化和赋值操作符是两个完全不同的概念. 初始化不是赋值,初始化的含义是创建变量分配存储空间时为其赋一个初始值,而赋值的含义是把内存空间的当前值擦除,用一个新值代替 ...

  5. React + Redux 入坑指南

    Redux 原理 1. 单一数据源 all states ==>Store 随着组件的复杂度上升(包括交互逻辑和业务逻辑),数据来源逐渐混乱,导致组件内部数据调用十分复杂,会产生数据冗余或者混用 ...

  6. Python学习06——列表的操作(2)

    笨办法学Python第39节 之前用的第三版的书,昨天发现内容不对,八块腹肌又给我下了第四版,这次的内容才对上.本节的代码如下: ten_things = "Apples Oranges C ...

  7. classpath路径和properties

    在Java程序中,一般情况下使用绝对路径还是相对路径都不太合适,因为Java程序的jar包所放的位置不确定,执行java程序时当前的路径也不确定,所以不合适.一般在Java程序中我们会把资源放到cla ...

  8. 场景5 Performance Management

    场景5 Performance Management 性能调优(不能重启数据库) 索引 资源管理器 性能优化 统计分析 SQL性能分析 SPM (SQL执行计划管理) 堆表 :数据存储无序 位图索引 ...

  9. linux命令每日一练习 wc more

    wc该命令统计文件行数,字数或者字节数 wc -l 统计行数 wc -w 统计字数 wc -c 统计字节数 more 显示文件内容,类似于cat more +n 从第n行开始显示 more -n 限定 ...

  10. [转]查看Flash Log输出

    1.安装Debug版本的FlashPlayer 2.mm.cfg配置文件 xp:C:\Documents and Settings\username\mm.cfg Vista/7: C:\users\ ...