2016-08-03 5 views
2

次のコードサンプルが与えられた場合、より良いと思いますか、これをより洗練された方法でコーディングする別の方法が考えられますか?重複したコードの場合または重複した条件の場合

if(a || b) { 
    doAB(); 
} 
if(b) { 
    doB(); 
} 

重複コード(2回doAB())(2回 'B' をチェックする)場合で

重複条件:

if(a) { 
    doAB(); 
} 
if(b) { 
    doAB(); 
    doB(); 
} 

または混合...

if(a || b) { 
    doAB(); 
    if(b) { 
    doB(); 
    } 
} 

編集:

同僚は、この提案された:私は最初のものを推測してい

int mask = a?1:b?2:0; 
switch(mask) { 
    case 2: 
    doB(); 
    case 1: 
    doAB(); 
} 
+0

何をしますか? –

+2

2つ目のスニペットは機能的に間違っている可能性があります。なぜなら 'a'と' b'の両方が真であれば 'doAB()'を2回呼び出すからです。 – Eran

+0

私は重複したコード –

答えて

2

完全に異なる考え方です:if/elseの使用を避けてください。

OO言語では、if/elseの代わりに多態性を使用できます。何らかの状態を求めるのではなく、特定のメソッドを呼び出す。あなたは単にオブジェクトのメソッドを呼び出すだけです。オブジェクトの型はメソッドが正しいことを確実にします。

つまり、ある時点で、どの具体的なクラスをインスタンス化する必要があるかを決定します。後で、あなたはもう心配しません。

あなたが知っているのは、の場合でも、(キーワード/言語ビルドintとして)のsmalltalk言語はありません。

もちろん、別のものと入れ替わってはいけません。代わりに、あなたは一歩前に戻って、あなたの問題がどのように再構成されているかを把握することができます。多型を利用する。

ここではかなり良いと言えば、videoこれは実際にどのように見えるのでしょうか?

+0

しかし、この例では、ブーリアン型のプリミティブを持っています...どのようにオーバーロードを計画していますか?ブール値をとり、その値に基づいて2つの異なるクラスをインスタンス化するファクトリを作成することを意味しましたか?もしそうなら、それはif/elseを避けるために頼りにする極端な方法です。どうぞあなたは詳しく教えていただけますか? – Palcente

+0

@Palcente質問は次のとおりです。「a」はどこから来たのですか?そして、そうです、それはまさにOOデザインがいかにうまく機能しているかということです。あなたのビジネスロジック、本当に「実際の仕事」をするオブジェクト、まれに「新しい」ものを使うことはほとんどありません。代わりに、* framework *はオブジェクトを作成します。構成情報、または他のメタ情報に基づいて決定することができる。そして、すべてのオブジェクトが作成されたら、メソッド呼び出しを行います。あなたが好奇心が強いなら、私はビデオに回すことをお勧めします(私の答えにリンクが追加されています)、30分過ごしました。毎秒に値する! – GhostCat

+0

は、ありがとう – Palcente

4

を二番目の可能性が最も高い誤っている与えられた最高です。シンプルでエラーが起こりにくいフォームを使用します。もしそうであれば

第二の例のように、ほとんどが

if (a) { 
    doAB(); 
} else if (b) { 
    doAB(); 
    doB(); 
} 

をする必要があり、それはBすることはできませんし、その逆

が、その場合には次の2つの条件を必要としません。これは==!b

// a || b is always true 
doAB(); 
if(b) { 
    doB(); 
} 
+1

これは、aとbの両方が偽である場合もあります。 –

+0

@danielspその場合、エラーが発生しにくいので、最初のオプションを使用します。 –

関連する問題