C++ 大规模程序设计 之 包

来源:互联网 发布:linux和windows哪个好 编辑:程序博客网 时间:2024/06/05 05:16

概述

包是将相关组件的集合聚集为一个逻辑上内聚的物理单位。它是一个自顶向下设计的自然结果,充当了体系结构设计者的一个抽象和开发者的一个分区。

包通常指一个非循环的,层次化的组件集合,这些组件有共同的语义化的目标。 物理上包由一个头文件的集合和一个包含相应目标文件(.o)的库文件组成。

包之间也会存在依赖,例如 包A中的某个组件依赖于包B,则隐含着包A依赖于包B。

包有自己的前缀,前缀的使用分隔了全局名称空间,避免了集成时的冲突。

名字空间是另一个控制名称冲突的手段,它希望解决的问题是不同供应商提供了兼容的库,但没有中央权限可以控制注册前缀,此时全局变量有可能冲突的问题。它与前缀是两种不同的手段,一般是不会相互替代的。

包前缀:主要是针对公司内部开发的库,对前缀名称可以控制。
名字空间:主要是针对使用第三方公司开发的库,没法控制其前缀名称时的一种解决手段。


包的层次化

让包层次化主要避免的也是包循环依赖的问题。

循环依赖会导致的问题
1) 开发: 程序结构清晰,不会导致系统连接无用的组件,降低效率。

2) 推广: 系统不会因循环依赖导致引入无用的附加组件。

3) 易用性: 用户使用包做开发时,也不会引入无用的组件连接。

4) 可靠性: 有循环依赖关系的系统不利于测试。

包层次化技术

包层次化技术与组件的层次化技术类似。
可以采用上升下降方式。
系统中由于 B1->A2 A1->B2的依赖关系导致了包的相互依赖。
这里写图片描述

此时可以将A1 B1上升,把A2 B2 下降形成新的包从而解除包的依赖关系。
这里写图片描述

这里通过一升一降,形成了一个新包C,从而解除了包A 与 包B之间的循环依赖。


包的发布

包发布的目录结构可以参考下面的方式。
发布的内容包括,依赖的文件,源码,头文件,和目标文件。
这里写图片描述


包的使用

大型系统中通常没有单个的系统可运行程序,我们可以为局部的子系统创建main函数,来初始化环境,对局部的模块进行测试。

在测试或使用包时,如果系统较大,初始化会花费较长时间,此时可以采用不同的初始化策略。

  • 唤醒初始化 : 对于静态的基本数据类型,可以在装载时被初始化。
  • 显示的init函数:为模块定义init函数,优点比较灵活,缺点是使用过程中容易出错。
  • 灵巧计数器:为类创建一个计数器,当新增一个对象时,计数器加1,当释放一个对象时,计数器减1。
  • 每次检查:相当于即时初始化,每次创建后检查,并使用。
0 0
原创粉丝点击