带有版本号的Java类命名规范是什么?

6
假设我有不同的类来处理同一协议的不同版本(可能有不同的接口)。例如,一个虚构的名为My Protocol(MYP)的协议:
My Protocol(MYP)版本1.0、1.1、2.0、2.2等。
一些命名示例我可以想到的是:
MYP10Handler,MYP11Handler,MYP20Handler,MYP22Handler等。
MYP1_0Handler,MYP1_1Handler,MYP2_0Handler,MYP2_2Handler等。
例如,如果使用第一种选择,当协议达到更高版本时将存在歧义。例如,版本11.0(十一):
MYP11Handler:版本1.1还是11.0?
MYP110Handler:版本11.0还是1.10?
然而,第二个选项似乎避开了驼峰规则。
这些类型的类通常如何命名?是否有更好的实践方法?

这个问题是否在Google Java风格指南中有涉及? - Jonny Henly
2
你不应该在类名中加入版本号,而是应该将它们放在包名中,例如com.company.protocol.11_0.MyHandler。当然,还应该有一个没有版本的接口com.company.protocol.MyHandler - Timothy Truckle
@Frakcool MYP协议是虚构的,它可以是任何协议。 - Hydren
@TimothyTruckle 在包名中使用下划线是可以的吗?例如,Google Java Style Guide在命名包时反对这样做。 - Hydren
@AndrewTobilko 我理解你的观点,但如果两个版本之间存在重大接口差异,并且有意为两个版本都创建一个类,那该怎么办呢? - Hydren
显示剩余2条评论
1个回答

9
你应该将所有文件/类相对于整个程序部分的特定版本放在一个名为该特定版本的包中。
当你想要添加协议的新版本时,你应该创建一个新的包,复制所有旧文件,并开始使用新内容,每个包中的所有文件/类都应该有相同的名称(例如com.yourname.myprotocol14.MyProtocolHandler,当然不是com.yourname.myprotocol14.MyProtocolHandler14)。
你必须决定在软件包名称上编写版本的精度:你可以只放置主版本(com.yourname.myprotocol10代表版本10.X,com.yourname.myprotocol12代表版本12.X),或者决定甚至写入小版本(com.yourname.myprotocol10代表版本1.0,com.yourname.myprotocol12代表版本1.2),这取决于你。
用户可以通过导入com.yourname.myprotocol[version number]来决定要使用哪个库的版本(假设它是一个库),因此你应该将与库相关的所有文件放在每个包内。

1
你的解决方案看起来非常合理。但我必须问一下,在决定写版本时使用的精度时,如何避免像com.yourname.myprotocol120这样的冲突,因为它不明显地指代版本1.20.X还是12.0.X - Hydren
1
@Hydren 我认为除了使用像 com.yourname.myprotocol1_20 表示版本 1.20 和 com.yourname.myprotocol12_0 表示版本 12.0 这样的花哨东西之外,没有其他方式来指定它。考虑使用点号:com.yourname.myprotocol.1.20 表示版本 1.20 和 com.yourname.myprotocol.12.0 表示版本 12.0。为了使其更加明确,您可以在 javadoc 中使用 @version :) - adario
@Someone com.yourname.myprotocol.1.20 不是一个有效的包名。 - Dávid Horváth
3
我们目前使用“位图符号表示法”,在方法名中指定版本 1.2.0myMethod1x2x0(),并将版本 12.0 表示为 myMethod12x0x0()myMethod12x0()。我们在代码库中使用这种符号表示法,因为下划线在我们的方法名中具有不同的传统含义。 - tom_mai78101

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接