按特征组织
按特征组织是指用包名来标识特征。目的是把所有相关的项归结到一个单一的特征,并放置到唯一的目录中。这使得包有高聚合性和高模块性,同时与其他的包之间的耦合性最小,这样属于同一项的文件都放在一起,不会分散在项目的不同地方,以后如果删除功能的时候直接删除一个包就可以了。
按特征组织包结构,包的名字很重要,必须是高度概括的名称。比如一个开药方的程序可以如下组织:
- com.app.doctor
- com.app.drug
- com.app.patient
- com.app.presription
- com.app.report
- com.app.security
- com.app.webmaster
- com.app.util
- …
每个包内都只含有强相关的特征而没有任何其他的特征。比如com.app.doctor包可能含有这些项目: - DoctorAction.java - 一个action或者controller对象
- Doctor.java - 一个模型对象
- DoctorDAO.java - 一个DAO对象
- database项(SQL语句相关)
- 用户接口(网页页面)
注意每个包不仅仅是包含java文件,同时可以包含有其他类型的文件。为了实现按特征组织,所有的文件都必须与某一特征相关,并且必须被放置到相应的包中。
按特征组织并不是说所有的包之间都是完全独立的,对于只在本包中使用的方法需要使用default来保证只有本包的可见性,而只对必须向外界开放的方法使用public。
按层次组织
按层次组织则是将所有的包按层次结构组织,比如:
- com.app.action
- com.app.model
- com.app.dao
- com.app.util
每一个特征都被分散到了不同的包中,每个包中的内容都是低相关性的,导致的结果就是修改一个特征会去很多不同的包中。
总结
在这两种方法中进行比较,更加推荐使用按特征组织的方式,按特征组织的方式有如下优点:
高模块性
如上所说,按特征组织的代码具有高聚合性和低耦合性。
更方便的代码寻找
程序员不再需要做很多寻找代码的工作,因为所有相关的代码都在同一个包中。
高度抽象性
保持高度抽象性是程序员长久的追求,特征的划分使得程序员可以在更高的层次上考虑问题而不需要考虑过多的细节。
按特征组织的同时同样保持了层次性
按特征组织仍然有层次的划分,只是这个划分不再是按照包的层级而是按照文件的层级。
最小的可见性
低可见性也是程序所追求的目标,按特征划分的情况下优先考虑的是package-private而不是public,这使得包中的代码对包外的影响降到最低。
更高的代码成长性
随着项目的逐渐增多,如果按照层次组织包结构,会导致每个包中的文件越来越多,但是如果说是按特征划分,每个包中文件的数量总是在一个可控的范围之内,增加的只是包的数量。