2011-12-07 57 views
2

我有兩種方法酷似對方,但只是在一條線上 想象:通過傳遞方法或其他東西來刪除重複的代碼?

public void ApplyHorizontalScale(int x, int Y) 
    { 
     // Code 1 
     forecast.Formula = Method1(X, Y); 
     // Code 2 
    } 


    public void ApplyVerticalScale(int x, int Y) 
    { 
     // Code 1 
     forecast.Formula = Method2("Foo"); 
     // Code 2 
    } 


    int Method1(int x , int y) 
    { 
     return x+y; 
    } 

    int Method2(string s) 
    { 
     return Foo.Length; 
    } 

的問題是代碼1和2的代碼已經被重複了兩次! 我怎麼能有這樣的:

public void ApplyScale(int x, int Y, WhichMethod) 
{ 
     // Code 1 
     forecast.Formula = WhichMethod(); 
     // Code 2 
} 

請注意方法1和方法2有不同的簽名,也是其中之一是訪問一個私有成員。

+0

我認爲你做錯了..認爲如果你真的需要有兩種方法做同樣的事情,但一行代碼.. –

+0

參數「bool useMethod1」和一個老式的預測有什麼問題。 Formula = useMethod1?Method1(x,y):Method2(「Foo」);「 – Eddy

+0

好吧,我試圖找到一個更好的解決方案:-) –

回答

4

ApplyVerticalScale和ApplyHorizo​​ntalScale是非常好的方法 - 您不需要將它們合併爲一個「上帝」ApplyScale公共方法。

您應該重構方法的內部以調用一次包含Code1和Code2的私有ApplyScale(或類似的)方法,每種方法都會傳遞它在特定方向上應用縮放所需的任何方法。

3

這是做

public void ApplyScale(int x, int Y, bool isHorizontal) 
{ 
    // Code 1 
    if(isHorizontal) 
    { 
     forecast.Formula = Method1(X, Y); 
    } 
    else 
    { 
     forecast.Formula = Method2("Foo"); 
    } 
    // Code 2 
} 

您還可以使用enum代替isHorizontal標誌

+0

+1,我會去枚舉,但它更容易理解,更具可擴展性。 –

+0

是啊!我同意,但有點懶惰編寫額外的6行爲枚舉實現:) – Vamsi

1

你有大量的不同的選擇方式之一。哪一個最適合取決於你的情況。

  • 地點代碼1和在單獨的函數碼2;這會將重複代碼減少爲兩行重複代碼。

  • 將枚舉/布爾值選項參數傳遞給函數。根據此參數,您可以檢查是否需要致電Method1Method2

  • 使用抽象基類並使用具體實現來提供Formula

  • 傳遞代表

1

通過引入第三個方法,你可以重構如下:

public void ApplyHorizontalScale(int x, int Y) 
{ 
    DoWork(x,y,()=>Method1(X,Y)); 
} 


public void ApplyVerticalScale(int x, int Y) 
{ 
    DoWork(x,y,()=>Method2("Foo")); 
} 

private void DoWork(int x, int y, Func<int> action) 
{ 
    // Code 1 
    forecast.Formula = action(); 
    // Code 2 
} 

int Method1(int x , int y) 
{ 
    return x+y; 
} 

int Method2(string s) 
{ 
    return Foo.Length; 
} 

希望這有助於。

1

看來常見的事情是你的「公式」屬性需要得到一個int價值。

在這種情況下,這樣簡單的東西會做:

public void ApplyScale(int x, int Y, int value) 
{ 
    // ... 
    forecast.Formula = value; 
    // ... 
} 

,然後用不同的調用它每次:

ApplyScale(x, y, x + y); 
ApplyScale(x, y, Foo.Length); 

如果你想偷懶計算此值,你可以這樣做:

public void ApplyScale(int x, int Y, Func<int> formula) 
{ 
    // ... 
    forecast.Formula = formula(); 
    // ... 
} 

而且然後用不同的拉姆達每次調用它:

ApplyScale(x, y,() => x + y); 
ApplyScale(x, y,() => Foo.Length); 

我沒有看到後者的做法確實有好處,所以我只想值傳遞給該方法(除非有別的東西你的背後問題,我不明白)。