2010-08-26 15 views
6

我的問題是:在PHP中,接口對於自行構建網站應用程序的開發人員真的有用嗎?抽象類不是提供接口提供的所有功能嗎?由單個開發人員構建的應用程序是否是一個php接口冗餘?

如果一個接口只是一個「契約」,是不是開發人員意識到類應該實現的東西?

我能想到的唯一的一個好處是一個類可以實現多個接口,但這又是多麼有用......當你知道一個類應該實現的一切。你只是強迫自己去實現這些方法。

正如你可以看出,我仍然在等待那個A-HA時刻,當我真正理解爲什麼一個接口是有用的。

簡單來說:什麼時候應該使用接口?爲什麼不使用抽象類呢?

回答

2

只因爲你「知道」什麼東西應該實現,並不意味着你記得它。這並不意味着你永遠不會犯一個錯誤,並打錯了一個函數名。編程中的「契約」不僅僅是一個開發人員在另一個開發人員身上執行的事情 - 他們還可以讓你提供一個可以捕捉錯誤的代碼的僵化程度。

+0

你能提供一個例子嗎? – danidacar 2010-08-26 08:25:22

-1

什麼時候應該使用接口以及爲什麼 不使用抽象類?

只要使用例如工廠模式,應該使用一個接口。我確定有更多的例子。

看看各種設計模式。 http://www.ibm.com/developerworks/library/os-php-designptrns/

編輯:改變鏈接到更好的解釋。

+0

我不認爲你提到的文章非常好=) – 2010-08-26 08:07:03

+1

TBH我沒有讀它,我用從斯蒂芬·施密特的PHP設計模式書。 – Rufinus 2010-08-26 08:22:02

+0

PHP和設計模式是我開始這個問題的原因。大多數與php相關的設計模式教程並不是真正關鍵的。 – danidacar 2010-08-26 08:28:03

1

可以使用接口在功能

  • 型提示public function foo(IWhatever $x)
  • 要檢查$x instanceof IWhatever
  • 要在單位創建模擬對象測試$this->getMock('IWhatever')

當然,你也可以使用抽象類,但如果您實際上不需要定義任何代碼,那麼使用接口可能是一個更好的主意。

0

接口是命令開發中非常好的練習。它創建了程序產品的完整性。第一次團隊在抽象類(使用通用方法和抽象方法)之後編寫接口。

抽象類有用,我們將它擴展到不同的類中。例如,方法__construct()對於所有子類都是公共的,但其他方法是不同的。

我們的團隊使用此模型: 界面 - >摘要 - > Class1->的Class2

Class1 extends Abstract implements Interface 

Class2 extends Abstract implements Interface 
+0

這個問題涉及單個開發者。對於一個團隊,我可以理解你的方法。 – danidacar 2010-08-26 08:27:04

1

「面向接口編程,而不是實現」是在他們的著作中GoF推出了原則Design Patterns: Elements of Reusable Object-Oriented Software

在聖多美和普林西比引用埃裏希·伽瑪:

一旦你只依賴於,你從執行脫鉤接口。這意味着實施可能會有所不同,這是一種健康的依賴關係。例如,出於測試目的,您可以用較輕量級的模擬實現來替換繁重的數據庫實現。 [...]

因此,這種方法爲您提供了靈活性,但它也將真正有價值的部分與設計從實施中分離出來,從而使客戶與實施脫鉤。一個問題是你是否應該總是使用Java接口。抽象類也很好。事實上,抽象類在進化方面給了你更多的靈活性。您可以添加新行爲而不會破壞客戶端。 [...]

在Java中,當您向接口添加新方法時,會破壞所有客戶端。當你有一個抽象類時,你可以添加一個新的方法並在其中提供一個默認的實現。所有的客戶將繼續工作。一如既往有一個折衷,一個接口讓你可以自由地處理基類,一個抽象類可以讓你隨後自由地添加新的方法。在抽象類中定義接口並不總是可能的,但從進化的角度來看,您應該考慮抽象類是否足夠。

Read the full interview here

所以,你可以用一個接口一個抽象類。你只需要考慮權衡。國際海事組織,即使你是孤身一人,也值得使用接口。你很少知道你的應用最終會看到什麼。 The waterfall is a myth,所以你將不得不在開發和接口過程中面對變化,使它更容易擁抱它。

您還可能有興趣

和一些更多:

+0

面向接口編程,而不是在PHP的實現是不是真的直線前進,因爲PHP是弱類型 – danidacar 2010-08-26 08:24:26

+0

我讀GOF和一堆其他的書。你能否更重要? – danidacar 2010-08-26 08:25:58

+0

@daniphp(http://stackoverflow.com/questions/2758254/what-is-the-point-of-interfaces-in-a-weakly-typed-language-like- [這樣的說法不時出現] PHP)。 PHP只是* weakly *鍵入。它不是無類型的。 – Gordon 2010-08-26 08:32:42

相關問題