类与包

包的划分原则:

1. 重用发布等价原则:重用的粒度就是发布的粒度

个人理解:一个包中的类要么全都是可重用的,要么全都是不可重用的。


2. 共同重用原则:如果重用了包中的一个类,那么就要重用保重的所有类。

个人理解:当确信依赖于一个包时,将依赖于那个包中的每一个类。


3. 共同封闭原则:一个变化若对一个包产生影响,则将对该包中的所有类产生影响,而对其他的包不造成任何影响。

个人理解:单一职责原则对于包问题的重新翻译。也即是每个包将仅有一个使其产生变动的因素。


包的依赖关系中存在依赖环时的解决方法:

1. 依赖倒置原则。

描述:类A依赖于类B → 为类 A 提出一个抽象接口 X,此时类 A 仅依赖于接口 X,类 B 继承并实现接口 X 类


2. 抽取出一个新的包,该包包含了当前环中两个包共同依赖的类。

描述:包A依赖于包B,包B依赖于包A,则将 A, B包中互相依赖于对方的类抽出来,放在包C中,此时  包A , B 都将仅依赖于包C


稳定依赖原则

原则:包之间应该朝着稳定的方向进行依赖。一个模块只能依赖于比它本身更稳定的模块。

稳定性:包发生更改的代价越大,则包越稳定。若依赖于该包的模块越多,同时该包所依赖的模块越少,这个包越稳定。

稳定性度量:

(Ca)输入耦合度:处于该包外部,并依赖于该包内的类的类的数目(被依赖的数目)

(Ce)输出耦合度:处于该包内部,并依赖于该包外的类的类的数目(依赖别人的数目)

不稳定性 I = Ce / (Ca  + Ce)

当 I 越大,则包越不稳定。

当 I = 1,则 Ca = 0, 此时该包没有被任何其他包依赖,同时该包还依赖于别的包,此时包的稳定性最差。(一堆更改源,同时更改该包没有影响别的 包)

当 I = 0,则 Ce = 0, 此时该包被其他包依赖,同时该包并不依赖于别的包,此时包的稳定性最高。(没有更改源,且该包引起更改受影响的包多)

结论:I度量值应该顺着依赖的方向减少(稳定性增加,越处于依赖关系底层的包应该越稳定)


稳定抽象原则

原则:包的抽象程度应与其稳定程度一致

个人理解:一个包若是稳定且具体,则这个包是一个很不灵活的包,通常是写死的包,如C++ 库中的 string 类等,我们通常不希望产生这样的包。所以会希望稳定的包具有抽象性,此时就能使得包具有一定的灵活性。

最佳需求:稳定且抽象的包(具有高灵活性,位于设计底层),易变且具体的包(位于设计顶层)

抽象性度量:

(Nc)——包中类的总数目

(Na)——包中抽象类的数目(抽象类:不能被实例化的纯虚类)

抽象性 A = Na / Nc

当 A = 1, 则包抽象程度最高,每个类都是抽象类

当 A = 0, 则包抽象程度最低,包中每个类都是具体类


包在稳定性与灵活性之间的权衡

目标需求:高稳定性且高抽象性(I = 0, A = 1),低稳定性且高具体性(I = 1, A = 0)。

包的理想目标:位于从(I = 0, A = 1)到(I = 1, A = 0)所在的直线上,该直线称为:主序列。

痛苦区域(位于A = 0, I = 0 附近):此处的包是稳定且具体的包,通常很难更新该区域内的包。

无用区域(位于A = 1, I = 1 附近):此处的包最不稳定且抽象,既不稳定同时还是个抽象类的包是没有用的包。

衡量包的性能:包的稳定性度量与抽象性度量值所在的坐标点离主序列的距离。 D = |A + I - 1|

若 D = 0, 则该包落在主序列上,此时包的抽象性(灵活性)与稳定性之间较为平衡

若 D = 1, 则该包距离主序列最远,此时包的抽象性(灵活性)与稳定性之间关系最差

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值