switch
いくつかのケースを処理する構造があります。switch
動作enum
を組み合わせた値によって重複したコードの問題を提起しています:
// All possible combinations of One - Eight.
public enum ExampleEnum {
One,
Two, TwoOne,
Three, ThreeOne, ThreeTwo, ThreeOneTwo,
Four, FourOne, FourTwo, FourThree, FourOneTwo, FourOneThree,
FourTwoThree, FourOneTwoThree
// ETC.
}
現在、switch
構造は各値を個別に処理します。
// All possible combinations of One - Eight.
switch (enumValue) {
case One: DrawOne; break;
case Two: DrawTwo; break;
case TwoOne:
DrawOne;
DrawTwo;
break;
case Three: DrawThree; break;
...
}
そこにアイデアがあります。私は現在、これをスタックif
構造に分割して、代わりに単一行での組み合わせを処理しています:
// All possible combinations of One - Eight.
if (One || TwoOne || ThreeOne || ThreeOneTwo)
DrawOne;
if (Two || TwoOne || ThreeTwo || ThreeOneTwo)
DrawTwo;
if (Three || ThreeOne || ThreeTwo || ThreeOneTwo)
DrawThree;
これは非常に長い論理評価の問題を引き起こし、読みにくく、維持するのが困難です。これをリファクタリングした後、私は代替案について考え始めswitch
、ケース間のフォールスルーを伴う構造のアイデアを考え始めました。
フォールスルーを許可しないためgoto
、その場合はaを使用する必要がありますC#
。ただし、switch
構造内でジャンプしても、信じられないほど長いロジックチェーンを防止し、コードの重複をもたらします。
switch (enumVal) {
case ThreeOneTwo: DrawThree; goto case TwoOne;
case ThreeTwo: DrawThree; goto case Two;
case ThreeOne: DrawThree; goto default;
case TwoOne: DrawTwo; goto default;
case Two: DrawTwo; break;
default: DrawOne; break;
}
これはまだ十分にクリーンなソリューションではなく、goto
回避したいキーワードに関連したスティグマがあります。これをきれいにするもっと良い方法が必要だと思います。
私の質問
読みやすさと保守性に影響を与えずにこの特定のケースを処理するより良い方法はありますか?
goto
、高レベルの構造は、あなたの言語に存在しない場合。私は時々あったことを望むfallthru
; その特定の使用法を取り除くためのキーワードですgoto
が、まあまあです。
goto
C#のような高レベル言語でを使用する必要があると感じた場合、他の多くの(そしてより良い)設計や実装の代替案を見落としている可能性があります。非常にがっかりしました。