假设我想在我的 FileUtils
辅助类中编写 isSubdirectory
静态函数。这个函数看起来像:
class FileUtils {
public static boolean isSubdirectory(File child, File parent) {
// ...
}
}
或者我可以翻转parent
和child
参数:
class FileUtils {
public static boolean isSubdirectory(File parent, File child) {
// ...
}
}
我无法选择哪个顺序是正确的......
在 Kotlin 中不会有任何疑问:只需声明扩展函数:
fun File.isSubdirectory(parent: File) {
// ...
}
着眼于kotlin,我发明了助记符规则:静态函数中的第一个参数应该被视为this
(我不是第一个发明这个规则的人。我看到很多人也在使用它)。因此,在这个示例中,我更愿意将 child
作为第一个参数。
但问题是:这条规则是否已经正式化并且有众所周知的名字?我厌倦了向不知道的人重复这条规则,我希望我可以简单地通过它的名称来引用这条规则。
最佳答案
我不确定是否有名称或任何真正的形式化。充其量,第一个参数类似于 this
只是一种常见约定。
尽管最罕见,但“最后一个”约定也存在,更多地出现在 C 和早期 C++ 中(示例:带有 fread/fwrite 的 stdio)
还存在基于参数类型的约定;例如推广以下订单:
- 具有通用参数的集合和其他对象
- 对象数组
- 没有泛型的对象
- 字符串
- 原始类型数组,例如
字节[]
- double 、 float
- 长整型、短整型、字节
- boolean 值
也存在或多或少完全相反的顺序。其他约定也倾向于按类型对参数进行分组,更喜欢 method(String, String, int, int)
而不是 method(String, int, String, int)
。
正如您所看到的,存在很多约定。我不确定它们中的任何一个都有名字,而且其中任何一个确实比其他任何一个都更常用。 它不像camelCase 与snake_case 那样清晰,几乎没有人反对。
您可以避免的事情如下:按照您认为最合乎逻辑和最直接的顺序排列参数。
最重要的是保持整个项目的一致性,即不要先写 isFileX(a,b)
然后写 isFileY(b,a)
例如,更不用说如果这两个方法在同一个类中。
如有疑问,请随时询问参与您项目的其他人,他们认为什么是最好的。
对于您的特定情况,由于“此第一”规则,将子级放在第一位是合理的,但将父级放在第一位也是合理的,因为这也是 GUI 框架中的常见约定。 由您决定。
关于Java 静态谓词命名约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59073888/