单参数方法命名:在方法名中重复参数

one-parameter method naming: repeat paramter in method name

有时我们需要创建只有一个参数的简单方法。 例如:

private boolean isMockedPlayer(Player player) {
    return player == Player.MOCKED;
}

所以,我的问题是:命名方法不是更好吗: isMocked(玩家玩家) 而不是重复单词 "Player" 很多次? 有官方指导吗? 我意识到这样的重复对于 setter 来说是必不可少的,但对于上面的其他情况我不确定。

已编辑: 好吧,一个例子可能不是最好的。但问题不在于这个代码片段,而是关于一般原则——我们是否应该在方法名称中重复参数类型?

为什么不在 Player 实例本身上安装它?

public boolean isMocked() {
    return this == Player.MOCKED;
}

player.isMocked() 似乎比 someOtherService.isMockedPlayer(player).

更自然

虽然 Player 是一个 enum,但它确实有点违背了目的,因为 MOCKED 是 public。

另一方面,如果 Player 是一个实际的 class 并且 MOCKED 是您维护的内部静态实例,那么您可以将 isMocked() 实现为以上,您甚至不必将 MOCKED 暴露给外界。

but about general principle - should we repeat parameter type in method name or not?

好吧,这取决于。至少选择一个命名约定:

  • 自然
  • 不足为奇
  • 不混淆
  • 尽可能简洁

您想清楚地传达您正在执行的操作的上下文和含义。

我认为您的示例本身有点多余,因为您正在检查实例的状态。所以在这种情况下,方法成为实例本身的一部分更有意义。但是一个更好的例子可能是 class 上的一个方法,它接受一个与 class 本身类型相同的参数。例如:

public void merge(BinarySearchTree tree) {
    ...
}

在这种情况下不需要调用方法mergeBinarySearchTreebst.mergeBinarySearchTree(other) 并不比 bst.merge(other) 传达更多的信息。但即便如此,您也不能将此作为硬性规定。也许你的对象有许多不同类型的 merge 操作,它们都接受不同的东西。在那种情况下,让方法包含要合并的事物的名称可能是有意义的...但这也可能取决于您如何设计对象模型。

tl; dr 这取决于;但一般来说,选择一个能够传达有关操作的语义和上下文的准确信息而不会不必要地冗余或冗长的名称。

我认为您在命名此方法时遇到了问题,因为它没有任何用处。它只是做一个比较,只需要比方法调用更多的代码。将 isMocked() 方法添加到 Player 枚举本身可能会很有用。 "player == MOCKED" 和 "player.isMocked()" 之间并没有太大的区别,但是如果有几种类型的模拟玩家,那将是有用的。

顺便说一句,如果您必须检查对象是否被模拟,我认为可能存在设计问题。模拟的想法是代替真实对象来验证交互。如果您在模拟时修改交互,您在验证什么?