定义与作用
- 包是一组类的容器。通过把类组织成包,我们可以在更高层次的抽象上理解设计。
- 我们也可以通过包来管理软件的开发和发布。
- 类会和其他包的类存在依赖,跨越包的边界,从而使包之间产生了依赖关系。
设计原则
重用发布等价原则(REP)
- 重用的粒度就是发布的粒度。
- 重用类库时,我们要求作者维护代码,同时在接口和功能改变时通知我们(同时我们有拒绝改变的权利)。
- 重用性的包应该只包含以重用性为目的而设计的类。相反,非重用性的包只包含以非重用性为目的而设计的类。
共同重用原则(CRP)
- 趋向于共同重用的类应该属于同一个包。
- 如果依赖于一个包,那么应该依赖于该包中的所有类.否则将要进行不必要的重新验证和发布(当不依赖的部分变化时)。
- 相互之间没有紧密联系的类不应该在同一包内。
共同封闭原则(CCP)
- 包中的所有类对于同一类性质的变化应该是共同封闭的。即一个变化若对一个包产生影响,则将对包中的所有类产生影响,而对于其他的包不会造成任何影响。
- 一个包不应该包含多个引起变化的原因(SRP的包规定)。
- 通常,可维护性是重于可重用性的。应该将可能由于同样的原因而更改的类共同聚集在一个包内。
以上的三个原则,主要关注包的内聚性原则的。该原则主要作用是指导我们如何把不同的类划分到同一个包。通常我们选择包中的类时,要考虑可重用性与可开发性之间的反作用力。
无环依赖原则(ADP)
- 包的依赖关系图中不允许出现环。
- 包设计时应该尽量避免出现依赖环。
- 使用DIP。
- 增加新包。
稳定依赖原则(SDP)
- 朝着稳定的方向进行依赖。
- 为了可维护性,易变性是必须的。对某些变化敏感的包,可以设计成可变的。
- 对于一个期待可变的包,不应该让一个难以更改的包依赖于它。否则,它也会变成不可变的。
- 软件的反常特性:对于一个易变的包,创建一个对它的依赖就可以使其变得难以更改。
稳定抽象原则(SAP)
- 包的抽象程度应该和其稳定程度一致。
- 一个稳定的包应该是抽象的,这样稳定性不会使其无法扩展。
- 一个不稳定的包应该是具体的,不稳定性使其内部的具体代码易于更改。
- SAP+SDP构成了包的DIP原则。依赖应该朝着稳定的方向进行+稳定性意味着抽象性=>依赖应该朝着抽象的方向进行。
- 包的灰度:允许包是部份抽象,部份稳定。
- 包抽象性度量:抽象类的数目/类的总和。A=a/c
以上上三个原则,主要关注包的耦合性原则的。该原则主要帮助我们确定包与包之间的相互关系。