2012-12-19 298 views
8

我試圖構建一個框架,允許人們通過實現一個接口來擴展我們的核心功能。下面是這個界面的一個簡單例子。方法參數與參數對象

public interface MyInterface 
{ 
    IData GetData(string p1, char p2, double p3); 
} 

最近,我們已經決定修改這個接口(我知道我不應該打破相關的代碼,但事實是我們沒有任何第三方實現這個接口還,所以我們還有機會對於「重複」來正確實現這個接口)。

我們需要在此界面添加2個參數才能使我們的軟件正常工作。有兩種方法,我們正在考慮的只是將它們添加到簽名是這樣的:

public interface MyInterface 
{ 
    IData GetData(string p1, char p2, double p3, bool p4, DateTime p5); 
} 

,或者通過創建參數對象這樣

public class MyParameters 
{ 
    public bool p4 { get; set; } 
    public DateTime p5 { get; set; } 
} 

並將它們添加到像這樣的方法結束:

public interface MyInterface 
{ 
    IData GetData(string p1, char p2, double p3, MyParameters p4); 
} 

我正在尋找某種指導,以哪種方式進行「最正確」的方式。我可以看到兩種類型的優點和缺點,但我不希望我的偏見導致我走錯了路。

我的一些主要問題是:軟件的

  • 可擴展性 - 我希望用戶能夠通過實現界面
  • 可維護性做的事情我還沒有考慮過的 - 在理想情況下,我想從來沒有觸摸到了負責調用getData()再次
  • 清潔API代碼 - 我不想我到達使溶液第三方開發者畏縮

我甚至不知道要問什麼問題在線獲取有關此問題的指導。我有一種感覺,答案是「它取決於」(關於p1-p5與GetData()函數的目的是如何相關的),但是有人能指出我應該請求幫助我評估的問題列表一種解決方案是否比另一種更好?

相關: Post 1 Post 2

回答

2

讓我試圖回答這個問題。讓我們來評估你的選擇:

1)如果下面的界面

public interface MyInterface 
{ 
    IData GetData(string p1, char p2, double p3); 
} 

被打破:

a)和不應該使用的話,那麼你就應該強制執行者重寫。所以改變方法定義。

public interface MyInterface 
{ 
    IData GetData(something else); 
} 

B),但你只需要鼓勵用戶使用新的定義,那麼你可以創建一個新的重載告訴他們,第一個是過時的。

public interface MyInterface 
{ 
    //xml to tell them this is deprecated. 
    IData GetData(string p1, char p2, double p3); 
    IData GetData(string p1, char p2, double p3, and whatever); 
} 

關於你的新定義,有沒有一站式的解決方案,任何人都可以在不知道有關模型給,但你會問自己,

I)「可以將參數本身代表着一個單一實體,如果合併?這是否意味着在現實世界中有一個單位的參數?「如果是這樣,就這樣做。如果沒有,不要。當你處於這種困境時,我認爲你應該依靠這種抽象層面的思維。我不確定俱樂部bool p4DateTime p5有什麼意義。你應該club those那些在現實生活中代表着某些東西的參數。如果沒有這些的組合是有道理的,那就把它留下。在這樣的俱樂部中留下如此合乎邏輯的思維方式會讓你獲得更多的成功。請注意,您將自己的定義留給其他程序員,爲了簡化他們的工作,您的方法簽名應該非常合乎邏輯。

II)這個班可以做更多的事情,而不僅僅是保存一組數據嗎?類應該是這裏的選項。

三)我是否需要只控制類的定義而不是執行它?在這種情況下,只需定義輸入的公共接口,然後將實現留給客戶。

四)未來我的界面的修改應該不會破壞現有的實現嗎?重載是你要走的路。

假設您有兩種選擇,將簽名平放,或留給俱樂部。

1)在不杵:

一個)更少的代碼,減小另一層。

b)無需公開其他課程。

2)隨着泡吧:

A)提供了一個更好的理解模型的進入功能 - 你的意圖很明顯。

b)如果您需要添加可選的細節來構建新形成的類,將來容易擴展。比方說你有一個類

class Input { 
    string p1; char p2; double p3; 

    public Input(string p1, char p2, double p3){ 
    } 
} 

和接口

public interface MyInterface 
{ 
    IData GetData(Input p1); 
} 

現在你可能要添加像一個布爾值和一個DateTime可選細節。既然它們是可選的,你不必在構造函數中強制它。您仍然可以擁有相同的構造函數,併爲用戶提供在構造函數外部進行修改的權限。

class Input { 
    string p1; char p2; double p3; bool p4; DateTime p5; 

    public Input(string p1, char p2, double p3){ 
    } 
} 

接口仍然可以是相同的。正如我所說的,推導這種類型的東西可悲地依賴於你的模型。簡而言之,如果一個分組可能意味着什麼,那麼將它作爲一個類或接口(取決於誰將控制邏輯)。

2

爲什麼不走一路:

public Interface IParameters 
{ 
    string p1 {get; set;} 
    char p2 {get; set;} 
    double p3 {get; set;} 
    bool p4 { get; set; } 
    DateTime p5 { get; set; } 
} 

public interface MyInterface 
{ 
    IData GetData(IParameters p); 
} 
+0

對於參數類型有一個接口是一個好主意,但考慮到接口不能被版本化,如果API會傳播,那麼沒有人可以在不破壞存在的情況下向參數類型添加加號功能(比如再添加一個參數)碼。 –