15
您在Java项目中为包命名使用什么策略?为什么?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 3年前关闭。 改善这个问题 不久前,我就想到了这一点,最近,当我的商店正在制作其第一个真正的Java Web应用程序时,它又浮出水面。 作为介绍,我看到了两种主要的软件包命名策略。(要清楚,我不是在指整个“ domain.company.project”部分,而是在讨论其下的包约定。)无论如何,我看到的包命名约定如下: 功能性:根据体系结构上的功能来命名软件包,而不是根据业务领域来标识它们的身份。 对此的另一个术语可能是根据“层”进行命名。因此,您将拥有一个* .ui包,一个* .domain包和一个* .orm包。您的包裹是水平切片,而不是垂直切片。 这是多比逻辑命名更常见。实际上,我不相信我曾经见过或听说过执行此操作的项目。当然,这让我感到不安(有点像认为您已经提出了NP问题的解决方案),因为我并不聪明,我认为每个人都必须有充分的理由以自己的方式去做。在另一方面,我不反对人们只是缺少在房间里的大象和我从来没有听说过的实际参数为做包命名这种方式。这似乎只是事实上的标准。 逻辑:根据软件包的业务域标识来命名软件包,并将与该垂直功能有关的每个类放入该软件包。 正如我之前提到的,我从未见过或听说过,但这对我来说意义非凡。 我倾向于垂直而不是水平地接近系统。我想开发订单处理系统,而不是数据访问层。显然,我很有可能在该系统的开发过程中接触到数据访问层,但是重点是我不这么认为。当然,这意味着当我收到变更单或想要实现一些新功能时,不必去大量的软件包中寻找所有相关的类,这将是很好的。取而代之的是,我只是查看X软件包,因为我所做的与X有关。 从开发的角度来看,我认为使软件包记录您的业务领域而不是体系结构是一个重大胜利。我觉得域几乎总是系统的一部分,这很难理解,因为系统的体系结构(尤其是在这一点上)在其实现中几乎变得平凡。我可以使用这种命名约定进入系统,并立即从软件包的命名中得知它处理订单,客户,企业,产品等的事实,这似乎很方便。 看来这将使您能够更好地利用Java的访问修饰符。这使您可以更加清晰地将接口定义为子系统,而不是系统层。因此,如果您有想要透明透明地持久化的orders子系统,那么您不必通过在dao层中为其持久性类创建公共接口,而不必将其打包在里面,就可以从理论上讲永远不会让其他任何人知道它是持久性的。仅涉及其处理的类。显然,如果您想公开此功能,则可以为其提供接口或将其公开。通过将系统功能的垂直部分分割成多个软件包,您似乎损失了很多。 我想我可以看到的一个缺点是,它确实会使撕裂图层变得更加困难。您必须进入并更改所有软件包中的所有类,而不仅仅是删除或重命名软件包,然后使用替代技术将新软件包放到适当的位置。但是,我认为这没什么大不了的。可能是由于缺乏经验,但我必须想象一下,与您在系统中进行垂直要素切片编辑的时间相比,交换技术的时间显得苍白。 因此,我想这个问题会传给您,您如何命名包裹以及为什么?请理解,我不一定非要偶然发现这里的金鹅或其他东西。我对这一切非常陌生,主要是具有学术经验。但是,我无法发现推理中的漏洞,因此希望大家能够继续前进。