假设我想在我的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(
还存在基于参数类型的约定;例如,提升以下顺序:
- 具有泛型参数的集合和其他对象
- 对象数组
- 没有泛型的对象
- 字符串
- 基元类型的数组,例如
byte[]
- 双,浮子
- 长、整、短、字节
- 布尔
还存在或多或少完全相反的顺序。其他约定也倾向于按类型对参数进行分组,更喜欢method(String, String, int, int)
而不是method(String, int, String, int)
。
如您所见,存在很多约定。我不确定它们中的任何一个都有名字,而且它们真的比其他任何名称都多得多。 例如,它不像骆驼与snake_case那样清楚,几乎没有人反驳。
你可以从以下所有事情中保留:将参数放在你看来最合乎逻辑和最直接的顺序。 最重要的是保持包含在整个项目中,即不要编写isFileX(a,b)
然后isFileY(b,a)
例如,如果两个方法在同一个类中,则更是如此。 如有疑问,请随时询问从事您项目的其他人他们认为什么是最好的。
对于您的特定情况,由于"此第一"规则,将孩子放在第一位是合理的,但将父项放在第一位也是合理的,因为它也是 GUI 框架中的常见约定。 由您决定。