2

次のように条件が長い場合があります。ステートメントが評価されるためには、両方とも満たされてはならない 2 つの条件があります。&& と ! がたくさんあるワンライナーとして持っていました。しかし読めなくなった。最初のブロックにはコードが含まれ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);
}
4

5 に答える 5

3

「抽出メソッド」リファクタリングを使用できます。条件を新しい方法に置き換えます。

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);
}

新しいメソッドでは、すべての比較を別の行に入れます。

PS メソッドの長い名前を恐れないでください。

于 2013-04-17T00:17:12.353 に答える
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 == '>';
}

-- 基本的に同じことを 2 回行っています。そのための関数について考える時間です。

于 2013-04-17T00:11:06.500 に答える
1

2 つの初期条件は何もしないため、条件を否定してifandの部分をスキップするだけです...else 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);
 }
于 2013-04-17T00:05:56.543 に答える
0

サブ式を変数に引き出します。疑似例:

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

if (isFrob) {
   // ...
于 2013-04-17T00:12:08.337 に答える
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
}
于 2013-04-17T00:06:27.573 に答える