为依赖于订单的操作建议的流量控制结构

时间:2012-05-08 14:15:21

标签: c++ design-patterns dry

我遇到了以下问题,这个问题在任何想象中都难以解决,但我想知道什么是最好/最优雅的解决方案。

我有以下方法,原型看起来像这样:

bool Team::isEveryoneDead(int teamOnTurn);

两个团队可用,并且根据当前团队的实例,我想检查团队中的每个角色是否已按此特定顺序 < / strong>:

  1. 循环播放团队中的所有角色优先。如果有任何活着的角色,停止循环(并转到第2步)。如果没人活着,终止该功能并返回。

  2. 现在我知道的团队至少包含一个活着的角色,然后通过当前轮流的团队循环并检查相同的事情。我应该找到某人活着,停止循环并终止/返回。

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

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

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

    然而,这个解决方案并不适用于5!更多项目的特定呼叫排序的排列。 应该采用什么技术以最优雅的方式解决这个问题:)?

    先谢谢,Scarlet。

1 个答案:

答案 0 :(得分: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的概念:不要重复自己