UML-包的设计
1、准则
1)、准则1
包在水平和垂直划分上,要功能性内聚。即:同类关联功能的模块化,将参与共同目的、服务、协作、策略和功能的强相关类型(类或者接口)组织在一起。
如:在NextGen项目中,Pricing包中的所有类型都与产品定价有关。
2)、准则2
由一族接口组成的包,将一组功能上相关的接口放入单独的包,与其实现类分离
3)、准则3
从一个包中,将不稳定的包拆出来,独立成新包。从而变成1个稳定包,1个不稳定包。
假设,有一个含有30个类型的大型包P1,其中有10个类经常被修改和重新发布。怎么办?答:将P1分解成P1-a和P1-b两个包,P1-b中包含这10个经常变动的类。
这样,开发者不用提心吊胆了。
4)、准则4
职责(被依赖或被调用)越多的包越需要稳定。
就是上文《逻辑架构的精化》中的”业务架构模块“,尽量不要出现,否则前一发动全身。但必须有时,如何增强包的稳定性呢?
法1:包中仅含或者主要包含接口和抽象类。
法2:不依赖于其他的包(这种包是独立的),或者依赖非常稳定的包,或者封装了依赖关系已使其不受影响。如:com.foo.nextgen.domain.posruleengine包,将具体的规则引擎实现隐藏在单独一个facade对象之后。实现改变时,依赖于此的包不受影响。
法3:含有相对稳定的代码,这些代码在发布之前经过充分的测试和精化。如:java.util包
法4:强制规定具有缓慢的变化周期。如:java类库的核心包java.lang不允许频繁改变。
5)、准则5
能抽象出独立包(不依赖别的包或类的包),尽量独立出来。
如:在com.foo.dao包下有个通用的工具类:JDBCHelper,最好将其放入com.foo.util.jdbc包下。
6)、准则6
使用工厂模式减少对具体包的依赖
领域对象工厂模式(Domain Oject Factory)
通过领域对象工厂接口创建所有的领域对象是常见的设计方法。
7)、准则7
包之间,不要循环依赖
解决方法:将参与循环的类型分解出来形成较小的新包。