Thinkin Markdown

里氏替換原則 LSP

先聽爸爸說

發佈時間 2020-03-16
閱讀時間 3 分鐘
主題 物件導向設計原則
標籤
SOLID 原則

此篇文章偏重於以圖解方式,簡單帶大家了解 里氏替換原則 哦,有興趣就往下看吧!

LSP 為 Liskov Substitution Principle 簡寫,均意為里氏替換原則。

👍 若開發途中有持續遵循 LSP 原則的話,其實它會讓你程式越來越彈性!(越好實現出 OCP 原則)

定義

以下擷取自 wikipedia

if S is a subtype of T, then objects of type T may be replaced with objects of type S (i.e. an object of type T may be substituted with any object of a subtype S) without altering any of the desirable properties of the program (correctness, task performed, etc.).

假如 S 是 T 的子型態,則 T 型態的物件(OT)可以被 S 型態的物件(OS)所取代(換句話說,T 型態的物件(OT)可以被任何 S 型態的物件(OS)所替代),而不改變程式任何的描述(正確性、行為···等等)。

見解

確實定義不是那麼好理解,簡單說就是:

⭐️ 不論是透過繼承(Inherit)實作(Implement)的子類別,在程式經過替換子類別這一手段下,以不影響其正確性或行為情況下,就算是有符合該原則了!

類別圖探討

這邊依舊拿 SRP 最後討論出來的方案 C 做說明,如下原圖:

srp-5

Plan C

接著將焦點移向右下角 Printer 處。

lsp-1

❓ 紅圈處就符合 LSP 原則,為什麼?

以程式的行為來看,要把文章做呈現(Print),但是我可以透過使用文字文件(PlainText)、可攜式文件(PDF)來呈現文章。

那假如今天我想要透過網頁(Html)來呈現,只要去實作 Printer 介面,然後讓 ConcreteUtility 替換掉原本 printer 的實例(物件)就可以了!

即便是替換掉了 printer 實例(物件) ,也沒有因此改變掉程式原本的行為(文章呈現),故符合 LSP 原則!

參考

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

結尾

感謝各位花時間看完此篇文章,如果本文中有描述錯誤,還請各位指教。

希望這篇文章可以讓大家了解 Liskov Substitution Principle,開發途中經常會碰到需要繼承(Inherit)、實作(Implement)的時候,但多數撰寫程式的人,一開始不太會意識到寫程式是專注於行為上,而是以寫程式的角度來操作繼承跟實作,所以不知不覺中就違反了 LSP 原則!

我想這一部分多少也有從大學時期所帶出來的知識相關,知識的”活”用跟”硬”用,我想差別就在這了···

如果這篇文章對你有幫助,歡迎分享給更多人!

贊助支持

如果你喜歡我們的文章,或是這些內容對你有幫助,歡迎透過以下平台請我們喝杯咖啡,支持我們持續創作!

Ko-fi

作者

NE

Neil Tsai

樂於分享所見所聞所覺所知的全端工程師

留言功能需要 Cookie 授權

為了載入留言功能,我們需要您同意使用「功能性 Cookie」。您可以隨時在設定中調整。

免責聲明

本網站對於任何使用或引用本網站網頁資料引致之損失或損害,概不負責。本網站亦有權隨時刪除、暫停或編輯本網站所登載之各項資料,以維護本網站之權益。除法律有強制規定外,在任何情況下,本網站對於 (1) 使用或無法使用本網站之各項服務;(2) 經由本網站取得訊息或進行交易;(3) 第三人在本網站上之陳述或作為;以及 (4) 其他與本網站服務有關之事項所致生之任何直接、間接、附帶、特別、懲罰性或衍生性損害,一概不負賠償責任。

CopyRight © 2026 Thinkin Markdown