2010-12-03 23 views
7

ほぼが同じように実行する3つのC#メソッドがあります。具体的には、大量のコードの繰り返しがありますが、最終的には異なる機能を実行します。コードの重複を回避する方法

これは明らかに非常に非効率的なので、コードの重複を減らすにはどうすればよいでしょうか? 1つの方法ですべてを配置し、最後に異なる機能のスイッチ&列挙型を使用する必要がありますか?別の方法として、3つの別々のクラスを持ち、共有ビットを別のクラスから継承することができますか?私はこれについて、そして私が集めることができるものからかなり読んだことがありました。これは、異なるクラス全体からプロパティを取得するためにのみ使用されています。

+1

(私は、=>「重複」を「再利用」置換明確に) –

+0

"1つの方法ですべてを配置し、最後にさまざまな機能にスイッチと列挙型を使用する必要がありますか?"しないでください! – SingleNegationElimination

+0

あなたはこの質問に有益な答えを得られません.3つの方法のコードを含む質問を投稿してみてください。そうすれば人々があなたを助けることができます。コードをリファクタリングするソリューションはありません。 –

答えて

5

具体的な例を与えるのは難しいが、のメソッドに代理インスタンスを渡したいと思うように思える。

+0

私の考えはちょうど –

+0

ありがとうSteven、正確に私が探していたことが分かります。私がコード例を提供しなかったことの謝罪は、私は次回には確信しています。 – Jonathan

4

私の視点からは、紙とペンで座ってください。メソッドが実行するすべての機能を引き出します。ファンクション/メソッドはと1つだけということを覚えておいてください。

すべての機能を停止した後は、繰り返されるものが表示され始めます。これらの機能は、1つの機能でグループ化する必要があります。

+1

+1責任の原則に言及するために+1:クラスと関数は、いくつかのことをすべきですが、それらをうまくやる必要があります。 http://en.wikipedia.org/wiki/Single_responsibility_principle –

2

は、次のような何かを行うことができます:

public void MethodBase() 
    { 
     Console.WriteLine("1"); 
     Console.WriteLine("2"); 
     Console.WriteLine("3"); 
     Console.WriteLine("4"); 
     Console.WriteLine("5"); 
    } 

    public void Method1() 
    { 
     MethodBase(); 
     Console.WriteLine("Method 1"); 
    } 

    public void Method2() 
    { 
     MethodBase(); 
     Console.WriteLine("Method 2"); 
    } 

    public void Method3() 
    { 
     MethodBase(); 
     Console.WriteLine("Method 3"); 
    } 
+0

デシクロンありがとうございました。私は、MethodBase()がMethod1、Method2、Method3からアクセスする必要のある変数をいくつか設定していることを忘れていました。これは、スティーブンがアドバイスしたように、デリゲートインスタンスを使用する必要があることを意味しますか? – Jonathan

+0

私はそう思います。 – decyclone

4

私は主に が同じことを行う3つのC#のメソッドを持っています。 コードの繰り返しが多くありますが、最終的には はどちらも異なる機能を実行します。

この行を読んで、私はあなたの3つの方法が異なるシナリオに基づいて異なる実装をしていると考えています。

だから私はStratgey Patternを一度見ておくことをお勧めします。 See here

2

すべての場合に機能する解決策はありません。私たちにコードを示してください。

問題は、コードを1つの関数に入れて、コードの複雑さを高めたり、重複したコードを保持する方がよい場合があることです。

ほとんど同じ引数が継承に使用されます。共通のコードを共通の祖先クラスに簡単に埋め込むことができますが、コード再利用ツールとして継承を日常的に使用し始めると、デザインが痛みの世界に入り込む可能性があります。継承とは、あるコードのコードが他のコードの動作に影響を与える可能性があることを意味します。そのコードを知る前に、コードを変更せずに変更することはほとんど不可能です。

の3つの機能の共通部分を意味するを抽出または抽象化することができます。コヒーレントな作業をしない一般的な行の代わりに、高いレベルのパターンのような意味があります。抽出されたコードに名前を付けるのに役立つ単純なルール:チャンクに名前を付ける明白で自然な方法はありますか?それは明らかにあなたのクラスの一つに合っていますか?もしそうなら、良い解決策かもしれません。それを命名するのに苦労し、どこにでも行くことができれば、もう少し考えてみたいかもしれません。

2

あなたはそれより高次または汎用機能することによって、方法を一般化しようとすることができます。他にも、Templateメソッドのようなデザインパターンがあり、アルゴリズムのスケルトンを定義し、サブクラスが特定のステップを再定義できるようにします。

3

これはあなたに不具合があることを示す良い兆候です。

これは非効率(少し余分なメモリ使用量)は明らかに

非常に非効率的であるこれらの日少なくとも重要な部分です。 crucuialは、それが維持の悪夢であるということです。たとえば、ルーチンにバグを見つけて修正する場合は、重複したコードを修正することを忘れないようにする必要があります。できるだけ重複したコードを除外したいのは間違いありません。

また、3つの異なるクラスを持ち、共有ビットを別のクラスから継承できる方法はありますか?私はこれについて、そして私が集めることができるものからかなり読んだことがありました。これは、異なるクラス全体からプロパティを取得するためにのみ使用されています。

サブクラスは、そのスーパークラスのすべての公開メンバーと保護されたメンバーに直接アクセスできます。たとえば、Poop()メソッドを持つAnimalクラスがある場合、DogサブタイプとCatサブクラスは、その最適化コードを共有できます。

は、しかし、この猫をスキニングの方法の多くがあります。より詳細な情報がなくても最高のものを言うのは難しいです。

1
public MyCustomObject MethodBase(MyCustomObject myObj) 
{ 
    myObj.Name="FixedName"; 
    myObj.Surname="FixedSurname"; 
    myObj.Type = Types.Human; 
    return myObj; 
} 


public MyCustomObject SetOld(MyCustomObject myObj) 
{ 
    MethodBase(); 
    myObj.IsOld = True; 
    return myObj; 
} 

public MyCustomObject SetYoung(MyCustomObject myObj) 
{ 
    MethodBase(); 
    myObj.IsOld = False; 
    return myObj; 
} 

public MyCustomObject SetIsDead(MyCustomObject myObj) 
{ 
    MethodBase(); 
    myObj.IsDead = True; 
    return myObj; 
} 
public void MainMethod(enum OperationType) 
{ 
    MyCustomObject myObj = new MyCustomObject(); 
    switch(OperationType) 
    { 
     case OperationTypes.Old: 
      myObj = SetOld(myObj); 
      break; 
     case OperationTypes.Young: 
      myObj = SetYoung(myObj); 
      break; 
     case OperationTypes.Dead: 
      myObj = SetDead(myObj); 
      break; 
    } 
} 
0

誰もラムダ関数を言及していない、彼らは、.NET 3.5の開発者のために知っているために必要されています。より多くのあなたの意味に合うように見えたとして

public MyCustomObject SetYoung(MyCustomObject myObj) 
{ 
    GeneralMethod(myObj => myObj.IsOld = False); 
    return myObj; 
} 

public void GeneralMethod(Func<TSourceObjectType,TResultObjectType> func) 
{ 
    MyCustomObject myObj = new MyCustomObject(); // MyCustomObject implements 'TSourceObjectType' 
    TResultObjectType res = func(myObj); 
} 
関連する問題