2010-09-27 62 views
4

自從幾年以來,常識似乎決定了針對接口而不是針對實現進行編程更好。對於高級代碼,這確實是合乎邏輯的,例如,如果我有我的應用程序複雜的解算器,它似乎最好能有這樣的事情:模塊化:是否使用接口?

ISolver *solver = solverFactory.getSolver(); 
solver->solve(inputdata); 

不是

Solver solver; 
solver.solve(inputdata); 

在第一個代碼,也更容易嘲笑求解,從而,進行單元測試。

但我的問題是:在哪個級別使用接口不再有意義。例如。如果我有新建一個ComplexNumber類(或String類,或者別的什麼)在我的應用程序,然後寫這樣的:

IComplexNumber *complexNumber = complexNumberFactory.create(1,2); // 1+2i 

似乎更復雜(特別是關於性能)比寫作:

ComplexNumber complexNumber(1,2); // 1+2i 

所以,哪些元素在決定是否應將某些內容放在界面後面以及何時不應將其放在界面之後非常重要?

回答

3

移動到界面的原因是它使事情變得更簡單或減少了耦合。 (這是一個接口是什麼)。

離開界面的理由是如果它讓事情變得更加複雜或者殺死性能(但是確定的配置文件)。我認爲你的IComplexNumber類實際上使得類的層次更加複雜,除非你引入了MockComplexNumber,但是我懷疑這樣的類會是有用的......它可能會讓事情變慢,但是我會測量。

但是,不要以爲你需要以單向方式做所有事情,或者你的決定是固定的。使用接口轉換/轉換非常容易。

-2

使用C++它並不重要,因爲C++具有多重繼承,因此接口是可以添加實現的抽象類。我發現最常用的接口是Java和C#,它們具有單一繼承,如果你想要一個類來實現幾件事情,那麼只有一個可以是抽象類,其他接口必須是接口

+0

原因1:編寫可測試的代碼,你應該能夠使用mockobject創建單元測試,模擬對象只是實現了你的實際模塊的一些接口。 原因2:你應該能夠讓你的代碼儘可能抽象。有時候,除了功能之外,對於這個類什麼都不瞭解,可以說你有一個客戶端,你不知道客戶端是一個網絡/ TCP客戶端,還是一個http進程客戶端,它通過管道或其他你剛纔知道的其他東西進行交互主要界面,連接方式,斷開連接,sendData ... – AlexTheo 2012-02-01 13:36:24

+0

它不依賴於語言,只要看看戰略,訪客模式爲例。 – AlexTheo 2012-02-01 13:39:18

+0

@Alex你仍然可以從抽象類創建模擬對象,不必是一個接口 – Mark 2012-12-13 11:35:04

1

如果你將類分成「服務」和「價值」類,這取決於他們扮演的角色,那麼答案很簡單。僅在服務類中使用接口。在你的問題中,「解決者」是一種服務,「複數」是一種價值。

值類應該很容易使用new()創建,因爲它們只接受構造函數中的基本類型和其他值類。價值類對模擬沒有用處,因爲你可以使用真實的東西。

模擬服務類可能很有用,並且您可能需要多個實現。你的solverFactory可以返回一個天真的解析器,查找解析器,遺傳解析器,模擬解析器等等。這裏的接口是有用的。