2.物件導向設計原則

ThankCAT發表於2024-03-26

目錄
  • 1. 開放封閉原則
  • 2. 里氏替換原則
  • 3. 依賴倒置原則
  • 4. 介面隔離原則
  • 5. 單一職責原則

1. 開放封閉原則

一個軟體實體如類、模組和函式應該對擴充套件開放,對修改關閉。即軟體實體應該在不修改原始碼的情況下進行修改。

2. 里氏替換原則

所有引用父類的地方必須能透明地使用其子類地方必須能透明地使用其子類的物件,一個簡單的例子加強理解

class User(object):
    def print_name(self):
        pass

class VipUser(User):
    def print_name(self):
        """
        保證引數和返回值型別需要和父類一樣
        :return:
        """
        pass
def print_name(u):
    """
    不論使用User還是繼承User的VipUser,呼叫的方式是一樣的。這就要求User和VipUser的方法引數和返回值型別是一樣的
    :param u:
    :return:
    """
    u.print_name()
3. 依賴倒置原則

高層模組不應該依賴底層模組,二者都應該依賴抽象。抽象不應該依賴細節,細節應該應該依賴抽象。要針對介面程式設計,而不是針對實現變成。透過例子加強理解:

from abc import ABCMeta, abstractmethod

# 介面,抽象不應該依賴細節
class Payment(metaclass=ABCMeta):
    @abstractmethod
    def pay(self, money):
        pass
        
# 底層程式碼和高層程式碼都是細節,細節應該依賴抽象
# 底層程式碼
class Alipay(Payment):
    def pay(self, money):
        print("支付寶支付了{0}元!".format(money))

class WechatPay(Payment):
    def pay(self, money):
        print("微信支付了%d元!" % (money))

# 高層程式碼,高層模組不應該依賴底層模組,二者都應該依賴抽象
a = Alipay()
w = WechatPay()
a.pay(100)
w.pay(100)
4. 介面隔離原則

使用多個專門的介面,而不使用單一的總結口,高層的程式碼不應該依賴那些它不需要的介面。透過例子加強理解:

from abc import ABCMeta, abstractmethod

class LandAnimal(metaclass=ABCMeta):
    @abstractmethod
    def walk(self):
        pass

class WaterAnimal(metaclass=ABCMeta):
    @abstractmethod
    def swim(self):
        pass

class SkyAnimal(metaclass=ABCMeta):
    @abstractmethod
    def fly(self):
        pass

# 高層的程式碼不應該依賴那些它不需要的介面
class Tiger(LandAnimal):
    def walk(self):
        pass

# 高層的程式碼不應該依賴那些它不需要的介面
class Frog(LandAnimal, WaterAnimal):
    def walk(self):
        pass
5. 單一職責原則

不要存在多於一個導致類變更的原因,一個類只負責一項職責,一個類只做一件事。把程序導向的程式碼放到類中,雖然用到了類,但不是物件導向

相關文章