三項演算子はバグ/欠陥注入の傾向がありますか?
-
06-07-2019 - |
質問
私のオフィスで、三項演算子の使用に関する議論がありました。この議論には2つの側面があります。
サイド1)三項演算子は簡単に読み書きできるため、利便性は純コストの節約になります。
サイド2)三項演算子は、少しでも複雑になるように変更する必要がある場合、余分なコードチャーンが必要になるため、保守が困難です。
このテーマに関して一流の機関が行った実際の研究を引用することができる場合、余分なオタクがあります...これに関するハードデータを見ることに非常に興味があります。
私の理論では、最良のコードは簡単に変更および適応できるコードであり、変更に必要な複雑さが少ないほど、中断の可能性は低くなります。例:
$id = $user->isRegistered() ? $user->id : null;
OK、これは完全に有効ですが、コードを少し複雑にするためにコードを変更する必要がある場合はどうなりますか?
$id = null;
if ($user->isRegistered() || $user->hasEmail()) {
$id = $user->id;
}
正気のプログラマなら誰でも三値を見て、標準のif / elseに変換します。ただし、次のように開始するのではなく、4行の変更が必要でした。
if ($user->isRegistered()) {
$id = $user->id;
}
1行の変更のみが必要です。
解決
構文に慣れると、両方のオプションが同等に読みやすくなります(どちらも使いすぎない場合)。したがって、それは私にとっては問題ではありません。
より時間効率の良い方法については、不快な質問に答えます-なぜ気にしますか?どちらのオプションも、同等のifステートメントに変換するのに20秒もかかりません。
個人的には、プログラミング時間を数秒削る方法を見つけているとき、それは先延ばしの一形態であることがわかります。物事を成し遂げることに専念し、経験を通じて小さな読みやすさの詳細を自分自身で解決できるようにしたときに、私は最高の仕事をします。
他のヒント
私はあなたの例ではternery演算子に固執します。
$id = ($user->isRegistered() || $user->hasEmail())? $user->id : null;
唯一の" branch"変数にどの値を割り当てるかを決定します。実行される実際の機能を複製する可能性がないため、ternery演算子はif-else句より読みやすいです(この場合-これはコード" $ idです=") 論理条件が複雑になる場合は、単純化します。
bool $isReg = $user->isRegistered(),
$hasEmail = $user->hasEmail();
$id = ($isReg || $hasEmail)? $user->id : null;
値が適切なブール条件に依存する1行の式がある場合は、必ず三項演算子を使用します。実際、変数への代入を選択する必要があり、式1と式2のいずれかを選択できる場合、しばしば3項を使用します。
ただし、式に副作用がある場合は、すぐにif()ステートメントとして全体を書き換えます。フロー制御に三項演算子を使用することは、ほとんどの人にとってかなりわかりにくいです。
3項作戦には場所があります。通常、簡単なタスクを実行するときにコードを簡素化するためです。ただし、ある時点で、条件文が複雑になりすぎた場合は、戦略を再考する必要があります。そのポイントがいつチャレンジになるかを決定します。その場合、経験のみがあなたを導きます。
つまり、「正しい」ものはないと思います。最終結果がクリーンで読みやすく、保守可能なコードである限り答えてください。 if
ステートメントの追加のコード行は、この決定を行う際に考慮する必要さえありません(コードの行数は必ずしもコードの複雑さと1対1を関連付けるとは限らないためです) 。)