我遇到了以下问题,这个问题在任何想象中都难以解决,但我想知道什么是最好/最优雅的解决方案。
我有以下方法,原型看起来像这样:
bool Team::isEveryoneDead(int teamOnTurn);
有两个团队可用,并且根据当前团队的实例,我想检查团队中的每个角色是否已按此特定顺序 < / strong>:
循环播放团队中不的所有角色优先。如果有任何活着的角色,停止循环(并转到第2步)。如果没人活着,终止该功能并返回。
现在我知道不的团队至少包含一个活着的角色,然后通过当前轮流的团队循环并检查相同的事情。我应该找到某人活着,停止循环并终止/返回。
参数int teamOnTurn
允许我解决当前轮流的Team实例。 我评估“活着状态”的顺序在这里非常重要。
现在,有几种方法可以采取,比如对订单进行硬编码(因为只有2个可能的订单)并通过检查轮到谁然后执行已经具有特定订单的分支来解决订单:
bool Team::isEveryoneDead(int teamOnTurn) {
if (Team::Blue == teamOnTurn) {
checkThis();
checkThat();
} else {
checkThat();
checkThis();
}
}
然而,这个解决方案并不适用于5!更多项目的特定呼叫排序的排列。 应该采用什么技术以最优雅的方式解决这个问题:)?
先谢谢,Scarlet。
答案 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的概念:不要重复自己