关闭。这个问题是 opinion-based 。它目前不接受答案。
想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文来回答。
4年前关闭。
Improve this question
不久前我曾考虑过这个问题,最近它重新出现,因为我的商店正在开发第一个真正的 Java Web 应用程序。
作为介绍,我看到了两种主要的包命名策略。 (需要明确的是,我不是指整个“domain.company.project”部分,我指的是它下面的包约定。)无论如何,我看到的包命名约定如下:
这比逻辑命名更常见。事实上,我相信我从未见过或听说过这样做的项目。这当然让我怀疑(有点像认为你已经想出了一个 NP 问题的解决方案),因为我不是很聪明,而且我认为每个人都必须有很好的理由按照他们的方式去做。另一方面,我并不反对人们只是想念房间里的大象,而且我从未听说过以这种方式进行包命名的实际争论。它似乎只是事实上的标准。
正如我之前提到的,我从未见过或听说过这个,但这对我来说很有意义。
所以我想你会问这个问题,你如何命名你的包,为什么?请理解,我不一定认为我在这里偶然发现了金鹅或其他东西。我对这一切都很陌生,主要是学术经验。但是,我无法发现我的推理中的漏洞,所以我希望你们都可以,这样我就可以继续前进。
最佳答案
对于包装设计,我首先按层划分,然后按其他一些功能划分。
还有一些额外的规则:
因此,例如,对于 Web 应用程序,您的应用程序层(从上到下)可以具有以下层:
对于生成的包布局,这些是一些额外的规则:
<prefix.company>.<appname>.<layer>
<root>.<logic>
<root>.private
这是一个示例布局。
表示层按 View 技术划分,并可选择按(组)应用程序划分。
com.company.appname.presentation.internal
com.company.appname.presentation.springmvc.product
com.company.appname.presentation.servlet
...
应用层分为用例。
com.company.appname.application.lookupproduct
com.company.appname.application.internal.lookupproduct
com.company.appname.application.editclient
com.company.appname.application.internal.editclient
...
服务层被划分为业务域,受后端层中域逻辑的影响。
com.company.appname.service.clientservice
com.company.appname.service.internal.jmsclientservice
com.company.appname.service.internal.xmlclientservice
com.company.appname.service.productservice
...
集成层分为“技术”和访问对象。
com.company.appname.integration.jmsgateway
com.company.appname.integration.internal.mqjmsgateway
com.company.appname.integration.productdao
com.company.appname.integration.internal.dbproductdao
com.company.appname.integration.internal.mockproductdao
...
像这样分离包的优点是更容易管理复杂性,并且增加了可测试性和可重用性。虽然这看起来像是很多开销,但根据我的经验,它实际上是很自然的,每个在这个结构(或类似结构)上工作的人都会在几天内把它捡起来。
为什么我认为垂直方法不太好?
在分层模型中,几个不同的高层模块可以使用同一个低层模块。例如:可以为同一个应用构建多个 View ,多个应用可以使用同一个服务,多个服务可以使用同一个网关。这里的诀窍是,在层级之间移动时,功能级别会发生变化。更具体层中的模块不会将 1-1 映射到来自更通用层的模块上,因为它们表达的功能级别不会映射 1-1。
当您使用垂直方法进行包装设计时,即首先按功能划分,然后将具有不同功能级别的所有构建块强制放入相同的“功能夹克”中。您可以为更具体的模块设计通用模块。但这违反了更一般的层不应该知道更具体的层的重要原则。例如,服务层不应模仿应用层的概念。
关于java - 你在 Java 项目中使用什么策略来命名包,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/533102/