[软件架构]模块化编程思想及(C++)实践
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++)实践的更多相关文章
- 「干货分享」模块化编程和maven配置实践一则
封面 说到模块化编程,对我个人而言首先起因于团队协作的需要,也就是组织架构结构特点来决定,而不是跟风求得自我认同,看看我们团队的组织结构: 其中: 基础平台部职责: 1.AI实验室:语音,图像 ...
- javascript模块化编程思想、实现与规范
随着BS架构的发展,网站逐渐变成了互联网应用程序,嵌入网络的JavaScript代码越来越庞大,越来越复杂(业务逻辑处理或用户交互很多写在前端).网页越来越像桌面程序,需要一个团队分工协作.进度管理. ...
- 第五篇,理解JS模块化编程思想
模块化编程 ·模块化编程是一种处理复杂系统分解成更好的可管理模块的方式,它可以把系统代码划分为职责单一高度解耦切可替代的模块. ·系统中某一部分的变化将如何影响其他部分就会变得显而易见,系统的可维护性 ...
- Javascript模块化编程(一)模块的写法最佳实践六、输入全局变量 独立性是模块的重要特点,模块内部最好不与程序的其他部分直接交互。 为了在模块内部调用全局变量,必须显式地将其他变量输入模块。
Javascript模块化编程,已经成为一个迫切的需求.理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块但是,Javascript不是一种模块化编程语言,它不支持类clas ...
- Javascript模块化编程(一)模块的写法最佳实践
Javascript模块化编程,已经成为一个迫切的需求.理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块但是,Javascript不是一种模块化编程语言,它不支持类clas ...
- Javascript模块化编程(一):模块的写法
Javascript模块化编程(一):模块的写法 作者: 阮一峰 原文链接:http://www.ruanyifeng.com/blog/2012/10/javascript_module.html ...
- Javascript模块化编程(一):模块的写法(转)
随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂. 网页越来越像桌面程序,需要一个团队分工协作.进度管理.单元测试等等......开发者 ...
- js 模块化编程
Javascript模块化编程(一):模块的写法 作者: 阮一峰 日期: 2012年10月26日 随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞 ...
- Javascript模块化编程(一):模块的写法 作者: 阮一峰
声明:转载自阮一峰的网络日志 随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂. 网页越来越像桌面程序,需要一个团队分工协作.进度管理. ...
随机推荐
- 0525 Scrum 项目 7.0
Sprint回顾 让我们一次比一次做得更好. 1.回顾组织 主题:“我们怎样才能在下个sprint中做的更好?” 时间:设定为1至2个小时. 参与者:整个团队. 场所:能够在不受干扰的情况下讨论. ...
- Code First Migrations 数据迁移小记
用了codefirst后一个很大的问题就是代码中的属性字段与数据库中表的同步问题,删掉数据库重新生成当然可以解决,不过数据就丢失了(当然通过代码中初始化数据库添加数据也可以解决,初始化的任务可以通过重 ...
- Java EE : 三、图解Session(会话)
目录 Java EE : 一.图解Http协议 Java EE : 二.图解 Cookie(小甜饼) Java EE : 三.图解Session(会话) 概述 一.Session由来 二.Sessio ...
- CentOS_7.2安装MySQL_5.7
一.安装依赖包和开发工具: yum install vim vim-enhanced wget zip unzip telnet ntsysv compat* apr* nasm* gcc gcc* ...
- interface
接口的简单案例: 接口 就是一种规范 其目的主要是为了约束和解耦 public class Test { public static void main(String[] args){ Compute ...
- YCSB-压测
安装 wget http://download.oracle.com/otn-pub/java/jdk/7u40-b43/jdk-7u40-linux-x64.rpm #注意此处到官网下载后上传,需要 ...
- JS 跳转页面 在新的选项卡打开
function going(url) { var a = $("<a href='" + url + "' target='_blank'>Apple< ...
- sql基础语句
1.创建数据库 create database 数据库名称 2.删除数据库 drop database 数据库名称 3.备份sql server 创建备份数据的device use master e ...
- 不经过 App store 的安装方式(转)
所有安装到真机(非越狱)的应用(可以是 .app ,也可以是 .ipa ,只要编译时选的是编译成 Arm 的就好..app 转 .ipa 只需要一条命令) 都必须经过证书签名.证书主要有三大种: 企业 ...
- iframe用法总结
<iframe>是框架的一种形式,也比较常用到. 例子1. <iframe width=420 height=330 frameborder=0 scrolling=auto src ...