Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 订单相关操作的建议流量控制结构_C++_Design Patterns_Dry - Fatal编程技术网

C++ 订单相关操作的建议流量控制结构

C++ 订单相关操作的建议流量控制结构,c++,design-patterns,dry,C++,Design Patterns,Dry,我遇到了以下问题,这不难想象,但我想知道最好/最优雅的解决方案是什么。 我有如下的方法,其原型如下所示: bool Team::isEveryoneDead(int teamOnTurn); bool Team::isEveryoneDead(int teamOnTurn) { bool isFound = isEveryoneDeadInternal( /* params for team not on turn */ ); if(isFound) { isF

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

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

bool Team::isEveryoneDead(int teamOnTurn);
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
}
有两个可用的团队,根据团队当前轮换的实例,我想检查团队中的每个角色是否按此特定顺序死亡

  • 通过团队中所有不是的角色循环,然后依次第一个。如果有任何角色处于活动状态,停止循环(并转到第2步)。如果没有活的,则终止该函数并返回

  • 现在我知道轮到而不是的团队至少包含一个活着的角色,在当前轮到的团队中循环并检查相同的事情。如果我发现有人活着,停止循环,终止/返回

  • 参数
    int-teamOnTurn
    允许我解析当前处于开启状态的团队实例我评估“存活状态”的顺序在这里非常重要。

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

    bool Team::isEveryoneDead(int teamOnTurn) {
        if (Team::Blue == teamOnTurn) {
            checkThis();
            checkThat();
        } else {
            checkThat();
            checkThis();
        }
    } 
    
    然而,这个解决方案对于5来说不太管用!针对更多项目的特定呼叫排序的排列应该使用什么技术以最优雅的方式解决此问题:


    提前感谢您,Scarlet。

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

    bool Team::isEveryoneDead(int teamOnTurn);
    
    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的概念:不要重复你自己

    这就是硬编码的作用,不是吗?您如何解决内部函数中的排序问题?@Scarlet,我更新了代码,使其更加清晰。这样做的目的是不要重复
    iseveryonedadinternal()
    中的代码,并使其与开关无关。哦,是的,我明白你的意思,这就是我真正的意思。我一直在想,我是否应该做一些基于参数的函数指针赋值之类的事情,但我想这可能是一种过分的做法。谢谢,接受。