0

我遇到了以下问题,任何想像力都不难解决,但我想知道最好/最优雅的解决方案是什么。

我有以下方法,其原型如下所示:

bool Team::isEveryoneDead(int teamOnTurn);

两个团队可用,根据当前团队的哪个实例轮流,我想检查团队中的每个角色是否以这个非常特殊的顺序死亡:

  1. 循环遍历团队中没有轮到的所有角色。如果有任何角色还活着,请停止循环(并转到第 2 步)。如果没有人活着,终止函数并返回。

  2. 既然我知道轮流的团队至少包含一个活着的角色,请循环遍历当前轮流的团队并检查相同的内容。我应该找到一个活着的人,停止循环并终止/返回。

该参数int teamOnTurn允许我解决当前轮流的 Team 实例。我评估“活着的条件”的顺序在这里非常重要。

现在,可以采用几种方法,比如硬编码订单(因为只有 2 个可能的订单)并通过检查谁在轮流来解决订单,然后执行已经具有特定订单的分支,如下所示:

bool Team::isEveryoneDead(int teamOnTurn) {
    if (Team::Blue == teamOnTurn) {
        checkThis();
        checkThat();
    } else {
        checkThat();
        checkThis();
    }
} 

但是,此解决方案不适用于 5!更多项目的特定调用排序的排列。应该部署什么技术以最优雅的方式解决这个问题:)

在此先感谢,斯嘉丽。

4

1 回答 1

1

尝试创建另一个实际执行检查的内部方法,并让 isEveryoneDead() 方法协调检查团队的顺序,可能是这样的:

bool Team::isEveryoneDead(int teamOnTurn) {
    bool isFound = isEveryoneDeadInternal( /* params for team not on turn */ );
    if(isFound) {
        isFound = isEveryoneDeadInternal( /* params for team on turn */ );
    }
    return isFound;
} 

// This method know nothing about on turn or off turn
bool Team:isEveryoneDeadInternal() {
    // Loop through all characters in the team, checking if any are alive
    // When the first live character is found, return true
    // else return false
}

这是一个叫做 DRY 的概念:不要重复自己

于 2012-05-08T14:24:16.783 回答