web-dev-qa-db-ja.com

やや苦しいトリプルネストされた三項演算子

Raphael.jsのソースコードを使用して、RGB値をHSBに変換した方法を確認します。彼がそれをやった関数を見つけたので、これをPythonに変換する過程にありました。

H = (C == 0 ? null :
    V == r ? (g - b) / C :
    V == g ? (b - r) / C + 2 :
             (r - g) / C + 4
    );

PythonにはJavascriptと同じ種類の三項演算子がないので、ループを投げました。その他)

if (C == 0) {
    H = null;
} else {
    if(V == r) {
        H = (g - b) / C;
    } else {
        if(V == g) {
            H = (b - r) / C + 2;
        } else {
            H = (r - g) / C + 4;
        }
    }
}

私の解釈は正しかったですか?私がこれを尋ねているのは、それが正しくない場合、デバッグのlotに直面しているからです。そう。私は「それを手に入れました」か?

24

深いネストを回避するためにこれを使用できると思います:

var H

if(C == 0){
    H = null;
}
else if(V == r){
    H = (g - b) / C;
}
else if (V == g){
    H = (b - r) / C + 2;
}
else {
    H = (r - g) / C + 4;
}
26
Joseph

私の個人的な好みでは、入念に配置された入れ子になった3項がif-elseの混乱を打ち負かします。

const H =
  C == 0 ? null            :
  V == r ? (g - b) / C     :
  V == g ? (b - r) / C + 2 :
           (r - g) / C + 4 ;
H = C == 0 
    ? null 
    : V == r 
        ? (g - b) / C 
        : V == g 
            ? (b - r) / C + 2 
            : (r - g) / C + 4

このインデント配置パターンを使用するDan Abramovを見てきました。条件演算子?は視覚的に条件に従いません。@ lolmausの例のようなものよりも、条件のサイズに関係なくインデントが常に一貫するという点でこれを好みます。

あなたは実際にそれを? true : false。ここでは視覚的に直感的です。そして、このように、3進法は、周囲のコードを見つけて区別するのがはるかに簡単だと思います。

6
ssomnoremac

同じロジックをより簡単な方法で作成できます。

var H

if (C == 0)
    H = null;
else if (V == r)
    H = (g - b) / C;
else if (V == g)
    H = (b - r) / C + 2;
else
    H = (r - g) / C + 4;

各条件に単一のステートメントがあるため、中括弧を省略することができます。そして、条件が相互に排他的であるとすると、else ifは、ifsをネストするよりもずっと明確です。

5
Óscar López

JavaScriptコードベースに問題のようなネストされた3項ステートメントが含まれている場合、代わりにフォーマットを デイジーチェーン3項ステートメント に変換することを検討してください。

H = (C == 0)           // Is C zero?
    ? null
    : (V == r)         // Is V equal to r?
    ? (g - b) / C
    : (V == g)         // Is V equal to g?
    ? (b - r) / C + 2
    : (r - g) / C + 4; // Fallback (default) value

彼らは単に真っ直ぐに上から下まで読み、真実の状態またはフォールバックに達するとすぐに値を返します。

ネストされた3項は素晴らしい、エリックエリオット

はい、そうです(大文字と小文字の違いは別として)。しかし、それは括弧なしできれいに書かれ、elseifとして読みやすいかもしれません:

if (C == 0)
    h = null;
else if (V == r)
    h = (g - b) / C;
else if (V == g)
    h = (b - r) / C + 2;
else
    h = (r - g) / C + 4;
2
Bergi