c++ - 建议的顺序相关操作的流控制结构

标签 c++ design-patterns dry

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

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

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 人来说不太适用!更多项目的特定调用排序的排列。 应该采用什么技术来最优雅地解决这个问题:)?

提前致谢,Scarlet。

最佳答案

尝试创建另一个实际执行检查的内部方法,并让 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 的概念:不要重复自己

关于c++ - 建议的顺序相关操作的流控制结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10500387/

相关文章:

c++ - 将模板参数传递给 MSVC 中的宏

C++11:传递值参数初始化中转换构造函数和转换函数之间的歧义?

javascript - 在 Web 应用程序中,您在哪里记录表单数据的验证规则?

.net - 使用 ServiceLocator Bootstrapper 在 MVVM 应用程序中注册事件处理程序的正确位置?

javascript - 如何DRY映射函数?

wcf - 如果WCF在MVC应用程序中,它是否应该使用 Controller 访问数据库以保留 'DRY'

c++ - 如何结合 BOOST_PP_IF 和 BOOST_PP_LPAREN?

c++ - C++中栈和堆的地址

design-patterns - 责任链 VS 案例陈述

forms - 在 Go 中解析简单的复选框组