【发布时间】:2010-10-06 16:40:28
【问题描述】:
我不久前就想到了这个问题,最近我的商店正在开发它的第一个真正的 Java Web 应用程序时它又重新出现了。
作为介绍,我看到了两种主要的包命名策略。 (要清楚,我指的不是整个 'domain.company.project' 部分,我说的是下面的包约定。)无论如何,我看到的包命名约定如下:
-
功能性:根据架构上的功能而不是根据业务领域的身份来命名您的包。另一个术语可能是根据“层”命名。因此,您将拥有一个 *.ui 包、一个 *.domain 包和一个 *.orm 包。您的包裹是水平切片而不是垂直切片。
这很多比逻辑命名更常见。事实上,我相信我从未见过或听说过这样做的项目。这当然让我怀疑(有点像认为你已经想出了一个解决 NP 问题的方法),因为我不是很聪明,而且我认为每个人都必须有充分的理由这样做。另一方面,我并不反对人们只是想念房间里的大象并且我从来没有听到过真正的论点支持以这种方式命名包。这似乎是事实上的标准。
-
逻辑:根据业务域标识命名您的包,并将与该垂直功能切片有关的每个类放入该包中。
正如我之前提到的,我从未见过或听说过这个,但这对我来说很有意义。
我倾向于垂直而不是水平地接近系统。我想进去开发订单处理系统,而不是数据访问层。显然,我很有可能会在该系统的开发中触及数据访问层,但关键是我不这么认为。当然,这意味着当我收到变更单或想要实现一些新功能时,不必为了找到所有相关的类而在一堆包中四处寻找会很好。相反,我只是查看 X 包,因为我所做的与 X 有关。
从开发的角度来看,我认为让你的包记录你的业务领域而不是你的架构是一个重大的胜利。我觉得域几乎总是系统中更难理解的部分,因为系统的架构,特别是在这一点上,在其实现中几乎变得平凡。事实上,我可以使用这种类型的命名约定并立即从包的命名中知道它处理订单、客户、企业、产品等的系统,这似乎非常方便。
似乎这样可以让您更好地利用 Java 的访问修饰符。这使您可以更清晰地将接口定义到子系统中,而不是系统的层中。因此,如果您有一个希望透明持久化的订单子系统,理论上您可以通过不必在 dao 层中为其持久性类创建公共接口,而是将 dao 类包装在只有它处理的类。显然,如果你想公开这个功能,你可以为它提供一个接口或者将它公开。通过将系统功能的垂直部分拆分到多个包中,您似乎失去了很多。
我想我可以看到的一个缺点是它确实使剥离图层变得更加困难。而不是仅仅删除或重命名一个包,然后用另一种技术将一个新的包放到适当的位置,您必须进入并更改所有包中的所有类。但是,我认为这没什么大不了的。这可能是由于缺乏经验,但我不得不想象,与您在系统中进入和编辑垂直特征切片的次数相比,您更换技术的次数相形见绌。
所以我猜你会问这个问题,你如何命名你的包,为什么?请理解,我不一定认为我在这里偶然发现了金鹅或其他东西。我对这一切都很陌生,主要是学术经验。但是,我无法发现我的推理中的漏洞,所以我希望你们都可以,以便我可以继续前进。
【问题讨论】:
-
到目前为止我所听到的似乎表明这是一种判断电话。但是,大多数答案并没有集中在实际考虑上。这就是我想要的。不过,感谢您迄今为止的帮助!
-
我不认为这是一个判断电话。首先按层划分,然后按功能划分绝对是要走的路。我正在更新我的答案。
-
@eljenso:告诉 Eclipse 人 :) 在 Eclipse 中,第一部分是“特性”,它是部署单元和功能单元。在“功能”内部,有“插件”,通常按层划分——但同一“功能”内的插件必须始终部署在一起。如果您只有一个部署单元,那么先按层划分,然后再按功能划分可能是有意义的。对于多个部署单元,您不想只部署表示层——您需要额外的功能。
-
我有一个关于应用程序业务层的具体问题,命名约定应该是什么?
标签: java naming-conventions packages