什么是长嵌套if else构造的替换?

时间:2013-04-16 10:41:33

标签: language-agnostic

我有一个嵌套的if else结构,如下所示,我想替换它 使用正确的编程语句。

if($provider[0][0]=='A' && $provider[1][0]=='B'){
   return 'O';
}elseif($provider[0][0]=='B' && $provider[1][0]=='A'){
   return 'O';
}elseif($provider[0][0] == 'A' && $provider[1][0] == '' ){
   return 'A';
}elseif($provider[0][0] == 'B' && $provider[1][0] == '' ){
   return 'B';
} else{
   return 'Return nothing';
}

5 个答案:

答案 0 :(得分:2)

不是真的避免嵌套,而是简化阅读:

<?php

function isOprovider($provider) {
    return $provider[0][0]=='A' && $provider[1][0]=='B' 
           || $provider[0][0]=='B' && $provider[1][0]=='A';
}

function isAprovider($provider) {
    return $provider[0][0] == 'A' && $provider[1][0] == '';
}

function isBprovider($provider) {
    return $provider[0][0] == 'B' && $provider[1][0] == '';
}

if (isOprovider($provider)) {
     return '0';
} else if (isAprovider($provider)) {
     return 'A';
} else if (isBprovider($provider)) {
     return 'B';
} else {
     return 'Return nothing';
}

答案 1 :(得分:1)

使其更具可读性的选项之一 -

if($provider[0][0]=='A') {
   // other condition(s)
} else if($provider[0][0]=='B') {
   // other condition(s) 
} else {
  // return nothing
}

您也可以尝试切换。在任何情况下,您都需要嵌套条件。

答案 2 :(得分:0)

我会做这样的事情:

function IsCombinationOf($first, $second, $provider) {
    return ($provider[0][0]==$first && $provider[1][0]==$second) || 
           ($provider[0][0]==$second && $provider[1][0]==$first);
}


if(IsCombinationOf('A', 'B', $provider)){
    return 'O';
}
elseif(IsCombinationOf('', '', $provider)){
    return 'Return Nothing';
}
elseif(IsCombinationOf('A', '', $provider)){
    return 'A';
}
elseif(IsCombinationOf('B', '', $provider)){
    return 'B';
}

答案 3 :(得分:0)

我会用数据替换大部分代码,然后使用循环从数据中选择正确的答案。这里的想法是分离政策和实施。政策是:鉴于提供商的不同组合,我会返回什么?实施是......好吧,实施。

示例在Ruby中,但这个想法适用于任何语言。

表示政策的数据可能如下所示:

PROVIDER_COMBOS = [
  ['A', 'B', 'O'],
  ['B', 'A', 'O'],
  ['A', '', 'A'],
  ['B', '', 'B'],
]

并且使用它的代码可能如下所示:

def lookup_provider_combo(provider1, provider2)
  PROVIDER_COMBOS.each do |key1, key2, result|
    if provider1[0] == key1 && provider2[0] == key2
      return result
    end
  end
  return 'Return nothing'
end

答案 4 :(得分:0)

从技术上讲,if..else语句不是嵌套的。它很平坦。此外,它在技术上已经处于最低复杂性的状态。这是相当简单的代码。它确实“看起来”凌乱。而使它看起来凌乱的是它的冗长(不要混淆复杂性的冗长/混乱)。

但你抱怨冗长是正确的。详细代码,尤其是具有大量重复位的代码,会损害可读性。对于示例中的代码,您可以做的第一个显而易见的事情就是将数组语法分解出来:

p1 = $provider[0][0];
p2 = $provider[1][0];

if (p1 == 'A' && p2 == 'B') {
   return 'O';
} elseif (p1 == 'B' && p2 == 'A') {
   return 'O';
} elseif (p1 == 'A' && p2 == '' ) {
   return 'A';
} elseif (p1 == 'B' && p2 == '' ) {
   return 'B';
} else {
   return 'Return nothing';
}

仅此一项就可以消除代码中的错误,使逻辑更加清晰。还有其他一些事情可以做,以从上面的代码中删除更多的重复位,使其更清晰,但它们都归结为上面的代码:基本上是一个条件和结果表。

switch语句接受字符串作为输入的语言中,您可以简单地将这两个条件连接成一个字符串作为切换条件:

switch (join([p1,p2],',')) {
    'A,B'   : return 'O'; break;
    'B,A'   : return 'O'; break;
    'A,'    : return 'A'; break;
    'B,'    : return 'B'; break;
    default : return 'Return nothing'; break;
}

这使你更清楚的是你正在做的是咨询一张桌子。或者,您可以使用三元运算符实现类似的布局:

cond = join([p1,p2],',');

return cond == 'A,B' ? 'O' :
       cond == 'B,A' ? 'O' :
       cond == 'A,'  ? 'A' :
       cond == 'B,'  ? 'B' :
       'Return nothing';

不可否认,仍有cond ==位重复。但是,与原始的if..else语句相比,查看表格要容易一些。

在具有字典/关联数组/散列的语言中,您可以简单地在数据结构中编码逻辑并简单地读取该数据结构:

conditions = {
    'A' : {
        'B' : 'O',
        ''  : 'A'
    },
    'B' : {
        'A' : 'O',
        ''  : 'B'
    }
}

result = conditions[p1][p2];

return result ? result : 'Return nothing';

或者您也可以使用以下数据结构:

conditions = {
    'A,B' : 'O',
    'B,A' : 'O',
    'A,'  : 'A',
    'B,'  : 'B'
}

result = conditions[join([p1,p2],',')];

return result ? result : 'Return nothing';

将条件逻辑保持为纯数据而不是代码使得我们正在查看表格更加明显。将条件保持为纯数据的另一个优点是,您可以通过从文件(或通过Internet上的套接字)读取数据结构来在运行时创建数据结构。例如,逻辑可以编码为JSON或YAML格式的文件,您可以使逻辑可编程。

正如您所看到的,有很多方法可以做到这一点,但这取决于您的编程语言中可用的功能。它们都具有相同的复杂性(大多数编译为相同的东西)。唯一的区别在于可读性和可维护性。