2013-04-25 120 views
4

我有一個接口,只有一個實現。以下對代表一個簡單的java對象。我想刪除該接口並直接使用對象。但是我想知道什麼時候需要它,以及爲什麼它是以這種方式設計的。這絕對不是爲了減輕單元測試的覆蓋。那麼,爲什麼我的項目中只有一個實現的接口呢? 謝謝。我需要一個只有一個實現的接口嗎?

+0

你想告訴我們代碼或簡化版本的代碼? – 2013-04-25 15:32:55

+0

爲什麼某件事是你代碼中的一種特定方式,只有一個人可能會告訴你......這就是你的代碼的程序員。爲什麼不問那個人,爲什麼他們做了他們做的? – 2013-04-25 15:34:36

+2

因爲這個人對於Java來說不是太好就是太可怕了。 (需要更多代碼) – Zyerah 2013-04-25 15:34:54

回答

10

當您可能擴展/更改項目時,該接口非常有用。例如,如果您通過將數據存儲在文本文件中來啓動項目,然後決定從數據庫更改爲這樣做。如果這兩者都是相同接口的實現,那麼將第一個交換爲第二個非常簡單。只是在使用它的類中交換具體實現的一個例子。例如,簡單地改變

IStorage storage = new FileStorage(); 

IStorage storage = new DBStorage(); 

雖然它可能看起來毫無意義的有一個實施的接口,它可以在以後爲您節省大量重構工作。

+4

我只把最後一行作爲答案。 – 2013-04-25 15:35:54

+0

如果你有一個IDE來做這個重構,你可以稍後改變它(假設你可以訪問所有使用它的源代碼) – 2013-04-25 15:59:52

+1

@PeterLawrey你建議用IDE中的一個特性替換好的編碼實踐嗎?這聽起來像個壞主意。如果您想切換回FileStorage或添加第三種存儲類型,該怎麼辦?或者,也許用戶可以選擇存儲類型。提取細節和實現,以便核心代碼庫不必更改將是IMO更好的方法。 – Despertar 2013-04-26 07:50:14

1

如果您爲實現定義接口並在程序中使用該接口,則可隨時編寫新實現並將其替換爲舊實現,而不更改使用它的類的代碼。

這是一種使用界面而不是實現的最佳實踐,這種方式改變需求的危害較小。

0

如果你正在爲你的代碼做單元測試(我希望你這樣做),你很有可能需要用一些存根實現來嘲笑你的類的使用。 所以你至少需要接口來進行單元測試。

P.S.我知道,像Mockito這樣的現代嘲笑框架可以基於類來做嘲笑,所以從技術上講,你可以在沒有接口的情況下實現這一點。但(對我來說)感覺像是黑客,因爲這正是應該使用界面的地方。

1

這取決於。但這並不是一個壞主意。

在C語言和許多Pascal版本中,將接口與實現分離是熟悉的操作。它有助於編譯器避免在模塊所依賴的更改實現時不必要地重新編譯模塊。

在Java中,編譯器通常不是問題。 Java提供了公共,受保護,私有和包私有(隱式)訪問類,這些類限制了其他類可以依賴於特定類的詳細信息。 Javadoc提供(默認情況下)文檔,省略不需要的和不需要的細節。我們也有YAGNI的廣泛宣傳原則:如果「你不需要它」,不要設計它。儘管如此,在Java中使用顯式接口而不是直接使用實現提供了一個額外的機會,可以非常清楚特定類的用戶應該依賴的結構和行爲。實現多個接口的能力意味着特定類的用戶甚至可以指定對實現的一個或多個特定方面的依賴性,例如其Serializable特性。

1

有時您認爲只有一種實現才能使用接口。這並不總是一件壞事,但有時候這只是一種浪費。

YAGNI

的原則,當你真正需要它們,從來沒有當你只是預見到你需要他們始終貫徹的東西。

相關問題