背景

我遇见不少人都是这样,多层逻辑嵌套,看似条例清晰、逻辑关系明了。实际上读起来真的很费力。看个最简单的例子,一吧友A想要发一个帖子宣传xx产品,需要征求所有吧主(bz1,bz2)一致同意后才可以发帖。

方案 

有人可能会这样写:

function getPostAgree(){
    $agree = false; //flag
    if ($bz1 == "agree){
        $agree = true;
        if ($bz == "agreem){
            $agree = true;
        }else{
            $agree = false;
        }
    } else {
        $agree = false;
    }
 return $agree;
}

看上去很自然. 逻辑也很清楚,bz1同意了之后bz2再同意肯定就没啥问题了.
有人会这样写:

function getPostAgree(){
    $agree == false; //flag
    if($bz1 == 'agree' && $bz2 == "agree"){
        $agree = true;
    }else{
        $agree = false;
    }
    return $agree;
}

这样看上去逻辑更加清楚了,两个吧主同时同意.
还有第三种 第四种:

function getPostAgree(){
    $agree == false; //flag
    if($bz1 == 'disagree'){
        return $agree;
    }
    if($bz2 == 'disagree'){
        return $agree;
    }
    return $agree=true;
}
function getPostAgree(){
    $agree == false; //flag
    $bz = [$bz1,$bz2];
    if(!in_array('disagree',$bz)){
     $agree=true;
}
return $agree;

以上看上去都行得通,那么现在又多个1个吧主呢?10个呢?50个呢?
第一个嵌套50个if - else
第二个写49个&&
第三个写50个if
第四个,变成50的数组。而且,同时可以分离出所有bz

$bz = [$bz1,$bz2];
function getPostAgree()
{
    global $bz;
    $agree = false; //flag
    $agree == !in_array("disagree", $bz);
    return $agree;
}

如何改进?

  • 嵌套逻辑用平行逻辑代替
  • 使用表驱动减少判断
  • 不是必要的if-else,能不else就别else,不要if-elseif-elseif...-elseif-else
  • if-return 代替 if-else
    .....