0

三項演算子の使用について、私のオフィスで議論が持ち上がりました。この議論には 2 つの側面があります。

側面 1) 三項演算子は読み書きが容易であるため、利便性は正味のコスト削減になります。

側面 2) 三項演算子は、少しでも複雑になるように変更する必要がある場合に余分なコード チャーンが必要になるため、保守が困難です。

この件に関して一流の機関によって行われた実際の研究を引用できる場合は、余分なオタクのポイント... これに関する確かなデータを見ることに非常に興味があります.


私の理論では、最良のコードは簡単に変更および適応できるコードであり、変更に必要な複雑さが少ないほど、中断の可能性は低くなります。例:

$id = $user->isRegistered() ? $user->id : null;

わかりました、これは完全に有効ですが、もう少し複雑なものにするためにコードを変更する必要がある場合はどうなるでしょうか?

$id = null;
if ($user->isRegistered() || $user->hasEmail()) {
    $id = $user->id;
}

正気のプログラマなら、三項を見て、標準の if/else に変換します。ただし、これには次のものから始めるのではなく、4 行の変更が必要でした。

if ($user->isRegistered()) {
    $id = $user->id;
}

1行の変更のみが必要です。

4

4 に答える 4

6

構文に慣れると、両方のオプションが同じように読みやすくなることがわかります(どちらかをやりすぎない限り)。したがって、それは私にとって問題ではありません。

どちらがより時間効率が良いかについては、私は厄介な質問で答えるつもりです-なぜあなたは気にしますか?どちらのオプションも、同等のifステートメントに変換するのに20秒もかかりません。

個人的には、プログラミング時間を数秒短縮する方法を見つけたとき、それは先延ばしの一形態であることがわかりました。私は物事を成し遂げることに集中しているときに最もよく働き、小さな読みやすさの詳細が経験を通してうまくいくようにします。

于 2009-10-26T17:57:03.313 に答える
3

あなたの例では、三項演算子に固執します。

   $id = ($user->isRegistered() ||  $user->hasEmail())? $user->id : null;

唯一の「分岐」が変数に割り当てられる値を決定することである限り、実行される実際の機能を潜在的に複製しないため、三者演算子は if-else 句よりも読みやすくなります (この場合 -これがコード "$id =") 論理条件が複雑になる場合は、それらを単純化します。

   bool $isReg    = $user->isRegistered(),
        $hasEmail = $user->hasEmail();
   $id = ($isReg || $hasEmail)?  $user->id : null;
于 2009-10-26T17:52:46.380 に答える
1

値が適切なブール条件に依存する 1 行の式がある場合は常に、三項演算子を使用するのが好きです。実際、変数への代入のどちらかを選択する必要があり、式 1 と式 2 のどちらかを選択できる場合、私はよく 3 項を使用します。

ただし、式に副作用がある場合は、すぐにすべてを if() ステートメントとして書き直します。フロー制御に三項演算子を使用すると、ほとんどの人がかなり混乱します。

于 2009-10-26T17:59:21.000 に答える
0

三項演算にはその場所があります。通常、簡単なタスクを実行するときにコードを単純化します。ただし、条件文が複雑になりすぎた場合は、ある時点で戦略を再考する必要があります。そのポイントいつになるかを判断することが課題になります。経験だけがあなたを導くことができます。

したがって、最終結果がクリーンで読みやすく、保守可能なコードである限り、「正しい」答えは 1 つではないと思います。この決定を行う際に、ステートメントの余分なコード行をif考慮する必要さえありません (コードの行数は、コードの複雑さと必ずしも 1 対 1 で相関するとは限らないためです)。

于 2009-10-26T18:03:05.733 に答える