使用 Python 的接口分离原则

作者 : 慕源网 本文共2508个字,预计阅读时间需要7分钟 发布时间: 2021-10-4 共311人阅读

使用 Python 的接口分离原则

介绍

在 OOP(面向对象编程)语言中,坚实的原则起到了理想的设计作用,使类变得灵活且易于理解。今天我们就来看看接口隔离原理。

为什么是ISP?

当我们设计/开发一个类时,该类不应实现任何客户不需要的功能,即使是我们正在设计或开发的相关类。
让我们看一个例子,为学校、商店和程序员开发计算器。
当我们说计算器时,我们会想到很多东西,例如加、减、除法、乘法、三角函数、微积分等。
以下是完整填写上述所有 3 种用户(即学校、商店和程序员)的代码
import math  
  
class Calculator():  
    def add(self, *nums):          
        return sum(nums)  
  
    def substract(self, a, b):            
        return a - b if a > b else b - a  
  
    def multplicaton(self, nums):  
        return math.prod(nums)  
  
    def division(self, a, b):          
        return a - b if a / b else b / a  
  
    def sin_of(self, x):          
        return math.sin(x)  
  
    def cos_of(self, x):  
        return math.cos(x)  
  
    def tan_of(self, x):  
        return math.tan(x)  
  
    def convert_hex_to_binary(self, input):  
        return f"Add logic to Convert to Binary for hex input : {input}"  
  
    def convert_binary_to_hex(self, input):  
        return f"Add logic to Convert to hex for Binary input : {input}"  

但是如果我们观察上面的代码,我们可以理解,我们提供了一些用户可能不感兴趣的额外特性(因为用户不会使用它)。

例如,店主只需要像add、sub、mult、div这样的常用函数。该用户不需要三角函数和HexToBinary函数,反之亦然。

学生需要公共函数+三角函数+可能需要也可能不需要HexToBinary函数,反之亦然。

但是,由于我们设计和开发了班级,包括所有课程,我们在这里没有隔离的选择。我们需要向最终用户提供所有功能。

在这个阶段我们ISP将发挥关键作用。我们可以将 Calculator 类拆分为以下抽象类(Contracts)。

from abc import ABC, abstractmethod  
  
class ICommonCalci(ABC):  
    @abstractmethod  
    def add(self, *nums):          
        pass  
 
    @abstractmethod  
    def substract(self, a, b):            
        pass  
 
    @abstractmethod  
    def multplicaton(self, nums):  
        pass  
     
    @abstractmethod  
    def division(self, a, b):          
        pass  
from abc import ABC, abstractmethod  
  
class IProgrammerCalci(ABC):  
     
    @abstractmethod  
    def convert_hex_to_binary(self, input):  
        pass  
 
    @abstractmethod  
    def convert_binary_to_hex(self, input):  
        pass  
from abc import ABC, abstractmethod  
  
class ITrigonometryCalci(ABC):  
 
    @abstractmethod  
    def sin_of(self, x):          
        pass  
 
    @abstractmethod  
    def cos_of(self, x):  
        pass  
 
    @abstractmethod  
    def tan_of(self, x):  
        pass  

下面是 3 类新的计算器。如果我们仔细观察它们,我们在这里实现了多级继承,根据用户的需要,我们可以将特定的计算器交付给用户。

class Common_calculator(ICommonCalci):  
    def add(self, *nums):          
        return sum(nums)  
  
    def substract(self, a, b):            
        return a - b if a > b else b - a  
  
    def multplicaton(self, nums):  
        return math.prod(nums)  
  
    def division(self, a, b):          
        return a - b if a / b else b / a  
class School_calculator(Common_calculator, ITrigonometryCalci):  
    def sin_of(self, x):          
        return math.sin(x)  
  
    def cos_of(self, x):  
        return math.cos(x)  
  
    def tan_of(self, x):  
        return math.tan(x)  
class Programmer_calculator(School_calculator, IProgrammerCalci):  
    def convert_hex_to_binary(self, input):  
        return f"Add logic to Convert to Binary for hex input : {input}"  
  
    def convert_binary_to_hex(self, input):  
        return f"Add logic to Convert to hex for Binary input : {input}" 
根据上面的代码,我们可以看到,
  • 对于 Shop 持有者,我们可以提供实现 ICommonCalci 的 Common_calculator
  • 对于Students,我们可以提供School_calculator,它继承了Common_calculator,并实现了ITrigonometryCalci
  • 对于程序员,我们可以提供Programmer_calculator,它继承了School_calculator,并实现了IProgrammerCalci
通过这种方式,我们满足了所有用户的要求。对于新类型的用户和新类型的需求,这个类仍然可以扩展新合同。

概括

在本文中,我们了解了接口隔离原理。我附上了这篇文章的源代码。下载并扩展它以更好地理解。

慕源网 » 使用 Python 的接口分离原则

常见问题FAQ

程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!

发表评论

开通VIP 享更多特权,建议使用QQ登录