OK、最初に if/else ステートメントを使用した明白な解決策:
var c = b.clone();
if ( b.data("letter") == target.data("letter") ) {
c.addClass("wordglow3");
hit.play();
} else {
c.addClass("wordglow");
miss.play();
}
c.appendTo(table).css(…);
ここで、変数を使用して重複コードを削除できます。
var className, sound;
if ( b.data("letter") == target.data("letter") ) {
className = "wordglow3";
sound = hit;
} else {
className = "wordglow";
sound = miss;
}
b.clone().addClass(className).appendTo(table).css(…);
sound.play();
または、デフォルトで初期化することでさらに短くなります。
var className, = "wordglow",
sound = miss;
if ( b.data("letter") == target.data("letter") ) {
className += "";
sound = hit;
}
…
三項演算子の使用は難しくなります。コンマ演算子を使用して、同じ式で異なるアクションを連鎖させることができます。
b.clone().addClass( b.data("letter") == target.data("letter")
? hit.play(), "wordglow3"
: miss.play(), "wordglow"
).appendTo(table).css(…);
しかし、これは醜いです。より良い選択は、条件に変数を使用し、2 つの三項演算子を使用することです。
var success = b.data("letter") == target.data("letter");
b.clone().addClass(success ? "wordglow3" : "wordglow").appendTo(table).css(…);
(success ? hit : miss).play();
ここまで来たら、何百万もの (特にネストされた) if ステートメントをキーによる選択に置き換えるために、サウンドとクラス名の追加のデータ構造を検討することもできます。
// global:
var sounds = { // or use an arrays
"0": …, // miss
"1": … // hit
};
var classes = {
"0": "wordglow",
"1": "wordglow3"
};
// […]
// then, select values by casting the boolean to numeric keys:
var success = b.data("letter") == target.data("letter");
b.clone().addClass(classes[+success]).appendTo(table).css(…);
sounds[+success].play();
これにより、他のケースでアプリケーションを簡単に拡張でき、使用されているクラス名またはサウンドがどこでもこのように使用されている場合、(中央の場所で) メンテナンスが容易になります。hit
また、2 つの変数をmiss
1 つだけに減らしましたsounds
。
どのコード スニペットが最も読みやすいか、または状況に最も適しているかを自分で判断してください。