如果提高可读性,是否可以接受冗余代码?

时间:2012-12-25 03:46:33

标签: java coding-style

我有以下代码来检查游戏单元是玩家还是敌人。这是仅有的两个类别。我可以删除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;
}

5 个答案:

答案 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:)