如何正确组织java包

如何正确组织java包,java,packages,Java,Packages,[这是不是的副本] 我可能制作了太多的软件包,其中一些软件包很深,例如,mightypork.gamecore.control.events.input 大多数情况下都很好,但有时我不确定自己做得对不对。下面是一个示例图像: Tile.java和tilerender.java是否属于Tile包,因为它们是“顶级”抽象或接口,还是属于子包,因为实现都在那里?我希望结构是合乎逻辑的,但这一点我真的不确定。请注意,这只是一个例子,我至少在十几个地方有类似的情况 更一般地说,仅仅为某个东西的具体实现制

[这是不是的副本]

我可能制作了太多的软件包,其中一些软件包很深,例如,
mightypork.gamecore.control.events.input

大多数情况下都很好,但有时我不确定自己做得对不对。下面是一个示例图像:

Tile.java
tilerender.java
是否属于
Tile
包,因为它们是“顶级”抽象或接口,还是属于子包,因为实现都在那里?我希望结构是合乎逻辑的,但这一点我真的不确定。请注意,这只是一个例子,我至少在十几个地方有类似的情况


更一般地说,仅仅为某个东西的具体实现制作一个子包是一种好的做法吗?

如果您定义包,请尝试考虑模块化。哪些类型解决了软件的一个方面,构成了一个具有清晰边界的模块?哪些其他类型定义了另一个依赖于其他模块的模块?JavaSeam中的包应该是分层的,但它们不是。无论如何,让子包只依赖于超级包,而不是相反。可以使用不依赖于超级包的子包。不要创建技术包,如
所有我的DAO
所有我的控制器
。包的一个主要驱动因素是包内类型的程度。另一个是应用程序的分层


我的方法是:首先把所有东西放在一个单独的包中。当您的应用程序发展时,识别模块并重新打包它们。尽量降低包之间的依赖关系。检查同一软件包的任何一种类型是否相互依赖,或者它们处理相同的方面/分担相关的责任。

很好。这是一种观点,因此可能因人而异。是的,将抽象类/接口和具体类放在同一个包中是不好的。通过查看您的包,任何人都应该能够说DoorTile、FloorTile等都实现/扩展了Tile。因此,它们被分组在同一个包下。所有抽象类/接口都可以分组在一个单独的包中

更一般地说,仅仅为某件事情的具体实现制作一个子包是一种好的做法吗


依我看,这个决定取决于接口的通用性,也就是说,您是否有可能并且很有可能编写该接口的不同实现?如果是-那么最好为这些不同的impl提供一个单独的包-如果一个默认的impl就足够了,那么我将把接口和impl放在同一个包中。

很难说清楚,但是你经常会发现比
mightyport.gamecore.control.events.input
和接口/实现更深层的层次结构通常是包装丰富的来源。是的,我知道。另外,更好的例子可能是
mightyport.util.math.constraints.num.caching
。。不管怎么说,我主要是想问第二部分的问题。这不是更适合这个问题吗?谢谢你的投票,戴斯特罗伊;非常感谢。无论如何,我在这里问bcs我知道java程序员在这里。不是像程序员这样晦涩难懂的子论坛。*我投票决定结束,你应该知道不要问重复的问题。特别是一个主要是基于观点的,在堆栈溢出中被认为是离题的。从实际的角度来看,这听起来是正确的。。。但是,在包资源管理器中,我会有一个类的怪物列表,而对于嵌套包,它看起来更干净(但不太有用?)。应该删除“包内(类型之间)高度依赖项”部分。拥有依赖关系并没有什么好处。我将high改为exist来解决内聚问题。但这种方法并不是结构化的。一个人不应该等到事情变得一团糟才去换包裹。设计从那里开始。从功能的角度来看,同一个包中的类/接口是(并且应该)紧密耦合的。将瓷砖、墙砖、门砖和瓷砖装饰器放在同一个包装下有什么意义?我认为这种方法是结构化的。只有创建一些类/类型,才能找到包结构。当我创建一个类或类型时,我首先编写一个测试(测试优先方法)。因此,我从不提前思考,因此,我永远不知道会出现哪些类/类型。因此,打包是编码的重构结果,这是我开发过程中固定的一部分。它现在已经运行多年了,而且非常好。难以用语言解释。。。你必须在实践中看到:)