一.背景
1.项目组原来使用的是c++builder进行开发;
2.有自己一套的控件(包括表格, 打印, 和其它小控件);
3.整个项目就只有一个工程, 即编译后的可执行文件, 大小约为15M;
4.由于上头的压力, 项目一般都没有按照完整的开发流程展开, 而是讨论完需求后, 即开始分模块编码(模块一般比较固定);
5.后期的错误比较多
二.问题
1.编译速度太慢: 往往重新编译一次需要3小时, 严重的影响了开发进度;
2.错误比较难查: 某些模块的错误会引起其它模块的出错;
3.程序员分工不明确: 虽然指定了程序员负责某些模块, 但有些共用的文件形成了灰色地带, 不知道谁负责;
三.思路
分包. 按照功能模块把原来的大的工程进行拆分. 拆分后, 实现以下目标:
1.每个包都实现一个模块的功能;
2.每个包由指定程序员来负责;
3.每个包的错误不允许出包外;
4.每个包的修改不会导致其它包的重新编译;
四.实现
1.拆分情况: 将工程拆分为主界面包, 共用包, 系统维护包, 权限包, 基础资料包, 单据包, 生产包, 项目管理包, 客户关系包, 办公管理包, 报表包, 自定义报表包, 数据中心包,凭证包, 固定资产包, 工资包.
2.通信实现:
a. 除共用包外, 其它的每个包都向外公布两个接口: xxxLoad(), xxxUnload().
b.主界面包启动后会装载各个包. 装载时会自动调用每个包的xxxLoad()函数. 退出程序时, 主界面包会卸载各个包, 卸载时, 会自动调用每个包的xxxUnload()函数.
c.共用包中, 有一数组, 记录了各个包已经注册的提供给别的包调用的接口.
d.每个包的xxxLoad()函数中要实现本包的初始化, 及对提供给别的包调用的接口进行注册.
e.若某包需要调用其它包的接口, 则向共用包提出要求:我要执行xxx接口. 共用包查找接口数组, 若发现此接口已经注册, 则将此要求转给指定的包.
1.项目组原来使用的是c++builder进行开发;
2.有自己一套的控件(包括表格, 打印, 和其它小控件);
3.整个项目就只有一个工程, 即编译后的可执行文件, 大小约为15M;
4.由于上头的压力, 项目一般都没有按照完整的开发流程展开, 而是讨论完需求后, 即开始分模块编码(模块一般比较固定);
5.后期的错误比较多
二.问题
1.编译速度太慢: 往往重新编译一次需要3小时, 严重的影响了开发进度;
2.错误比较难查: 某些模块的错误会引起其它模块的出错;
3.程序员分工不明确: 虽然指定了程序员负责某些模块, 但有些共用的文件形成了灰色地带, 不知道谁负责;
三.思路
分包. 按照功能模块把原来的大的工程进行拆分. 拆分后, 实现以下目标:
1.每个包都实现一个模块的功能;
2.每个包由指定程序员来负责;
3.每个包的错误不允许出包外;
4.每个包的修改不会导致其它包的重新编译;
四.实现
1.拆分情况: 将工程拆分为主界面包, 共用包, 系统维护包, 权限包, 基础资料包, 单据包, 生产包, 项目管理包, 客户关系包, 办公管理包, 报表包, 自定义报表包, 数据中心包,凭证包, 固定资产包, 工资包.
2.通信实现:
a. 除共用包外, 其它的每个包都向外公布两个接口: xxxLoad(), xxxUnload().
b.主界面包启动后会装载各个包. 装载时会自动调用每个包的xxxLoad()函数. 退出程序时, 主界面包会卸载各个包, 卸载时, 会自动调用每个包的xxxUnload()函数.
c.共用包中, 有一数组, 记录了各个包已经注册的提供给别的包调用的接口.
d.每个包的xxxLoad()函数中要实现本包的初始化, 及对提供给别的包调用的接口进行注册.
e.若某包需要调用其它包的接口, 则向共用包提出要求:我要执行xxx接口. 共用包查找接口数组, 若发现此接口已经注册, 则将此要求转给指定的包.