方法的数字后缀:它是有效的样式吗? (例如 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 名称中使用得更有效。也许这是因为它们更通常是名词,而不是动词,后者在方法名称中更常见。 CarModel2drive2() 更有意义。或者也许因为它们是接口,一致的上下文更容易在 API 的更广泛表面上施加,因此 API 的用户发现。

由于这涉及风格,其中一些可能是主观的,但这些都是需要考虑的一些设计压力。