0

入れ子になった IF ステートメントの大規模なグループがあり、速度、サイズ、読みやすさを最適化する方法について何か提案があるかどうか疑問に思っていました。

以下は、if ステートメントの 1 つとそのネストされたステートメントのサンプルです。ドキュメントには、これらのうち約 25 ~ 30 個が含まれます。

if( $row["inlet_moisture"] > $row["inlet_moisture_high_warning"] ) {
    if( $row["inlet_moisture"] > $row["inlet_moisture_high_critical"] ) {
        if( $row["inlet_high_critical"] == 0 ) {
            if( $row["email_notification"] == 1 ) {

            }
            if( $row["mobile_notification"] == 1 ) {

            }
        }
    } else {
        if( $row["inlet_high_warning"] == 0 ) {
            if( $row["email_notification"] == 1 ) {

            }
            if( $row["mobile_notification"] == 1 ) {

            }
        }
    }
} else if( $row["inlet_moisture"] < $row["inlet_moisture_low_warning"] ) {
    if( $row["inlet_moisture"] < $row["inlet_moisture_low_critical"] ) {
        if( $row["inlet_low_critical"] == 0 ) {
            if( $row["email_notification"] == 1 ) {

            }
            if( $row["mobile_notification"] == 1 ) {

            }
        }
    } else {
        if( $row["inlet_low_warning"] == 0 ) {
            if( $row["email_notification"] == 1 ) {

            }
            if( $row["mobile_notification"] == 1 ) {

            }
        }
    }
}

アイデアは次のとおりです。読み取り値(温度/速度/水分)があり、それがいずれかの制限 (高警告 / 高クリティカル / 低警告 / 低クリティカル) に達しているかどうかを確認する必要があります。そのためのアラーム。アラームが送信されていない場合は、ユーザーがアラーム通知 (モバイル/電子メール/両方) を要求したかどうかを確認する必要があります

現在、これは機能します。私はそれがどれほど重いのが好きではないのですか?これを改善できますか?

ありがとう。

4

2 に答える 2

2

時期尚早の最適化はすべての悪の根源です-私たちがここで扱っていることで、あなたが何をしても、それはパフォーマンスにあまり/目立った影響を与えません。

そうは言っても、パフォーマンスが向上するのか読みやすさが向上するのかは議論の余地がありますが、多くの場合、大量のifステートメントを1つ以上のswitch構造に置き換えることができます。また、コードの繰り返しビットに対していくつかの関数を作成できる場合もありますが、これは実際にはパフォーマンスに悪影響を与える可能性があります。

上記のコメントから...より良い名前で変数を作成しても、パフォーマンスへの影響はほとんどありません。がメモリ使用量をわずかに増加させますが、処理時間の影響はほぼゼロになります。また、値をブール値として評価する場合は、値を明示的にブール値に変換する必要はありません。これは、1がまだ評価されTRUE、0がに評価されるためFALSEです。しかし、あなたがそれをしたいのなら

$email_notification = $row["email_notification"] == 1 ? true : false;

...不必要に長蛇の列ができている場合は、次のいずれかを実行できます。

$email_notification = $row["email_notification"] == 1;

...また...

$email_notification = (bool) $row["email_notification"];

...そしてそれは同じ効果をもたらします。

于 2011-09-12T15:47:59.023 に答える
2

ネストされたifを組み合わせることができたとしても、これは私にははるかに明確に思えます。

if( $row["inlet_moisture"] > $row["inlet_moisture_high_critical"] ) {
  if( $row["inlet_high_critical"] == 0 ) {
   $message = 'the pertinent message';
  }
}
else if( $row["inlet_moisture"] > $row["inlet_moisture_high_warning"] ) {
  if( $row["inlet_high_warning"] == 0 ) {
   $message = 'the pertinent message';
  }
}
else if( $row["inlet_moisture"] < $row["inlet_moisture_low_critical"] ) {
  if( $row["inlet_low_critical"] == 0 ) {
   $message = 'the pertinent message';
  }
}
else if( $row["inlet_moisture"] < $row["inlet_moisture_low_warning"] ) {
  if( $row["inlet_low_warning"] == 0 ) {
   $message = 'the pertinent message';
  }
}


if( $row["email_notification"] == 1 ) {
  sendMessage($message, $email);
}
if( $row["mobile_notification"] == 1 ) {
  sendMessage($message, $mobile);    
}
于 2011-09-12T15:56:12.427 に答える