2010-12-15 14 views
2

などがあります。たとえば、以下のようなif elseがある場合は、これが何らかのデザインのpaternに該当するかどうかを知りたい場合は、任意のguidenceは本当に一般的に///他のブロックがどんなデザインパターンにも該当する場合は、他のブロックがある場合は、

if(dotcom){ 
    else if (frenc){} 
    else if (german){} 
    else if (brazil){} 
    else if (someothercountry){} 
// and the else if block goes on 
    else {} 
    } 

答えて

1

サンプルを高く評価され、他のブロック

場合、それはswitchあまりにも多くを持っているコードのにおいだその書き込みが 良いそう多くはないと思いますステートメントとif-else ifが好きそれ。 2つの解決方法があります

  1. あなたは、一般的に実行されることになるだろうコードスニペットを把握するために、あなたのオブジェクト指向言語によって提供される仮想メソッドディスパッチ機構に便乗すべきです。 abstractベースクラスを使用して、各条件ごとにクラスを作成する必要があります。各クラスで、ビヘイビアをカスタマイズするメソッドをオーバーライドします。

  2. ルックアップテーブルを使用します(特定の質問では、これはおそらくより関連性が高いと考えられますが、これはすべてのパスに似たコードを持っていても変数によっては異なる値に依存する場合に便利です)。

この種のブロックには正当なユースケースがあり、大きなオブジェクト階層は必ずしも価値があるとは思えません。これはコードのにおいであり、厳しいルールではありません。

+0

@afshariが、私はあなたがコードを記述する必要はありません、あなたの時間と助けてくれてありがとう、仮想メソッドのディスパッチメカニズムの例のいくつかのリンクを私に提供することができます – kobe

+0

@ gov:基本的には、仮想メソッドを持つ抽象的なベース/インターフェイスがあります。各サブクラス(現在のコードの単一の 'if'ブランチを表す)では、仮想メソッドをオーバーライドすることによって、そのブランチに固有の何かを行います。クライアントコードは単にそのメソッドを呼び出すだけです。 –

2

です。それが間違っているか反復的であると感じたら、おそらくもっと良い方法でしょう。

あなたの例は、ローカリゼーションの問題のようです。 .NETを使用しているので、System.Globalization名前空間を見て、UIローカリゼーションのようなものがオブジェクト指向の方法でどのように処理されるかについてのヒントを得ることができます。

特定の状況でif/elseの代わりに使用する正確なパターンは、中括弧の中身によって異なります。異なる国では、PopulationやUrl Suffixなどのプロパティの値が異なります。私がそこに行く前にビザを申請する? "後者を想定してみましょう。これはおそらく99%の時間に当てはまります。基本的に、あなたはこのようなものを持っている場合:

public class Country 
{ 
    public string Name { get; set; } 
    public string DefaultLanguage { get; set; } 
    public bool NeedToApplyForAVisaFirst { get; set; } 
    public string DefaultWordForClickHere { get; set; } 
} 

コードから行くことができます。

if ("france") 
{ 
    button.Text = "French(Fr) for 'Click Here'"; 
} 
else if ("brazil") 
{ 
    button.Text = "Portuguese(Br) for 'Click Here'"; 
} 
..... 

へ:

button.Text = User.Country.DefaultWordForClickHere; 
関連する問題