问题描述
有时我们只需要一个参数就可以创建简单的方法。 例如:
private boolean isMockedPlayer(Player player) {
return player == Player.MOCKED;
}
因此,我的问题是:命名方法isMocked(Player player)而不是重复多次“ Player”不是更好吗? 有官方指导吗? 我意识到,这种重复对于传手是必不可少的,但对于上述其他情况并不确定。
编辑:嗯,一个例子可能不是最好的。 但是问题不是关于此代码片段,而是关于一般原理-我们是否应该在方法名称中重复参数类型?
1楼
为什么不在Player
实例本身上具有它?
public boolean isMocked() {
return this == Player.MOCKED;
}
player.isMocked()
似乎比someOtherService.isMockedPlayer(player)
更自然。
如果Player
是一个enum
,尽管这样做确实达到了目的,因为MOCKED
是公开的。
另一方面,如果Player
是一个实际的类,并且MOCKED
是您维护的内部静态实例,则可以如上所述实现isMocked()
,甚至不必将MOCKED
暴露给外界。
但是关于一般原理-我们是否应该在方法名称中重复参数类型?
这要看情况。 选择一个至少要遵循的命名约定:
- 自然
- 不奇怪
- 不要混淆
- 尽可能简洁
您想清楚地传达正在执行的操作的上下文和含义。
我认为您的示例本身有点多余,因为您正在检查实例的状态。 因此,在这种情况下,使该方法成为实例本身的一部分更为有意义。 但是一个更好的例子也许是类上的方法接受与该类本身相同类型的参数。 例如:
public void merge(BinarySearchTree tree) {
...
}
在这种情况下,无需调用mergeBinarySearchTree
方法;
bst.mergeBinarySearchTree(other)
不会传达比bst.merge(other)
更多的信息。
但是即使那样,您也不能将其作为一成不变的规则。
也许您的对象具有许多不同类型的merge
操作,它们都接受不同的内容。
在那种情况下,让方法包含要合并的事物的名称可能是有道理的……但这也可能取决于您设计对象模型的方式。
tl; 博士 ,取决于; 但通常,选择一个能够传达有关操作的语义和上下文的准确信息的名称,而不必多余或冗长。
2楼
我认为您在命名此方法时遇到了麻烦,因为它没有任何用处。 它只是做一个比较,只需要比方法调用更多的代码即可。 将isMocked()方法添加到Player枚举本身可能会很有用。 “ player == MOCKED”和“ player.isMocked()”之间并没有太大区别,但是如果有几种类型的被嘲笑的玩家,这将很有用。
顺便说一句,我认为如果您必须检查对象是否被嘲笑,则可能存在设计问题。 模拟的想法是代替真实的对象来验证交互。 如果在模拟时修改交互,您要验证什么?