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. jq点击小图 弹出大图(更新版)

    $(function(){ $(".fj1-consult").on("click",function(){ //设置弹框中图片的路径 $(".lay ...

  2. 记一次使用jQuery清空元素

    缘由: 数据量比较大,分页显示,页码是自己写的,动态创建页码,创建元素时会绑定元素的click事件,每次显示五个页码(1,2,3,4,5),点击2—4不换,点5,页码变成3,4,5,6,7. 遇到的问 ...

  3. Java中值传递和引用传递的概念

    很多书中都提到了在Java中只存在值传递,但是今天在一个NanoHTTPD的源码中看到这样一段: if (qmi >= 0) { decodeParms(uri.substring(qmi + ...

  4. ef join 用法

    var customers = DB.Customer.Join(DB.Commission, cst => cst.CommissionId,                          ...

  5. 限制textarea输入内容长度(多浏览器兼容、鼠标操作可控)

    限制textarea的输入内容长度,当从键盘输入,内容长度达到最大值时,只有输入Backspace.Delete.左移动.右移动有效,当用鼠标粘贴内容,则只保留最大值长度的内容.从而控制textare ...

  6. Calculator(补)

    MyGitHub 刚刚开始时确实是连题目都看不懂= =,从第二行的新建类开始,就不知题目所云.所以我的困难比很多同学都要 开始得早一些--从题目第二行开始. 准确的说,当我按照题目要求新建了一个sca ...

  7. window.location.href无法跳转的解决办法

    -------------------接收别人做的SSO单点登录项目,无源码,只是点击登出按钮一直不跳转. 原因是: <a href="javascript:;" oncli ...

  8. RPN-逆波兰计算器-中缀表达式转后缀表达式-javascript

    1.利用栈(Stack)来存储操作数和操作符: 2.包含中缀表达式转后缀表达式的函数,这个是难点,也是关键点: 2.1.将输入字符串转为数组: 2.2.对转换来的字符进行遍历:创建一个数组,用来给存储 ...

  9. nRF24L01芯片控制——迈向无线的第一步

    nRF24L01芯片是一款专供单片机的射频收发芯片.工作于2.4GHz~2.5GHz ISM频段.融合了shockburst技术. 我先列出该芯片的硬件参数资料: 至于每个引脚的具体用途,可以参见技术 ...

  10. ros科大讯飞语音识别

    转自http://www.ncnynl.com/archives/201611/1069.html ROS入门教程-编写科大讯飞语音SDK的ROS包 说明 ROS软件包xfei_asr是集成自科大讯飞 ...