C++ 大规模程序设计 之 物理层次结构

来源:互联网 发布:xbmc使用教程网络硬盘 编辑:程序博客网 时间:2024/06/05 00:41

在系统中物理组件间必然会存在着各种各样的联系(DependOn 关系)。良好的设计应该是接口短小,易于理解,易于使用和易于测试的。理清物理层次结构对于设计良好的系统是很有帮助的。


易测试性设计

质量设计的一个重要部分是易测试性设计,如果一个组件设计良好,那么用它构造测试用例也是比较容易的,同样它的易用性对于用户来说也是很好的,很多时候测试用例和用户使用的场景是一致的。这个和极限编程中测试驱动的想法是一致的。由使用倒逼设计。

规则 1:对整个系统的层次结构进行分布测试比只在上层测试要有效的多。

如果层次定义的清晰,那么测试起来会很方便,而且测试用例的构造也会非常的合理。如果发现分层次结构测试时构造测试用例很困难,或者很难划分清晰的层次,恐怕物理结构的设计已经出现了问题。

规则 2:隔离测试

也可以理解成一种独立的测试,针对每个模块的独立测试目的是为了降低集成测试时的风险。隔离测试可以确保单个组件的有效性。同时也是检查组件间依赖设计的好坏的一种方式。如果要单独执行某个组件还要依赖好多其他的组件,隔离起来有点困难,那么可能要重新考虑一下组件或子系统的设计了。

规则 3:非循环物理依赖

循环依赖,组件间的相互依赖。

这里写图片描述

非循环依赖的好处是可以更容易的进行测试。有循环依赖甚至很难确定测试的顺序。循环依赖更大问题是限制了组件的重用,增加理解和使用的成本。

要想解决循环依赖,可以考虑两个方面:一,重新打包,解开循环链。二,将循环依赖的两个或多个组件组成一个新的组件。


层次化和层次号

层次号是把组件划分层次的一种方式。用层次号的方法可以很简单的查找出系统中是否有

每一个有向非循环图都可以被赋予唯一的层次号,循环图则不能。可以被赋予唯一层次号的物理依赖图被称为可层次化的。

图中包含了没有循环依赖和有循环依赖的情况
这里写图片描述

在右边的图中有循环依赖,此时组件C的层次号是3还是4呢,无法确定了。

层次化清晰的组件关系可以为设计,测试,复用提供清晰的脉络,在迷宫一样的大型系统中有一份清晰的地图会是一件很美好的事。


累积组件依赖与组件设计质量

累积组件依赖(Cumulative Component Dependency)

它是一种数字表达方式,表示维护和测试一个子系统需要的开销。

定义:在一个子系统内所有组件Ci之上,对每个组件Ci增量式测试时所需要的组件数量进行求和。

计算CCD举例:
这里写图片描述

从图中可以看出,同样是3个组件,如果循环依赖时它的CCD=9,但是树状的话CCD=5,差别还是很明显的。

有了描述机制,就可以用它来量化的组件的物理设计了。有了量化就可以进行优化。

但就一个系统来说,它的可能有不同好多种优化方式,但什么是好的标准呢。

一个衡量方式:NCCD(标准累加组件依赖)

包含N个组件子系统的CCD值与相同系统树形大小的CCD的值做比较

这里写图片描述

这里写图片描述

以图中3中设计依赖为例,套用公式,

这里写图片描述

这里写图片描述

NCCD(垂直依赖) = 6/5 = 1.2

NCCD(循环依赖) = 9/5 = 1.4

NCCD(树形依赖) = 5/5 = 1


如果NCCD < 1 可以认为系统是比较水平化且松耦合的,便于复用。

如果NCCD > 1 则系统中存在着比较垂直的依赖,或紧耦合。

如果NCCD 远远大于 1,则系统中存在着明显的循环依赖。

NCCD为系统提供了一个量化指标,如果要实现一个好的系统,还需要不断的思考和设计。

0 0