You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python SOLID接口隔离原则下Product类方法实现合理性咨询

Product类get_unit_price方法实现合理性分析

你当前的实现不正确,存在多个设计问题,同时违背了你关注的SOLID接口隔离原则,具体原因和改进方案如下:

问题原因

  1. 违背接口隔离原则:Product类仅需要price和quantity两个属性,但却依赖了大而全的Info接口(该接口返回包含所有字段的字典)。这导致Product被迫依赖它不需要的接口内容,不符合“客户端不应该依赖它不需要的接口”的原则。
  2. 类型不安全与容错性差:通过字典get()方法取值存在键名拼写错误的风险(比如把'price'写成'pric'),此时会返回None,执行乘法操作时直接抛出TypeError;同时字典取值没有类型提示,编辑器无法做静态类型检查,增加出错概率。
  3. 冗余性能损耗:重复调用self.product_info.get_info(),如果该方法包含计算逻辑或IO操作,会重复执行不必要的代码,造成性能浪费。
  4. 方法名语义错误:get_unit_price字面意思是“获取单价”,但代码逻辑是计算price * quantity(总价),语义不符易造成误解。

改进方案

核心思路是遵循接口隔离原则,拆分大接口为多个职责单一的小接口,让Product仅依赖它真正需要的接口:

from abc import ABC, abstractmethod

# 拆分出职责单一的小接口
class PriceProvider(ABC):
    @abstractmethod
    def get_price(self) -> float:
        ...

class QuantityProvider(ABC):
    @abstractmethod
    def get_quantity(self) -> int:
        ...

# ProductInfo实现所需的接口,保留原有get_info方法(如果业务需要)
class ProductInfo(PriceProvider, QuantityProvider):
    id: str
    name: str
    price: float
    quantity: int

    def get_price(self) -> float:
        return self.price

    def get_quantity(self) -> int:
        return self.quantity

    def get_info(self) -> dict:
        return {
            'id': self.id,
            'name': self.name,
            'price': self.price,
            'quantity': self.quantity,
        }

# CarInfo仅实现自身需要的接口,无需依赖QuantityProvider
class CarInfo(PriceProvider, ABC):
    car_number: str
    max_speed: float
    price: float
    reg_place: str

    def get_price(self) -> float:
        return self.price

    def get_car_info(self) -> dict:
        return {
            'car_number': self.car_number,
            'max_speed': self.max_speed,
            'price': self.price,
            'reg_place': self.reg_place
        }

class Car:
    car_info: CarInfo

class Product:
    # 仅依赖需要的两个小接口,而非大而全的Info
    product_info: PriceProvider & QuantityProvider

    # 修正方法名语义,改为获取总价
    def get_total_price(self) -> float:
        return self.product_info.get_price() * self.product_info.get_quantity()

改进优势

  • 符合接口隔离原则:Product只依赖PriceProvider和QuantityProvider两个必要接口,避免了对无关字段的依赖。
  • 类型安全与可读性提升:通过明确的方法调用获取属性,有完整的类型提示,编辑器可做静态检查,避免键名错误。
  • 性能优化:无需重复调用get_info和字典查找,直接访问封装后的属性方法。
  • 扩展性增强:后续新增类时,仅需实现对应职责的接口即可,无需被迫实现无关方法。

内容的提问来源于stack exchange,提问作者user20291246

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 17:02:25