类与包
Posted Virtual_Func
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类与包相关的知识,希望对你有一定的参考价值。
包的划分原则:
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, 则该包距离主序列最远,此时包的抽象性(灵活性)与稳定性之间关系最差
以上是关于类与包的主要内容,如果未能解决你的问题,请参考以下文章