iT邦幫忙

2023 iThome 鐵人賽

DAY 8
1

文章同步於blog

介紹

這次介紹的是里式替換原則(LSP, Liskov Substitution Principle)
里式替換原則的核心思想是:如果類別B是類別A的子類別,那麼在不影響程式的正確性的前提下,可以將類別A的對象替換成類別B的對象。

換句話說,子類別應該能夠替換父類別而不會破壞程式的預期行為。

(謎之音:半夜上文章好累...

實作

假設我今天我定義一個形狀 - 長方形
那我的遵守LSP的程式碼會長這樣

class Shape:
    def calculateArea(self):
        pass

class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height
    
    def calculateArea(self):
        return self.width * self.height

這個情況下長方形是一種形狀,那我一定有面積
我可以安全的替換掉父類別而不影響其他的實作

但如果今天變成這樣

class Rectangle():
    def calculateArea(self):
        pass

class Square(Rectangle):
    def __init__(self, width, height):
        self.width = width
        self.height = height
    
    def calculateArea(self):
        return self.width * self.height

這樣就會容易讓人混淆正方形的長寬一定相同,但長方形不是,這樣就不符合里式替換原則
再舉一個經典的例子

所有鳥類都會飛嗎?
不,企鵝不會
所有的狗狗都很聰明嗎?
不,吉娃娃不是。

所以當我們實作一個鳥類的介面出來,給企鵝用,企鵝只會跟妳哭說我不會飛(預期之外的錯誤)

參考資料

Clean Architecture(ch.9)
菜雞與物件導向 (12): 里氏替換原則


上一篇
【Day-7】SOLID - 開放封閉原則(OCP)
下一篇
【Day-9】介面隔離原則(ISP)
系列文
軟體開發 - 程式不是會跑就好30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言