文章

目前顯示的是 八月, 2017的文章

PHP OO 物件導向原則:依賴反轉原則DIP

圖片
OO_Principle_DIP 物件導向有五個原則 S.O.L.I.D. : 單一職責原則 SRP (Single Responsibility Principle)開放封閉原則 OCP (Open Closed Principle)里氏替換原則 LSP (Liskov Substitution Principle)介面隔離原則 ISP (Interface Segregation Principle)依賴反轉原則 DIP (Dependency Inversion Principle) 更多物件導向的理論的學習內容會整理到 PHP OO 的進階教學:

淺談物件導向 SOLID 原則對工程師的好處與如何影響能力再談 SOLID 原則,Why SOLID?  依賴反轉原則 DIP (Dependency Inversion Principle) 一、定義與說明:定義: 高階模組不應該依賴於低階模組,兩者都該依賴抽象。
High-level modules should not depend on low-level modules. Both should depend on abstractions. 抽象不應該由低階模組定義。
Abstractions should not depend on details. 低階模組的實作內容應該依照抽象的定義去打造。
Details should depend on abstractions. 高階與低階,是相對關係,其實也就是 呼叫者 (Caller) 與 被呼叫者 (Callee)。 越高階的模組接近商業邏輯(電子商務買賣交易流程等),越低階的模組越接近實作邏輯(讀寫資料庫的、計算金額邏輯等) 接下來用範例來講解有沒有使用依賴反轉的差異吧! 範例: 如果你有遵守前幾項原則的話,要使用依賴反轉(DIP)就會變得很簡單唷! 現在,我們來做一個電子書 e-book 閱讀器的應用程式: classTestextendsPHPUnit_Framework_TestCase{ functiontestItCanReadAPDFBook(){ $b = new PDFBook(); $r = new PDFReader($b); $this->assertRegExp(…

PHP OO 物件導向原則:介面隔離原則ISP

圖片
OO_Principle_ISP 物件導向有五個原則 S.O.L.I.D. : 單一職責原則 SRP (Single Responsibility Principle)開放封閉原則 OCP (Open Closed Principle)里氏替換原則 LSP (Liskov Substitution Principle)介面隔離原則 ISP (Interface Segregation Principle)依賴反轉原則 DIP (Dependency Inversion Principle) 更多物件導向的理論的學習內容會整理到 PHP OO 的進階教學:

淺談物件導向 SOLID 原則對工程師的好處與如何影響能力再談 SOLID 原則,Why SOLID?  介面隔離原則 ISP (Interface Segragation Principle) 到目前為止介紹:
單一職責原則講述:如何使用 actor 角色的來設計類別。
開放封閉原則講述:類別設計的原則與擴增功能的方式。
里氏替換原則講述:子類別繼承與實作介面的約束。 最後,介面隔離原則講述:商業邏輯如何與 client 用戶溝通。 一、定義與說明:定義: 介面不應該強迫 Client 依賴於它們用不到的方法。
Clients should not be forced to depend upon interfaces that they don’t use.
類別之間的相依關係應該建立在最小的介面上
The dependency of one class to another one should depend on the smallest possible interface. 類別與類別之間的關係,應只依賴彼此需要的最少介面,介面不能太肥,應該要細化。 每一個介面(Interface)應該把不相關的方法移除,盡可能地讓方法數量降到最低。 現在的所有模組化應用程式一定會提供讓 Client 可以依賴(使用)的介面,
這些介面可能是一些實作設計模式(如 Facade 模式)的物件,也可能是真的介面(Interface)。 不過一種介面並不重要,因為這些介面的目的都是提供一個讓 Client 端可以使用我們開發模組的管道。 這些介面處於應用程式與模組之間、或是專案與模組之間,這種關係就如同第三方套件提供服務 A…

PHP OO 物件導向原則:里氏替換原則LSP

OO_Principle_LSP 物件導向有五個原則 S.O.L.I.D. : 單一職責原則 SRP (Single Responsibility Principle)開放封閉原則 OCP (Open Closed Principle)里氏替換原則 LSP (Liskov Substitution Principle)介面隔離原則 ISP (Interface Segragation Principle)依賴反轉原則 DIP (Dependency Inversion Principle) 更多物件導向的理論的學習內容會整理到 PHP OO 的進階教學:

淺談物件導向 SOLID 原則對工程師的好處與如何影響能力再談 SOLID 原則,Why SOLID?  里氏替換原則 LSP (Liskov Substitution Principle) 一、定義與說明: 所有子類別都可以代理父類別的工作。
Subtypes must be substitutable for their base types. 里氏替換原則原則要能夠成立,介面(interface)/抽象方法(Abstract method) 就必須要遵守定義去實做。 又被稱為 Design by Contract ,即按照契約設計 ,子類別需兌現對父類別的承諾,遵照父類別設計開發。 作為子類別的方法必須和他們父類別的方法操作一致,子類別中可以擁有父類別沒有的特殊功能,但是繼承的方法,功能應該兩者一致的。 子類不只是實現父類別的方法,而且必須名符其實,否則會發生無法預料的事情。 二、遵守單一職責原則的結果:確保行為的正確性: Client 端只會透過介面與抽象方法的定義來判斷一個方法的行為,如果有遵守 LSP 原則,就可以確保動作的行為會如預期般的運作。 如果程式沒有達到 LSP 原則,程式的行為將變得「不可預測」,換句話說可能產生不可預知且不容易察覺的 bugs。 簡單的例子是:
如果有一個父類別的 method 名稱叫做 getName,但是子類別實作 getName 的時候卻回傳 $this->id,這樣的情況下,別人看到 getName 的 function 就以為他是回傳 Name ,但實際上是回傳 ID ,而且該失誤無法在建置時發現,可能需要執行時才會發生錯誤。 三、如何設計里氏替換原則的類別…

PHP OO 物件導向原則:開放封閉原則OCP

圖片
OO_Principle_OCP 物件導向有五個原則 S.O.L.I.D. : 單一職責原則 SRP (Single Responsibility Principle)開放封閉原則 OCP (Open Closed Principle)里氏替換原則 LSP (Liskov Substitution Principle)介面隔離原則 ISP (Interface Segragation Principle)依賴反轉原則 DIP (Dependency Inversion Principle) 更多物件導向的理論的學習內容會整理到 PHP OO 的進階教學:

淺談物件導向 SOLID 原則對工程師的好處與如何影響能力再談 SOLID 原則,Why SOLID?  開放封閉原則 OCP (Open Closed Principle) 一、定義與說明: 軟體中的實體(如:類別、模組、方法),必須能夠擴充延伸但不能做修改。
Software entities like classes, modules and functions should be open for extension but closed for modifications. 寫程式的時候,應該注意有哪些部分可能在開發完成後,會經常因為需求改變導致需要修改程式。(需求改變常常指的是新增功能) 以往在開發應用程式或系統時,擴充新功能通常會更動許多地方(牽一髮而動全身)。然而用最小的幅度來修改已存在的程式碼(甚至不修改)才是最佳的情況。 開放封閉原則(Open Closed Principle)是一個可以讓程式在擴充新功能時,不更動原程式碼或者僅以最小幅度修改程式碼的開發方式。 二、遵守單一職責原則的結果: 不管擴增多少新功能,都不必修改原程式碼。 案例:如 Chrome 的擴增套件,可不斷擴增新套件,但不必修改到 Chrome 本身。 三、如何設計單一職責原則的類別?: 在設計上應該要使用抽象層的介面(interface),透過實作介面行為來擴充我們的商業邏輯。 這樣的設計,配合依賴注入(Dependency Injection)讓未來擴充功能時,只需要新增類別並實作介面。最後再將新的擴充內容注入場景裡面,即可達成不修改類別,滿足 OCP 原則。 範例一: 可以顯示百分比%的進度表 此範例我們要設計一個可以顯…