2012-03-30 175 views
19

我有這樣的方法,它的消費者稱之爲:這是否是重載方法的不良做法?

static public void DisplayOrderComments(param1, param2, param3, param4) 

現在我增加了一個重載這樣的:

static public void DisplayOrderComments(param1, param2, param3, param4, param5) 
{ 
    DisplayOrderComments(param1, param2, param3, param4); 
    param5.Foo(); 
} 

它是一個不好的做法?有沒有更好的方法來做到這一點?

+0

這應該在[程序員](http://programmers.stackexchange.com)甚至[codereview](http://codereview,stackexchange.com)。 – 2012-03-31 06:27:04

回答

27

這絕對沒問題 - 它保留代碼DRY並避免不必要的重複。

不僅是一個不好的做法,它是一個的做法。


如果您正在使用C#4.0及以上(VS 2010+),您可以使用optional argumentparam5代替超載,如米奇老鼠在this answer提到。

+0

+1爲可選參數 – KindDragon 2012-04-05 10:13:01

20

不錯的問題。

我會說不是,這是正常的重載。但我會改變它本身(總是在一個與大多數參數實施):

static public void DisplayOrderComments(param1, param2, param3, param4) 
{ 
    DisplayOrderComments(param1, param2, param3, param4, null); 
} 

static public void DisplayOrderComments(param1, param2, param3, param4, param5) 
{ 
    ... // do the work 
    if(param5!=null) 
    param5.Foo(); 
} 
+1

此策略還具有使其更容易移植到沒有重載的語言(如Javascript)的副作用,因爲它們將使用此表單。 – 2012-03-30 19:06:40

+0

@smackfu其實可選參數 - 除了用於COM接口 - 不鼓勵使用。我不推薦它。 – Aliostad 2012-03-30 19:31:09

4

不是。這是完全可以接受的,但有兩個問題。

  1. param5可能會作爲Null傳遞 - 您可能想要編寫一些代碼來檢查該條件並執行相應的操作。
  2. 這會阻止您稍後使用可選參數。但你可能不關心這一點。

順便說一句codereview.stackexchange.com可能是這類問題的一個更好的地方。

6

是的,我不會說這很糟糕,但如果您使用的是C#4.0,我建議您將最後一個參數設置爲可選。

你可以閱讀所有關於EM這裏 http://msdn.microsoft.com/en-us/library/dd264739.aspx

+2

+1表示可選參數。 – Oded 2012-03-30 15:51:38

+0

可選參數不推薦用於公共API – Sujeewa 2015-04-02 16:39:41

+0

@Sujeewa爲什麼這麼說?如果他們簡化了代碼,那麼爲什麼不使用它們。接受的答案也推薦給他們。 – 2015-04-03 07:58:31

2

這也是提供易於使用的API接口公地的做法。保持接口與小法有多個參數,但使用多個擴展方法(有時有相同的名字),提供易於使用的API,不污染接口:

interface ILog 
{ 
    void Log(string message, int someNumber, float anotherParam, object moreParams); 
} 

public static class LogExtensions 
{ 
    public void Log(ILog this log, message) 
    { 
     log.Log(message, 42, 0, null); 
    } 
// more methods using ILog.Log like LogFormat that takes format string... 
} 
1

我要說的是取決於什麼DisplayOrderComments和param5.Foo( )的確如此。如果param.Foo()適用於參數1到4,那麼絕對如果它沒有,那麼你做了一些額外的事情,這可能是值得的自己的名字。

您是否正在更改DisplayOrerComments所做的操作或副作用,或者只是在何種條件下運行?如果您引入新的副作用,那麼可能需要擁有自己的函數/名稱,然後調用DisplayOrderComments。