摘要:里氏替換原則該原則表示,程序中對于實例化對象的子類型,不需要修改代碼,可以直接進行替換。上述實例已違背里氏替換原則。我們的數據庫獲取部分就是破壞里氏替換的點,在你以后的編碼中一定要對這種編碼留心
聲明:本文并非博主原創,而是來自對《Laravel 4 From Apprentice to Artisan》閱讀的翻譯和理解,當然也不是原汁原味的翻譯,能保證90%的原汁性,另外因為是理解翻譯,肯定會有錯誤的地方,歡迎指正。
歡迎轉載,轉載請注明出處,謝謝!
里氏替換原則 簡介別擔心,里氏替換原則實際上比他的名字好理解。他是指任何在任何接受抽象化類的地方其實現也被接受。通俗的講,類中使用接口實現的地方,不需要修改代碼對于任意的接口實現類都將能使用。
實探里氏替換原則
該原則表示,程序中對于實例化對象的子類型,不需要修改代碼,可以直接進行替換。
我們繼續拿OrderProcessor舉例來闡述該原則,看下這個方法:
public function process(Order $order) { // Validate order... $this->orders->logOrder($order); }
在Order驗證之后,我們使用OrderRepositoryInterface接口實現類來記錄訂單日志。我們假定,當訂單處理未成熟時,我們將所有的訂單以CSV格式記錄到系統中。我們的額OrderRepositoryInterface接口實現類為CsvOrderRepository。當業務繼續發展,我們想使用關系型數據庫記錄訂單。下面,我們看下一種可能的接口實現:
class DatabaseOrderRepository implements OrderRepositoryInterface { protected $connection; public function connect($username, $password) { $this->connection = new DatabaseConnection($username, $password); } public function logOrder(Order $order) { $this->connection->run("insert into orders values (?, ?)", array( $order->id, $order->amount, )); } }
現在,讓我們檢驗下如何將不得不去使用此實現:
public function process(Order $order) { // Validate order... if ($this->repository instanceof DatabaseOrderRepository) { $this->repository->connect("root", "password"); } $this->repository->logOrder($order); }
注意,在訂單處理類中,我們強制檢測了OrderRepositoryInterface是否為一個數據庫的實現方式。如果是,繼續數據庫的連接。在小型應用中還算是小問題,但是,如果在很多其他類中OrderRepositoryInterface被使用到時怎么辦?我們就只能在所有地方去添加這段“引導”代碼。這樣的代碼維護讓人頭痛,還會代碼潛在的bug,如果有一個地方忘記修改,就瞎了。
上述實例已違背里氏替換原則。在不修改connect方法的情況下我們無法注入接口的實現類。既然發現了問題,那就去修復他們吧。這里是一個新的DatabaseOrderRepository實現類:
class DatabaseOrderRepository implements OrderRepositoryInterface { protected $connector; public function __construct(DatabaseConnector $connector) { $this->connector = $connector; } public function connect() { return $this->connector->bootConnection(); } public function logOrder(Order $order) { $connection = $this->connect(); $connection->run("insert into orders values (?, ?)", array( $order->id, $order->amount, )); } }
現在在DatabaseOrderRepository中實現了數據庫連接的管理,我們就可以從OrderProcessor中移除那段“引導”代碼了:
public function process(Order $order) { // Validate order... $this->repository->logOrder($order); }
如此改變,我們就可以在OrderProcessor中隨意使用CsvOrderRepository或者DatabaseOrderRepository了。我們的代碼遵循了里氏替換原則。很多建筑學上的概念都被討論成一種“認知”。特別的,對于每一個類,都有其自己的“語境”,他周邊的代碼在其依賴環境下幫助類來完成特定的工作。當你讓架構朝著健壯方向發展的時候,這種類的設計“認知”將是一種持久重要的主題。
小心漏洞
你也許注意到了本原則和上章中提到的回避“抽象漏洞”類似。我們的數據庫獲取部分就是破壞里氏替換的點,在你以后的編碼中一定要對這種編碼留心!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/23043.html
摘要:它是良好應用設計的大原則,包含單一責任原則開放封閉原則里氏替換原則接口分離原則依賴倒置原則讓我們通過代碼示例來深究下這五個原則。實探單一責任原則代表一個類有且僅有一個改變的原因,換言之,一個類的職責范疇是嚴謹明確的。 聲明:本文并非博主原創,而是來自對《Laravel 4 From Apprentice to Artisan》閱讀的翻譯和理解,當然也不是原汁原味的翻譯,能保證90%的原...
摘要:前言本章我們要講解的是五大原則語言實現的第篇,里氏替換原則。因此,違反了里氏替換原則。與行為有關,而不是繼承到現在,我們討論了和繼承上下文在內的里氏替換原則,指示出的面向對象。 前言 本章我們要講解的是S.O.L.I.D五大原則JavaScript語言實現的第3篇,里氏替換原則LSP(The Liskov Substitution Principle )。英文原文:http://fre...
摘要:定義按照慣例,首先我們來看一下里氏替換原則的定義。同樣覆蓋了父類的非抽象方法,并將邏輯更改為跳舞,這要是違背了里氏替換原則的。而重寫顯然是不符合里氏替換原則的。里氏替換原則的核心思想就是繼承,所以優點就是繼承的優點。 showImg(https://user-gold-cdn.xitu.io/2018/9/19/165f1897234ef1d4?w=600&h=350&f=jpeg&s...
閱讀 3110·2021-11-10 11:36
閱讀 3312·2021-10-13 09:40
閱讀 6051·2021-09-26 09:46
閱讀 662·2019-08-30 15:55
閱讀 1409·2019-08-30 15:53
閱讀 1580·2019-08-29 13:55
閱讀 2997·2019-08-29 12:46
閱讀 3204·2019-08-29 12:34