【发布时间】:2018-10-24 01:32:47
【问题描述】:
我正在使用 Typescript 和 Javascript,我停下来思考了一下命名空间以及我们如何在 Java 中组织代码。
现在,我经常看到多个具有相同目的的类,只是用于不同的数据,被放置在不同名称的不同包中。
虽然将这些类放在不同的包中是保持项目/模块处于良好状态的好习惯,但为什么我们必须给它们不同的名称?我的意思是,它们的目的是一样的。
我可以自己回答这个问题:因为我们经常在同一个单元中使用这些类,它们会发生冲突,因此需要一个很长的完整包规范。
但是我们不是违反了 DRY 原则吗?我们应该使用我们的目录(包)结构来了解这些类在哪个域空间中工作。
正如我在上面所写的,我想许多开发人员并没有遵守这个 DRY 原则,只是为了避免长包名。那么,我们为什么要创建那些 monstruos 包层次结构呢?
谷歌搜索"Java packages best practices" 会得到如下建议:
com.mycompany.myproduct.[...]
这些建议来自哪里?我们不是在浪费空间吗?
我们显然不想每次都这么写。
MyClass myInstance;
com.mycompany.myproduct.mypackage.MyClass myOtherInstance;
但它本来可以
myfeature.MyClass myInstance
myotherfeature.MyClass myInstance;
我们甚至可以为两者指定完整的包。
那么,这些最佳实践从何而来?
如前所述,这个约定可以追溯到 Java 的第一个版本。 名称冲突可以通过使用它们的 short 包的层次结构限定导入的依赖项(例如类路径库)类来轻松解决,强调并保持 我们的自己的代码更清晰。同样重要的是要记住我们可以访问包级别的可见性,这在当今似乎被忽视了。
【问题讨论】:
-
约定的“反向域”名称部分是为了使其全球唯一,因此您不会与库等发生名称冲突。如果您认为仅使用
myfeature会即使在一家公司内也足够独特,那么我认为您只为(非常)小公司工作过;) -
@MarkRotteveel 谢谢马克。虽然我明白你在说什么,但我觉得这很废话。这不只是一个既定的坏习惯吗?
-
对于小公司,实际上恰恰相反,是的,我经常看到这种包结构滥用。如果我们谈论的是模块,那么一个模块应该代表一个单一的特性,所以没有名称冲突。部分问题来自于我们没有认真思考我们正在做什么以及我们正在从事的领域
-
代码可能是单一应用程序的一部分,这会导致任何特定开发人员不知道应用程序中其他地方已经存在类似代码,或者开发人员知道类似代码但决定(无论原因)不创建旨在跨功能/域使用的包并重构代码。副作用是 com.mycompany.business.area.feature1.util 和 com.mycompany.business.area.feature2.util 等包中的代码几乎重复。
-
记住包可见性是有原因的也很重要。可惜开发者忘记了它是可用的。
标签: java