0

基になるソースを変更する必要がない(そのレベルでは実際には「私の」コードではない、そうでない場合は変更したい)という状況に遭遇しましたが、2つのほぼ同じコードパスがありますが、私が使用している別々のタイプのデータ。

おそらく一方を他方にかなり簡単に変換できることを無視すると、同様のは「Circle」オブジェクトになります。

一方では、Pointオブジェクトと半径があります。一方、私はCircleオブジェクトを持っています。これらは両方とも同じ実際の円を表すことができますが、私は一方を別の円に変換することはできません。

次に、私のコードでは、次のようになります。

void Run(Circle circle)
{
    if(AllNegative(circle))
    {
        // ...
        // Do unrelated stuff
        // ...
        ColorCircle(circle);
        // ...
    }
}

void Run(Point pt, uint radius)
{
    if(AllNegative(pt, radius))
    {
        // ...
        // Do unrelated stuff
        // ...
        ColorCircle(pt, radius);
        // ...
    }
}

bool AllNegative(Circle circle) { return (circle.AllNegative); }
bool AllNegative(Point pt, uint radius) { return ((pt.X + radius) < 0) && ((pt.Y + radius) < 0); }

void ColorCircle(Circle circle) { /* ... */ }
void ColorCircle(Point pt, uint radius) { /* ... */ }

もちろん、Runこの例よりも多くのコードが含まれています。

Runコードの重複を最小限に抑えるために、単一の関数にマージするにはどうすればよいですか?

4

4 に答える 4

1

ジェネリックの例:

public interface ICircle
{
    Point Point{get;}
    uint Radius{get;}
    ... add whatever you need
}

public class MyCircle: ICircle
{
   private Circle _circle;
   ... implement interface
}

public class MyCircle2: ICircle
{
   private Point _point;
   private uint _radius;
   ... implement interface
}

void Run<T>(T circle) where T: ICircle
{
    if(AllNegative(circle))
    {
        ColorCircle(circle);
    }
}
于 2010-12-07T18:21:37.437 に答える
1

この場合、次の 2 つの方法があります。

  1. オーバーロードされたメソッドなど、現在の状態のままにしておくことができます。
  2. 重複したコードを新しいメソッドに移動します。セクションで円の直径を計算する場合unrelated(現実的かどうかに関係なく)、メソッドを作成しますcalcDiameter(radius)

この種の状況で重複したコードに本質的に問題があるわけではありませんが、それが新しいメソッドを実際に実用化しないのがほんの数行である場合です。

于 2010-12-07T18:21:41.593 に答える
0

少なくとも、unrelated stuff別のメソッドで実行し、それぞれから呼び出すことができますRun

于 2010-12-07T18:20:58.773 に答える
0

次のような、両方に共通のインターフェースを作成できます。

public interface IMyShape
{
    public bool IsNegative();
    public void Color();
}

そうすれば、IMyShape 参照を受け入れるメソッドが 1 つだけ必要になります。

void Run(IMyShape shape)
{
    if(shape.AllNegative())
    {
        // ...
        // Do unrelated stuff
        // ...
        shape.Color();
        // ...
    }
}
于 2010-12-07T18:56:05.317 に答える