如何处理具有相同名称的类(不同的包)


9

我和我的研发团队维护着庞大的代码库。我们已经将业务逻辑分为多个包。其中一些具有相同名称的类

如您所料,当在同一Java文件中引用两个类时,名称冲突。


例如:

com.myapp.model (package)
 - Device (class)
 - ...

com.myapp.data (package)
 - Device (class)
 - ...

我们就治疗这些病例的最佳实践进行了辩论,并提出了以下选择:

第一种选择

  • 重命名类,添加前缀

    ModelDevice
    DataDevice
    

第二选择

  • 同时引用包和类的完整名称

    com.myapp.model.Device
    com.myapp.data.Device
    

在代码管理和可伸缩性方面,更正确的是什么?

我们目前正在混合使用这两种方法,并开始出现不一致之处


如果偶尔出现,则可能无关紧要-如果它是重复出现的模式,则我可能会更精确地命名类,以防止其变得混乱。
assylias,2016年

您不知道我讨厌多少java.util.Datejava.sql.Date尤其是因为它java.sql.Datejava.util.Date数据层的子类,因此很好地滑出了数据层(并且不能很好地序列化为JSON)。

选项2.1 即使未引用其他名称,也请始终使用完全限定的名称
-Caleth

Answers:


18

使用软件包名称。正是这种类型的问题恰恰是Java为什么使用它所使用的包命名约定的原因。无论是同一公司的两个团队还是地球相对的两个团队,它都可以防止出现此类问题。


1

到目前为止,您只有一个ModelDevice类(模型包中的Device)。如果您有另一个这样的ModelDevice用于其他分类怎么办?问题可能仍然存在,间接费用也将继续增加。

虽然暂时您可能会发现重命名类有一些帮助,但从长远来看,建议的替代方法是给程序包名称加上前缀,这就是行业标准。


0

仅添加尚未提及的一个方面:

看一下使用模式,即引用一个或两个类的Java源。

恕我直言,在大多数情况下,源文件应仅引用一个冲突的类,并且从上下文中应该清楚它们是处理模型还是处理数据世界。如果由于某种原因这很困难,我就重命名了类,因为我通常不喜欢源代码中带有包前缀的类名(这会降低可读性)。

如果您拥有处理这两种情况的源文件,那么它们可能会以具有在世界的两种不同视图之间进行转换的合理性来桥接类,在这里,我更愿意查找包前缀的类名。

但是在一个来源中同时看到两个设备类可能也暗示该来源通过混合来自模型和数据世界的任务而违反了单一职责原则。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.