Java包结构约定
我当时正在使用Typescript和Javascript,我停下来思考了一下名称空间,以及我们如何用Java组织代码
现在,我经常看到多个具有相同用途的类,只是用于不同的数据,被放在不同的包中,使用不同的名称
虽然将这些类放在不同的包中是保持项目/模块处于良好状态的一种好做法,但我们为什么要给它们取不同的名称呢?我是说,他们的目的是一样的
我可以自己回答这个问题:因为我们经常在同一个单元中使用这些类,它们会发生冲突,因此需要对其中一个进行长时间的完整包规范
但我们不是违反了干燥原则吗?我们应该使用目录(包)结构来理解这些类在哪个域空间中工作
正如我在上面所写的,我想许多开发人员不尊重这个枯燥的原则,只是为了避免长的包名。那么,我们为什么要创建那些monstruos包层次结构呢
谷歌搜索"Java packages best practices"
会产生如下建议:
com.mycompany.myproduct.[...]
这些建议来自哪里?我们不是在浪费空间吗
显然,我们不想每次都这么写
MyClass myInstance;
com.mycompany.myproduct.mypackage.MyClass myOtherInstance;
但也有可能
myfeature.MyClass myInstance
myotherfeature.MyClass myInstance;
我们甚至可以为两者指定完整的软件包
那么,这些最佳实践来自哪里
如前所述,这个约定可以追溯到Java的第一个版本。 通过使用short包的层次结构来限定导入的依赖项(例如类路径库)类,强调并保持我们自己的代码的整洁,可以很容易地解决名称冲突。记住,我们可以访问包级别的可见性,这一点也很重要,现在似乎被忽略了
# 1 楼答案
正如一位评论者所指出的,这个约定是在Java的最开始建立的,它允许对所有类使用全局名称空间
Java有一点影响了这一点,与TypeScript和JavaScript不同,类的名称及其包(以及它使用的所有类和包的名称)固定在编译时。如果不修改类的源代码,就无法将类重新组合到不同的层次结构中。因此,它不像解释式语言那样灵活,在解释式语言中,您可以随意移动层次结构,并更改加载代码的位置
当然,您可以将应用程序中的所有内容都放在顶级软件包中,并且非常有信心能够成功。只要每个人都遵守现有的惯例,你就可以做到这一点。一旦它们停止这样做,库开始将类放在它们想放的任何地方,就会发生冲突,并且必须更改应用程序。或者库会开始相互冲突,如果你没有源代码,你就无法真正修复它
所以有很好的理由
我的观点是,坚持传统和语言(或平台)文化是有道理的。在我们看来,即使这些惯例很愚蠢。有一个打破它们的地方,但优势必须相当大。其他开发人员将习惯于该约定,工具将对该约定进行假设。。。通常顺其自然是有道理的
对Java中的每个属性使用getter和setter真的有意义吗?如果你很了解你正在使用的领域,它很可能不会。但是停止这样做,你的代码对你团队的其他成员来说就没有意义了,你必须随着人们的加入不断地重新考虑这个决定,等等
如果这是一个人的项目,而且永远都是,当然,你可以做你想做的事