编码样式 - 如何格式化long if条件以使其可读

时间:2013-04-16 23:59:34

标签: php coding-style

我有一个很长的if条件如下。对于要评估的陈述,有两个条件都不能满足。我确实把它作为一个带有很多&&和而且!但它变得难以理解。我已尝试将其拆分为if elsif else,因为第一个if elsif块中没有代码,所以if ($instructionObject->instruction=='nesting_grammar' && $instructionObject->match=='>'){ //if instruction is a '>' child indicator //don't change the child depth }else if ($instructionObject->instruction=='selector' && is_object($this->instructions[$key+1]) && $this->instructions[$key+1]->instruction == 'nesting_grammar' && $this->instructions[$key+1]->match == '>'){ //if instruction is a selector followed by a '>' //don't change the child depth }else{ $insertOffset += $childDepth; unset($childDepth); } 更易读,但读取效果不佳。

整理此代码块的最佳做法是什么?

{{1}}

5 个答案:

答案 0 :(得分:3)

您可以使用“extract method”重构。将您的条件替换为新方法。

if ($this->isInstructionNestingGrammar($instructionObject)){ 
   //don't change the child depth
}else if ($this->isIntructionSelect($instructionObject)){ 
   //don't change the child depth
}else{
   $insertOffset += $childDepth;
   unset($childDepth);
}

在新方法中,将每个比较放在单独的行中。

P.S。不要怕长名称的方法。

答案 1 :(得分:1)

只是否定条件并跳过ifelse if部分,因为两个初始条件没有做任何事情......

if (
     !($instructionObject->instruction=='nesting_grammar' && 
       $instructionObject->match=='>') 
    || !($instructionObject->instruction=='selector' 
        && is_object($this->instructions[$key+1]) 
        && $this->instructions[$key+1]->instruction == 'nesting_grammar' 
        && $this->instructions[$key+1]->match == '>')
 ) {
   $insertOffset += $childDepth;
   unset($childDepth);
 }

答案 2 :(得分:1)

不是直接回答你的问题,而是如下:

if (my_check($instructionObject) || $instructionObject->instruction=='selector' && my_check($this->instructions[$key+1])) {
} else {
   $insertOffset += $childDepth;
   unset($childDepth);
}

function my_check($obj) {
    return is_object($obj) && $obj->instruction == 'nesting_grammar' && $obj->match == '>';
}

- 你基本上做了两次同样的事情,是时候考虑一​​个功能了。

答案 3 :(得分:0)

就个人而言,如果我要跨越多行检查,我会将其列为类似于我如何布置JavaScript对象;

if (
    great big long check line goes in here &&
    another really long ugly check line goes in here too
) {
   // Do this code
}
else if (
    check 3 &&
    check 4
) {
    //Do this code
}

答案 4 :(得分:0)

将子表达式拉入变量。伪示例:

flibjit = FlibjitManager.FlibjitInstance(this);
isFrob = 
    (flibjit.Froblocity >= FlibjitManager.FrobThreshold) &&   
    (flibjit.Type == FlibjitTypes.Frobby);

if (isFrob) {
   // ...