我有以下代码来检查游戏单元是玩家还是敌人。这是仅有的两个类别。我可以删除isEnemy方法并对敌人运行所有检查,就好像(!isPlayer),但我个人觉得如果(isEnemy)使代码的意图更清晰。是否有任何既定的编码风格可以说明这种情况?
public boolean isPlayer(Unit unit) {
return unit == player;
}
public boolean isEnemy(Unit unit) {
for (Unit e : enemies) {
if (unit.equals(e))
return true;
}
return false;
}
答案 0 :(得分:6)
对于你的情况,你只有两种可能的状态 - 他们要么是敌人,要么是玩家。如果他们是一名球员,他们就不是敌人。最明确的表达方式是!isPlayer
。
如果你有其他可能的状态,那么你可能想要查看其他状态的某种枚举。
作为一般经验法则:Don't Repeat Yourself。如果您的代码的一部分更改了您已复制的(可能是为了修复错误),那么您必须更改该错误的每次出现。它可能会变成维护噩梦。
答案 1 :(得分:3)
就个人而言,我会将isEnemy()
实现为!isPlayer()
,但是有assert
运行循环以确保它确实是敌人。
答案 2 :(得分:2)
我认为两种方法都可以接受。如果isEnemy()==!isPlayer()我会考虑将isEnemy()实现为:
public boolean isEnemy(Unit unit) {
return !isPlayer(unit);
}
通过这种方式,您可以获得具有两种特定方法的可读性,但不一定重复自己,就像您可以调整isPlayer()并影响这两种方法一样。
答案 3 :(得分:1)
在我看来,这绝对是可以接受的。特别是在大项目中,可读性非常重要。还要考虑一下,如果你将来添加第三个角色,那么你将无法使用if(!isPlayer)。
答案 4 :(得分:1)
通过查看你的代码,如果它存在于集合'敌人'中,你就会识别敌人。所以对你来说,敌人本质上不是一个不是玩家的人。如果你想强制执行这个语义,那么我认为你不应该使用isEnemy()方法。
你可能需要的另一个原因isEnemy()方法是,如果你看到另一种类型的可能性说Ally。使用isEnemy()方法可以使添加更简单,更清晰。
但是,如果超过2个条件无效,那么摆脱它。正如他们所说YAGNI:)