里氏替換原則 - PHP面向?qū)ο缶幊蹋∣OP)

    PHP面向?qū)ο缶幊蹋∣OP)用里氏替換原則來(lái)規(guī)范自己的行為

    我的理解,父類(lèi)有的,子類(lèi)也得有。父類(lèi)提供了地基,子類(lèi)繼承地基,繼續(xù)建房子即可,玩玩不可在子類(lèi)上取破壞父類(lèi)提供的地基。

    為什么叫里氏替換原則?

    里氏替換原則在SOLID這五個(gè)設(shè)計(jì)原則中是比較特殊的存在:

    • 如果違反了里氏替換原則,不只是降低軟件設(shè)計(jì)的優(yōu)雅性,很可能會(huì)導(dǎo)致Bug
    • 只有里氏替換原則是以人名命令的

    里氏替換原則譯自Liskov substitution principle。Liskov是一位計(jì)算機(jī)科學(xué)家,也就是Barbara Liskov,麻省理工學(xué)院教授,也是美國(guó)第一個(gè)計(jì)算機(jī)科學(xué)女博士,師從圖靈獎(jiǎng)得主John McCarthy教授,人工智能概念的提出者。

    里氏替換原則最初由Barbara Liskov在1987年的一次學(xué)術(shù)會(huì)議中提出,而真正正式發(fā)表是在1994年,Barbara Liskov 和 Jeannette Wing發(fā)表的一篇學(xué)術(shù)論文《A behavioral notion of subtyping》.

    什么是里氏替換原則?

    里氏替換原則在1994年Barbara Liskov 和 Jeannette Wing發(fā)表論文中的描述是:

    If S is a declared subtype of T, objects of type S should behave as objects of type T are expected to behave, if they are treated as objects of type T

    從字面上翻譯:如果S是T的子類(lèi)型,對(duì)于S類(lèi)型的任意對(duì)象,如果將他們看作是T類(lèi)型的對(duì)象,則對(duì)象的行為也理應(yīng)與期望的行為一致。

    而另一種關(guān)于里氏替換原則的描述為Robert Martin在《敏捷軟件開(kāi)發(fā):原則、模式與實(shí)踐》一書(shū)中對(duì)原論文的解讀:子類(lèi)型(subtype)必須能夠替換掉他們的基類(lèi)型(base type)。這個(gè)是更簡(jiǎn)明的一種表述。

    如何理解里氏替換原則?

    不管是Barbara Liskov論文中的表述,還是Robert Martin的解讀,都是比較抽象的表達(dá)。要理解里氏替換原則,其實(shí)就是要理解兩個(gè)問(wèn)題:

    • 什么是替換?
    • 什么是與期望行為一致的替換(Robert Martin所說(shuō)的“必須能夠替換”)?

    什么是替換

    替換的前提是面向?qū)ο笳Z(yǔ)言所支持的多態(tài)特性,同一個(gè)行為具有多個(gè)不同表現(xiàn)形式或形態(tài)的能力。

    什么是與期望行為一致的替換?

    在不了解派生類(lèi)的情況下,僅通過(guò)接口或基類(lèi)的方法,即可清楚的知道方法的行為,而不管哪種派生類(lèi)的實(shí)現(xiàn),都與接口或基類(lèi)方法的期望行為一致?;蛘哒f(shuō)接口或基類(lèi)的方法是一種契約,使用方按照這個(gè)契約來(lái)使用,派生類(lèi)也按照這個(gè)契約來(lái)實(shí)現(xiàn)。這就是與期望行為一致的替換。

    違反里氏替換原則的危害

    當(dāng)我們違反了這一原則會(huì)帶來(lái)有一些危害:

    • 反直覺(jué)。期望所有子類(lèi)行為是一致的,但如果不一致可能需要文檔記錄,或者在代碼跑失敗后漲此知識(shí);
    • 不可讀。如果子類(lèi)行為不一致,可能需要不同的邏輯分支來(lái)適配不同的行為,徒增代碼復(fù)雜度;
    • 不可用??赡艹鲥e(cuò)的地方終將會(huì)出錯(cuò)。

    如何避免違反里氏替換原則

    談到如何避免,當(dāng)然要基于里氏替換原則的定義,與期望行為一致的替換

    • 從行為出發(fā)來(lái)設(shè)計(jì)。在做抽象或設(shè)計(jì)時(shí),不只是要從模型概念出發(fā),還要從行為出發(fā),比如一個(gè)經(jīng)典的例子,正方形和長(zhǎng)方形,從現(xiàn)實(shí)的概念中正方形是一個(gè)長(zhǎng)方形,但是在計(jì)算其面積的行為上是不一致的。
    • 基于契約設(shè)計(jì)。這個(gè)契約即是基類(lèi)方法簽名、功能描述、參數(shù)類(lèi)型、返回值等。在派生類(lèi)的實(shí)現(xiàn)時(shí),時(shí)刻保持派生類(lèi)與基類(lèi)的契約不被破壞。

    參考文章

    php

    類(lèi)中類(lèi)外訪問(wèn)靜態(tài)成員和普通成員 - PHP面向?qū)ο缶幊蹋∣OP)

    2022-8-25 17:27:46

    php

    self關(guān)鍵字詳解(parent、static和this) - PHP

    2022-8-26 17:37:19

    ??
    Npcink上的部份代碼及教程來(lái)源于互聯(lián)網(wǎng),僅供網(wǎng)友學(xué)習(xí)交流,若您喜歡本文可附上原文鏈接隨意轉(zhuǎn)載。
    無(wú)意侵害您的權(quán)益,請(qǐng)發(fā)送郵件至 1355471563#qq.com 或點(diǎn)擊右側(cè) 私信:Muze 反饋,我們將盡快處理。
    0 條回復(fù) A文章作者 M管理員
      暫無(wú)討論,說(shuō)說(shuō)你的看法吧
    ?
    個(gè)人中心
    購(gòu)物車(chē)
    優(yōu)惠劵
    今日簽到
    有新私信 私信列表
    搜索
    主站蜘蛛池模板: 一级毛片完整版免费播放一区| 精品一区二区三区波多野结衣 | 国产一区美女视频| 国产激情一区二区三区四区| 久久精品一区二区三区资源网 | 国产精品无码一区二区三区电影| 亚洲欧美一区二区三区日产| 一区二区三区四区视频| 性色av闺蜜一区二区三区| 亚洲国产精品无码久久一区二区| 欧洲精品一区二区三区| 精品成人乱色一区二区| 久久精品一区二区三区资源网| 少妇无码AV无码一区| 一区 二区 三区 中文字幕| 精品深夜AV无码一区二区老年| 日本一区二区不卡视频| 中文字幕亚洲一区二区三区| 亚洲午夜精品第一区二区8050| 无码人妻精品一区二区蜜桃| 色窝窝免费一区二区三区| 国产乱码精品一区二区三区| 在线观看视频一区二区| 精品国产一区二区三区www| 在线观看国产一区二区三区| 国内精品视频一区二区三区八戒| 亚洲高清一区二区三区电影| 国产精品第一区揄拍| 久久精品成人一区二区三区| 日本一区二区三区四区视频| 国产裸体舞一区二区三区| 国产SUV精品一区二区88L | 国产视频一区二区在线播放| 国产日韩一区二区三区在线观看| 熟女大屁股白浆一区二区| 无码人妻精品一区二区三区66 | 日本一区二区免费看| 久久精品一区二区三区资源网| 国产精品分类视频分类一区| 国内精品一区二区三区最新| 一区视频在线播放|