簡體   English   中英

我是否需要只有一個實現的接口?

[英]Do I need an interface that has only one implementation?

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

當您可以擴展/更改項目時,界面很有用。 例如,如果通過將數據存儲在文本文件中來啟動項目,然后決定從數據庫更改為執行此操作。 如果這兩個都是相同接口的實現,那么將第一個接口換成第二個接口非常簡單。 只是在使用它的類中交換具體實現的情況。 例如,簡單地改變

IStorage storage = new FileStorage();

IStorage storage = new DBStorage();

雖然為單個實現提供接口似乎毫無意義,但它可能會為您節省大量的重構工作。

如果為實現定義接口並在程序中使用接口,則可以隨意編寫新實現並將其替換為舊實現,而無需更改使用它的類的代碼。

最好的做法是使用接口而不是以這種方式實現更改要求的危害較小。

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

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

在Java中,編譯器通常不是問題。 Java提供public,protected,private和package-private(隱式)訪問類,這些類限制了其他類可以依賴於特定類的詳細信息的程度。 Javadoc(默認情況下)提供了省略不需要和不需要的詳細信息的文檔。 我們也有廣泛推廣的YAGNI原則:如果“你不需要它”,不要設計它。

盡管如此,在Java中使用顯式接口而不是直接使用實現提供了一個額外的機會,可以非常清楚特定類的用戶應該依賴什么結構和行為。 實現多個接口的能力意味着特定類的用戶甚至可以指定對實現的一個或多個特定方面的依賴性,例如其Serializable性質。

有時候你認為使用一個接口會很有用,結果你只有一個實現。 這並不總是壞事,但有時這只是浪費精力。

YAGNI的原則

當你真正需要它們時,總是要實現它們,永遠不要只是預見到你需要它們。

如果您正在為代碼進行單元測試(我希望您這樣做),那么您很可能需要使用某些存根實現來模擬您的類的使用。 所以你至少需要接口才能進行單元測試。

PS我知道,像Mockito這樣的現代模擬框架可以根據類進行模擬,所以從技術上講,你可以在沒有接口的情況下實現這一點。 但是(對我來說)感覺就像黑客一樣,因為這正是應該使用界面的地方。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM