0%

【Day-8】SOLID - 里式替換原則(LSP)

文章同步於it邦

介紹

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

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

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

實作

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

1
2
3
4
5
6
7
8
9
10
11
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

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

但如果今天變成這樣

1
2
3
4
5
6
7
8
9
10
11
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): 里氏替換原則