一、包的内聚性三原则:
原则用途:用来指导软件开发者如何将类合理的划分到相应的包中。 前提条件:我们已经设计好了一些类,并且它们之间的相互关系也基本明确。由此可见,类的设计先于包的设计,实际开发中我们确实是采用“自底向上”的方式设计和规划包的。
(1)重用发布等价原则 REP(Reuse-Release Equivalence Principles)
任何一个开发者都知道,我们对源代码的重用必须是基于包的,如果那个人说某个单独的类可以重用,那完全是外行人说的。 可重用的包必须包含可重用的类。(2)共同重用原则 CRP(Common-Reuse Principle)
共同重用的类应该同属于一个包,也就是说一组功能相关的类或一组强耦合的类如果它们具有重用性,则它们应该存在于通一个包中。 例:容器类以及与它关联的迭代器类。这些类彼此之间紧密耦合在一起,因此必须共同重用,所以它们应该在同一个包中。(3)共同封闭原则 CCP(Common-Closure Principle)
一个包(包中的所有类)的变化由同一类原因引起的,且应该是共同封闭的。 例:界面类的状态变化都是由用户操作引起的,所以界面类应该属于同一个包。 从可维护性的角度,一个应用程序中经常需要改动的代码,应该把更改都集中在一个包中。例如我们的业务逻辑类,它们应该放在同一个业务包中进行管理。 也就是说:如果类之间有非常紧密的绑定关系,不管是物理上的还是概念上的,它们总是一同变化,这样它们应该属于同一个包。
二、包的耦合性原则:
原则用途:用来指导软件开发者如何处理包之间的相互关系的。 前提条件:我们根据聚合性原则进行了基本的包划分,包的数量和功能基本已经确立,此时我们需要进一步确认这些包之间的相互关系从而验证我们以前规划的包是否合理。 包的划分可能会动态的改变,如当项目的重心从可开发性向可重用性转变时,包的组成很可能会变动并随时间而演化。
(1)无环依赖原则ADP(Acyclic-Dependencies Principle)
在包的依赖关系图中不允许存在环状。(Visual Studio开发工具如果检测到循环依赖会报错,但大多数Java开发工具不会,所以开发Java的人一定要注意这个原则) 解除环依赖把包的依赖关系恢复为一个有向无环图的方法有以下几种: 方法1:使用依赖倒置原则(例如:如果A和B是循环依赖,则应该把B中被A依赖的类进行抽象,然后将抽象放入A中,这样A中的类依赖于本包中的抽象而不依赖于B中的实现。) 方法2:新创建一个A包和B包都依赖的C包。(同样是A和B是循环依赖,我们把B中被A依赖的类放到C中,A和B都依赖于C,这样也可以解决环状依赖。)(2)稳定依赖原则SDP (Stable-Dependencies Principle)
包的依赖关系总是朝着稳定的方向进行依赖。 也就是说:要使一个软件包是稳定的或要判别出一个软件包是稳定的,那么肯定可行的方法是让许多其他的软件包依赖于它。例如:一个软件中的公共函数包一般是稳定的,且业务包、界面包、操作包等都依赖于公共函数包。 我们在设计的包的时候通常要实时考虑到这一点,减少互相依赖,尽量让包都依赖于同一个包,从而满足SDP原则。
3)稳定抽象原则SAP (Stable-Abstractions Principle)
大家都知道抽象和接口一般都是很稳定的,所以包的抽象程度应该和其稳定程度一致。 也就是说:一个相对稳定的包应该是抽象程度很高的包,这样它具有很好的扩展性同时它也是最稳定的。 一个相对不稳定的包应该是具体的即包中的类都是具体的实现,这样它的具体代码经常需要修改同时它也是最不稳定的。