[这是不重复23247951]
我可能制作了太多的软件包,有些软件包的价值也很高,例如mightypork.gamecore.control.events.input
。
大部分都很好,但有时我不确定我做得对。这是一个示例图像:
Tile.java
和TileRenderer.java
是否属于tile
包,因为它们是“顶级”抽象或接口,或者是子包,因为实现都在那里?我希望结构合乎逻辑,但我真的不确定。请注意,这仅仅是一个例子,我在至少十几个地方处于类似情况。
更一般地说,为一个具体的实现做一个子包是一个好习惯吗?
答案 0 :(得分:5)
如果定义包,请尝试考虑模块性。哪种类型可以解决软件的一个方面,构成一个具有清晰边界的模块?哪些其他类型定义了另一个依赖于其他模块的模块? Java seam中的包是分层的,但它们不是。从来没有,使子包只依赖于超级包,而不是相反。拥有不依赖于超级包的子包是可以的。并且不要创建all my DAOs
或all my Controllers
等技术包。包的一个主要驱动方面是包内的类型cohesion的程度。另一个是你的应用程序的分层。
我的方法是:首先将所有内容放入单个包中。当您的应用程序发展时,识别模块并重新打包它们。尽量保持低包之间的依赖关系。检查相同软件包的任何一种类型是否相互依赖,或者它们是否涉及相同的方面/共享相关职责。
答案 1 :(得分:1)
好。这是一种观点,因此可能因人而异。是的,将抽象类/接口和具体类放在同一个包中并不好。通过查看你的包,任何人都应该能够说DoorTile,FloorTile等都实现/扩展Tile。因此,它们被归为同一个包。并且所有抽象类/接口都可以在单独的包下分组。
答案 2 :(得分:1)
更一般地说,为一个具体的实现做一个子包是一个好习惯吗?
IMO,该决定取决于接口的一般性,即是否可能并且很可能会编写该接口的不同实现?如果是 - 那么最好有一个单独的包用于这些不同的impl - 如果单个默认impl就足够了,那么我将把接口和Impl放在同一个包中。