Java 静态谓词命名约定

Java static predicate naming convention

假设我想在 FileUtils 助手 class 中编写 isSubdirectory 静态函数。这个函数看起来像:

class FileUtils {
  public static boolean isSubdirectory(File child, File parent) {
    // ...
  }
}

或者我可以翻转 parentchild 参数:

class FileUtils {
  public static boolean isSubdirectory(File parent, File child) {
    // ...
  }
}

而且我无法选择哪个顺序是正确的...

在 Kotlin 中不会有任何疑问:只需声明扩展函数:

fun File.isSubdirectory(parent: File) {
  // ...
}

着眼于kotlin,我发明了助记法则:静态函数中的第一个参数应该被认为是this(我不是第一个发明这个法则的,我看到很多人也在用) .所以在这个例子中我更喜欢将 child 作为第一个参数。

但问题是:这个规则是否已经正式化并且有一个众所周知的名字?我已经厌倦了向不知道它的人重复这条规则,我希望我可以简单地通过它的名字来引用这条规则。

我不确定是否有名称或任何真正的形式化。充其量,让第一个参数看起来像 this 只是一种常见的约定。 虽然最罕见,但 "this last" 约定也存在,在 C 和早期的 C++ 中更多(例如:stdio with fread/fwrite)

也存在基于参数类型的约定;例如推广以下订单:

  • 集合和其他 objects 具有通用参数
  • objects
  • 的数组
  • Objects 没有泛型
  • 字符串
  • 基本类型的数组,例如byte[]
  • 双精度浮点数
  • 长整型、短整型、字节
  • 布尔值

也存在或多或少完全相反的顺序。其他约定也倾向于按类型对参数进行分组,更喜欢 method(String, String, int, int) 而不是 method(String, int, String, int).

如您所见,存在许多约定。我不确定它们中的任何一个都有名字,而且确实比其他任何一个都更常用。 例如,它不像驼峰式 vs. snake_case 那样清楚,几乎没有人反驳。

您可以避免的是:将论点按照您认为最合乎逻辑和最直接的顺序排列。 最重要的是在整个项目中保持一致,即不要先写 isFileX(a,b) 然后再写 isFileY(b,a),如果两个方法在同一个 class 中就更不用说了。 如有疑问,请毫不犹豫地询问从事您项目的其他人,他们认为什么是最好的。

对于您的特定情况,由于 "this first" 规则,将 child 放在首位是合理的,但将 parent 放在首位也是合理的,因为这也是一种常见的约定例如在 GUI 框架中。 由您决定。