2012-03-22 103 views
8

在討論中提出了一個問題,我討論過接口方法是否應該返回一個Custom對象與一個基本類型。接口方法應該返回一個自定義對象嗎?

例如

public interface IFoo 
{ 
     bool SomeMethod(); 
} 

VS

public interface IFoo 
{ 
    MyFooObj SomeMethod(); 
} 

其中MyFooObj是:

public class MyFooObj 
{ 
    bool SomeProp{get;set;} 
} 

的說法是,你可以很容易的屬性在未來,而不需要改變接口契約添加到對象。

我不確定標準指南是什麼?

回答

10

恕我直言更改MyFooObj是一樣的改變/添加方法的IFoo的接口 - 所以沒有我不認爲這是一個好主意添加只是一個抽象的 - 記住YAGNI

+0

這就是我的想法。謝謝 – 2012-03-22 15:22:08

7

我的標準答案是 - YAGNI

如果結果如此,您可以隨時更改內容,特別是如果您控制應用程序的完整源以及如何使用該界面。

僅僅爲了預測未來而對布爾值進行包裝僅僅是在當前不需要時增加了複雜性和其他抽象層。

如果你在你的代碼庫中使用DDD和特定的建模技術,如果它們在你的域中是有意義的(如果它們在你的域中有意義的話,可以有這樣的別名到布爾值)(但我看不到這是一個布爾值值)。

2

這取決於你喜歡什麼。我認爲,在你的樣品的情況下,我會堅持在接口定義的簡單的布爾這些原因:

  • 這是最簡單的閱讀可能性
  • 沒有一個查找不可用的方法

恕我直言,只有當需要一定數量的複雜性/分組作爲結果時,該對象纔有意義。

3

我看不到在自定義對象中封裝基元類型的要點。

如果您更改此自定義對象的定義,那麼您實際上會更改合同,因爲該函數不會返回相同的內容。

我認爲這又是一個過度設計的「模式」。

3

對此沒有一般性指導。

正如你指出的那樣,如果你身邊有你想返回類型語義堅信可能改變或可能需要在未來的更新可能會更好返回複雜類型。

但現實情況是,在大多數情況下,最好保持簡單並返回原始類型。

2

如果不需要先打開它,就不應該改變對象內部返回的內容,就像改變打破接口編程規則一的接口一樣。

它的權利在那裏與擴展設計,YAGNI(你不會需要它)。

作爲一個側面說明,我在職業生涯早期被告知這樣的事情。

2

如果您需要返回比布爾值更多的東西,那麼很可能您還要修改接口的其他部分。不要讓事情比他們需要的更復雜:簡單是可靠性的先決條件。

1

只是想我會提到,如果MyFooObj在一個名爲strong的程序集中,您更新它,它的版本會更新 - 由於版本不匹配,舊客戶端會立即中斷(例如InvalidCastException)嘗試部分綁定由於強名稱)除非他們重新編譯與新版本。您仍然更改了界面合同。所以最好保持簡單,返回主要類型並更明確地聲明合同的更改。

1

除了其他答案之外,在自定義類中添加新字段在技術上仍然是接口消費者可能發生的重大變化。 Link

+0

不錯的鏈接。謝謝。 – 2012-03-22 15:39:17

相關問題