您的位置:首页 > 其它

包的设计原则

2013-12-12 15:10 204 查看
包的设计.

通过把类组织成package,可以在更高层次的抽象上理解设计.通过包来管理软件的开发和发布.

由于类之间的相互依赖关系,包之间会产生依赖关系.包的依赖关系展示了APP的高层组织结构.

粒度:内聚性."自顶向上"的将类划分到包中

Reuse-Release Equivalence Priciple(REP).

重用的粒度就是发布的粒度.

重用类库时,我们要求author维护Code,同时在接口和功能改变时通知我们(同时我们有拒绝改变的权利).

重用性必须基于包,可重用的包必须包含可重用的类.包中的所有类应该对于同一类用户来说都是可重用的.

Common-Reuse Principle(CRP)

趋向于共同重用的类应该属于同一个包.

如果依赖于一个包,那么应该依赖于该包中的所有类.否则将要进行不必要的重新验证和发布(当不依赖的部分变化时).

相互之间没有紧密联系的类不应该在同一包内.

Common-Closure Principle(CCP)

一个包不应该包含多个引起变化的原因(SRP的包规定).

通常,可维护性是重于可重用性的.应该将可能由于同样的原因而更改的类共同聚集在一个包内.

选择包中的类时,要考虑可重用性与可开发性之间的反作用力.

稳定性:耦合性.

Acyclic-Dependencies Principle(ADP)

包的依赖关系图中不允许出现环.

Weekly Build.

用于中等规模项目,平时在私有拷贝上Code.周五Build.但是之后,为了保持效率,就必须要不断地延长构建周期.

Eliminating Dependency Cycles

把开发环境划分成可发布的包.分别开发各个包.以小规模增量的方式进行集成.

包依赖关系图中环依赖造成影响

环上的所有包会共同组成一个大包,彼此之间的发布要完全一致.

测试一个包时需要引入和编译的包的数量会增长.使用UT可以提现.

存在环时,很难确定包构建的顺序.

解除依赖环



抖动:Jitters.

随着APP的增长,包的依赖关系结构会抖动(需求更改时)和増长(新增Package).

自顶向下的设计

包的依赖关系不能描绘APP的功能.它只是APP可构建性的映射图.

开始时,不设计包的结构.包结构是随着系统的增长,变化而逐步演化的.

当类越来越多时,开始关注CCP,将可能会一同变化的类放在一个包中.

之后,使用CRP来知道可重用元素的包组合.

最后,当环出现时,使用ADP.从而会导致包的抖动.

包的依赖关系是和系统的逻辑设计一起增长和演化的.

Stable-Dependencies Principle(SDP)

朝着稳定的方向进行依赖.

为了可维护性,易变性是必须的.对某些变化敏感的包,可以设计成可变的

对于一个期待可变的包,不应该让一个难以更改的包依赖于它.否则,它也会变成不可变的.

软件的反常特性:对于一个易变的包,创建一个对它的依赖就可以使其变得难以更改.

Stability

稳定性和更改所需的工作量有关.



稳定性度量

输入耦合度(A:外部依赖于内部),输出耦合度(E). 不稳定性(I). I= E/(A+E).

[0,1].0代表具有最大的稳定度.

一个包的I值应该大于它所依赖的包的I值.I顺着依赖的方向减小.

并非所有的包都应该是稳定的.



应该把封装系统高层设计的软件放入稳定的包中(I=0).

同时,为了让其有灵活性,经受得起变化.使用抽象类.

Stable-Abstraction Principle(SAP)

包的抽象程度应该和其稳定程度一致.

一个稳定的包应该是抽象的,这样稳定性不会使其无法扩展.

一个不稳定的包应该是具体的,不稳定性使其内部的具体代码易于更改.

SAP+SDP构成了包的DIP原则.依赖应该朝着稳定的方向进行+稳定性意味着抽象性=>依赖应该朝着抽象的方向进行.

包的灰度(shades of grey):允许包是部分抽象,部分稳定的.

包抽象性度量:A=a/c.抽象类的数目/类的总数.



Pain区域

DB Schema.很高的易变性,同时非常具体,高度被依赖.所以APP和DB之间的接口很难定义.对DB Schema的更新很痛苦.

工具库.string.

[Agile Software Development(Principles,Patterns,and Pracitices)]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: