日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Laravel深入学习10 - 里氏替换原则

發布時間:2024/4/13 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Laravel深入学习10 - 里氏替换原则 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

聲明:本文并非博主原創,而是來自對《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了。我們的代碼遵循了里氏替換原則。很多建筑學上的概念都被討論成一種“認知”。特別的,對于每一個類,都有其自己的“語境”,他周邊的代碼在其依賴環境下幫助類來完成特定的工作。當你讓架構朝著健壯方向發展的時候,這種類的設計“認知”將是一種持久重要的主題。

小心漏洞

你也許注意到了本原則和上章中提到的回避“抽象漏洞”類似。我們的數據庫獲取部分就是破壞里氏替換的點,在你以后的編碼中一定要對這種編碼留心!

總結

以上是生活随笔為你收集整理的Laravel深入学习10 - 里氏替换原则的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。