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. 用python爬取QQ空间

    好久没写博文了,最近捣鼓了一下python,好像有点上瘾了,感觉python比js厉害好多,但是接触不久,只看了<[大家网]Python基础教程(第2版)[www.TopSage.com]> ...

  2. java使用代理 html2canvas 截屏 将页面内容生成图片

    1.html2canvas 生成图片简单又好用,但涉及到跨域就会出现问题,官方给出的解决办法是设置代理.基本原理就是在后端将图片的数据生成base64再返回给前端使用.使canvas画布分析元素的时候 ...

  3. 小tip:关于typeof,instanceof,toString(),valueOf(),toLocaleString(),join(),reverse(),sort(),pop(),push(),shift(),unshift()

    typeof:用于检测一个变量是否是基本数据类型.instanceof用于检测某引用对象是什么类型的对象. var s = "Nicho"; var b = true; var n ...

  4. SASS的安装及使用(前提:安装Ruby)

    本文仅适用于Windows系统. 一.安装Ruby Sass是用Ruby语言写的,但是两者的语法没有关系,所以学 Sass 不用学 Ruby,只是必须先安装Ruby,然后再安装Sass. Linux和 ...

  5. js获取当前日期的前一天、一月、一年的日期 明天、后天(转)

    function getYestoday(date){ var yesterday_milliseconds=date.getTime()-1000*60*60*24; var yesterday = ...

  6. spring.net 配置文件需要注意换行问题

    今天在做Spring.NET Demo时写配置文件写ObjectNames 节点的Value成这样 <object id="ProxyCreator" type=" ...

  7. IIS部署WCF网站服务步骤

    一开始在“管理工具”下找不到IIS的快捷方式,是因为系统默认未打开IIS功能,所以首先打开IIS功能: 为避免出现未知的麻烦,建议将IIS下的所有项都勾上: 创建IIS桌面快捷方式: 添加网站托管: ...

  8. 关于rem的学习

    网页常见单位px.em.rem:其中rem是css3新出的单位,官网是这样定义的:“font size of the root element”,意思是:相对长度单位,相对于根元素(即html元素)f ...

  9. Tableau修改参考线上显示的标签

    修改Tableau中参考线上的标签显示内容,如下图所示:可根据自定义调整

  10. EF6 CodeFirst+Repository+Ninject+MVC4+EasyUI实践(一)

    前言 本系列源自对EF6 CodeFirst的探索,但后来发现在自己项目中构建的时候遇到了一些问题以及一些解决方法,因此想作为一个系列写下来. 本系列并不是教你怎么做架构设计,但可以参照一下里面的方法 ...