方法的数字后缀:它是有效的样式吗? (例如 myMethod2())
Numeric suffix to methods: is it a valid style? (e.g. myMethod2())
这是一个样式问题,在 public SDK 的上下文中,由于向后兼容性要求,无法删除方法。
我在某些地方看到,当添加新版本的方法时,它会有相同的名称,但会有一些数字前缀,例如,
void doTheThing2(...) {...};
乍一看这很丑陋,显然没有做任何事情来传达方法中的实际差异。另一方面,我发现它通常更难看,有时根本不可能捕获名称中方法 "version 2" 的语义变化。例如,
boolean doTheThingButReturnResultCode(...) {...};
上帝保佑,如果您有方法的第 3 版,那又怎样?
显然我在 Java 中编码,但这个问题并不特定于 Java。我知道这里没有objective答案,但希望得到一些有理性的意见。
我会说这是不鼓励的,但不是无效的。我认为您在 public API 的很长一段时间内保持方法的向后兼容性非常正确,并明确标明弃用期。
后缀的一个问题是,新方法最终会在 1-2 个主要 API 版本之后成为主要使用方法。然而,这破坏了程序员的工作流程——你得到一个遗留的后缀仍然附加在一个方法上。甚至在此之前,method()
和 method2()
之间的含义通常也不是一个明确的约定。
由于英语是一种富含同义词的语言,我发现在方法级别上这些比版本后缀更受欢迎。这通常不会牺牲清晰度和简单性。例如 addItem() (deprecated)
可能会变成 storeItem()
。当可以在 API 中的多个位置遵循新的命名约定时,此方法特别有效。然后 addWidget()
和 addWudget()
变成 storeWidget()
和 storeWudget()
.
您可以在 Java 和 Python API 本身中看到这种同义词方法 - 他们很少使用数字后缀。也许 String.subSequence()
方法可以被认为是 String.substring()
的版本 2。
数字后缀的另一个问题是不清楚数字是什么版本。它是方法的一个版本吗?在API?一年? Java 版本? API 主要版本可能最有意义,但如果不添加像 addItemJava2()
或 addItemV2()
这样的更长的后缀,就很难始终如一地提供此上下文。在 API 主要版本更改后,使用孤立的数字后缀也会变得不直观。我应该使用 addItemv3()
现在是 API 版本 5 吗?
我发现数字后缀在界面和 class 名称中使用得更有效。也许这是因为它们更通常是名词,而不是动词,后者在方法名称中更常见。 CarModel2
比 drive2()
更有意义。或者也许因为它们是接口,一致的上下文更容易在 API 的更广泛表面上施加,因此 API 的用户发现。
由于这涉及风格,其中一些可能是主观的,但这些都是需要考虑的一些设计压力。
这是一个样式问题,在 public SDK 的上下文中,由于向后兼容性要求,无法删除方法。
我在某些地方看到,当添加新版本的方法时,它会有相同的名称,但会有一些数字前缀,例如,
void doTheThing2(...) {...};
乍一看这很丑陋,显然没有做任何事情来传达方法中的实际差异。另一方面,我发现它通常更难看,有时根本不可能捕获名称中方法 "version 2" 的语义变化。例如,
boolean doTheThingButReturnResultCode(...) {...};
上帝保佑,如果您有方法的第 3 版,那又怎样?
显然我在 Java 中编码,但这个问题并不特定于 Java。我知道这里没有objective答案,但希望得到一些有理性的意见。
我会说这是不鼓励的,但不是无效的。我认为您在 public API 的很长一段时间内保持方法的向后兼容性非常正确,并明确标明弃用期。
后缀的一个问题是,新方法最终会在 1-2 个主要 API 版本之后成为主要使用方法。然而,这破坏了程序员的工作流程——你得到一个遗留的后缀仍然附加在一个方法上。甚至在此之前,method()
和 method2()
之间的含义通常也不是一个明确的约定。
由于英语是一种富含同义词的语言,我发现在方法级别上这些比版本后缀更受欢迎。这通常不会牺牲清晰度和简单性。例如 addItem() (deprecated)
可能会变成 storeItem()
。当可以在 API 中的多个位置遵循新的命名约定时,此方法特别有效。然后 addWidget()
和 addWudget()
变成 storeWidget()
和 storeWudget()
.
您可以在 Java 和 Python API 本身中看到这种同义词方法 - 他们很少使用数字后缀。也许 String.subSequence()
方法可以被认为是 String.substring()
的版本 2。
数字后缀的另一个问题是不清楚数字是什么版本。它是方法的一个版本吗?在API?一年? Java 版本? API 主要版本可能最有意义,但如果不添加像 addItemJava2()
或 addItemV2()
这样的更长的后缀,就很难始终如一地提供此上下文。在 API 主要版本更改后,使用孤立的数字后缀也会变得不直观。我应该使用 addItemv3()
现在是 API 版本 5 吗?
我发现数字后缀在界面和 class 名称中使用得更有效。也许这是因为它们更通常是名词,而不是动词,后者在方法名称中更常见。 CarModel2
比 drive2()
更有意义。或者也许因为它们是接口,一致的上下文更容易在 API 的更广泛表面上施加,因此 API 的用户发现。
由于这涉及风格,其中一些可能是主观的,但这些都是需要考虑的一些设计压力。