亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Laravel深入學(xué)習(xí)10 - 里氏替換原則

lijy91 / 2254人閱讀

摘要:里氏替換原則該原則表示,程序中對(duì)于實(shí)例化對(duì)象的子類型,不需要修改代碼,可以直接進(jìn)行替換。上述實(shí)例已違背里氏替換原則。我們的數(shù)據(jù)庫(kù)獲取部分就是破壞里氏替換的點(diǎn),在你以后的編碼中一定要對(duì)這種編碼留心

聲明:本文并非博主原創(chuàng),而是來(lái)自對(duì)《Laravel 4 From Apprentice to Artisan》閱讀的翻譯和理解,當(dāng)然也不是原汁原味的翻譯,能保證90%的原汁性,另外因?yàn)槭抢斫夥g,肯定會(huì)有錯(cuò)誤的地方,歡迎指正。

歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明出處,謝謝!

里氏替換原則 簡(jiǎn)介

別擔(dān)心,里氏替換原則實(shí)際上比他的名字好理解。他是指任何在任何接受抽象化類的地方其實(shí)現(xiàn)也被接受。通俗的講,類中使用接口實(shí)現(xiàn)的地方,不需要修改代碼對(duì)于任意的接口實(shí)現(xiàn)類都將能使用。

里氏替換原則

該原則表示,程序中對(duì)于實(shí)例化對(duì)象的子類型,不需要修改代碼,可以直接進(jìn)行替換。

實(shí)探

我們繼續(xù)拿OrderProcessor舉例來(lái)闡述該原則,看下這個(gè)方法:

public function process(Order $order)
{
    // Validate order...

    $this->orders->logOrder($order);
}

Order驗(yàn)證之后,我們使用OrderRepositoryInterface接口實(shí)現(xiàn)類來(lái)記錄訂單日志。我們假定,當(dāng)訂單處理未成熟時(shí),我們將所有的訂單以CSV格式記錄到系統(tǒng)中。我們的額OrderRepositoryInterface接口實(shí)現(xiàn)類為CsvOrderRepository。當(dāng)業(yè)務(wù)繼續(xù)發(fā)展,我們想使用關(guān)系型數(shù)據(jù)庫(kù)記錄訂單。下面,我們看下一種可能的接口實(shí)現(xiàn):

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,
        ));
    }

}

現(xiàn)在,讓我們檢驗(yàn)下如何將不得不去使用此實(shí)現(xiàn):

public function process(Order $order)
{
    // Validate order...

    if ($this->repository instanceof DatabaseOrderRepository)
    {
        $this->repository->connect("root", "password");
    }

    $this->repository->logOrder($order);
}

注意,在訂單處理類中,我們強(qiáng)制檢測(cè)了OrderRepositoryInterface是否為一個(gè)數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方式。如果是,繼續(xù)數(shù)據(jù)庫(kù)的連接。在小型應(yīng)用中還算是小問(wèn)題,但是,如果在很多其他類中OrderRepositoryInterface被使用到時(shí)怎么辦?我們就只能在所有地方去添加這段“引導(dǎo)”代碼。這樣的代碼維護(hù)讓人頭痛,還會(huì)代碼潛在的bug,如果有一個(gè)地方忘記修改,就瞎了。

上述實(shí)例已違背里氏替換原則。在不修改connect方法的情況下我們無(wú)法注入接口的實(shí)現(xiàn)類。既然發(fā)現(xiàn)了問(wèn)題,那就去修復(fù)他們吧。這里是一個(gè)新的DatabaseOrderRepository實(shí)現(xiàn)類:

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,
        ));
    }

}

現(xiàn)在在DatabaseOrderRepository中實(shí)現(xiàn)了數(shù)據(jù)庫(kù)連接的管理,我們就可以從OrderProcessor中移除那段“引導(dǎo)”代碼了:

public function process(Order $order)
{
    // Validate order...

    $this->repository->logOrder($order);
}

如此改變,我們就可以在OrderProcessor中隨意使用CsvOrderRepository或者DatabaseOrderRepository了。我們的代碼遵循了里氏替換原則。很多建筑學(xué)上的概念都被討論成一種“認(rèn)知”。特別的,對(duì)于每一個(gè)類,都有其自己的“語(yǔ)境”,他周邊的代碼在其依賴環(huán)境下幫助類來(lái)完成特定的工作。當(dāng)你讓架構(gòu)朝著健壯方向發(fā)展的時(shí)候,這種類的設(shè)計(jì)“認(rèn)知”將是一種持久重要的主題。

小心漏洞

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

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/23043.html

相關(guān)文章

  • Laravel深入學(xué)習(xí)8 - 單一責(zé)任原則

    摘要:它是良好應(yīng)用設(shè)計(jì)的大原則,包含單一責(zé)任原則開放封閉原則里氏替換原則接口分離原則依賴倒置原則讓我們通過(guò)代碼示例來(lái)深究下這五個(gè)原則。實(shí)探單一責(zé)任原則代表一個(gè)類有且僅有一個(gè)改變的原因,換言之,一個(gè)類的職責(zé)范疇是嚴(yán)謹(jǐn)明確的。 聲明:本文并非博主原創(chuàng),而是來(lái)自對(duì)《Laravel 4 From Apprentice to Artisan》閱讀的翻譯和理解,當(dāng)然也不是原汁原味的翻譯,能保證90%的原...

    ymyang 評(píng)論0 收藏0
  • 深入理解JavaScript系列8:S.O.L.I.D五大原則里氏替換原則

    摘要:前言本章我們要講解的是五大原則語(yǔ)言實(shí)現(xiàn)的第篇,里氏替換原則。因此,違反了里氏替換原則。與行為有關(guān),而不是繼承到現(xiàn)在,我們討論了和繼承上下文在內(nèi)的里氏替換原則,指示出的面向?qū)ο蟆? 前言 本章我們要講解的是S.O.L.I.D五大原則JavaScript語(yǔ)言實(shí)現(xiàn)的第3篇,里氏替換原則LSP(The Liskov Substitution Principle )。英文原文:http://fre...

    susheng 評(píng)論0 收藏0
  • 嘻哈說(shuō):設(shè)計(jì)模式之里氏替換原則

    摘要:定義按照慣例,首先我們來(lái)看一下里氏替換原則的定義。同樣覆蓋了父類的非抽象方法,并將邏輯更改為跳舞,這要是違背了里氏替換原則的。而重寫顯然是不符合里氏替換原則的。里氏替換原則的核心思想就是繼承,所以優(yōu)點(diǎn)就是繼承的優(yōu)點(diǎn)。 showImg(https://user-gold-cdn.xitu.io/2018/9/19/165f1897234ef1d4?w=600&h=350&f=jpeg&s...

    dendoink 評(píng)論0 收藏0
  • 設(shè)計(jì)模式7大原則

    摘要:在面向?qū)ο笤O(shè)計(jì)中,可維護(hù)性的復(fù)用是以設(shè)計(jì)原則為基礎(chǔ)的。面向?qū)ο笤O(shè)計(jì)原則為支持可維護(hù)性復(fù)用而誕生,這些原則蘊(yùn)含在很多設(shè)計(jì)模式中,它們是從許多設(shè)計(jì)方案中總結(jié)出的指導(dǎo)性原則。 面向?qū)ο笤O(shè)計(jì)原則 概述 對(duì)于面向?qū)ο筌浖到y(tǒng)的設(shè)計(jì)而言,在支持可維護(hù)性的同時(shí),提高系統(tǒng)的可復(fù)用性是一個(gè)至關(guān)重要的問(wèn)題,如何同時(shí)提高一個(gè)軟件系統(tǒng)的可維護(hù)性和可復(fù)用性是面向?qū)ο笤O(shè)計(jì)需要解決的核心問(wèn)題之一。在面向?qū)ο笤O(shè)計(jì)中,...

    ky0ncheng 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<