1. 面向对象设计的核心基石
第一次接触面向对象编程时,我像大多数初学者一样,以为只要把数据和函数打包在一起就是"对象"。直到在真实项目中踩过几次坑后才明白,类与对象的设计质量直接决定了软件的可维护性和扩展性。今天我们就来深入探讨那些教科书不会告诉你的实战设计原则。
在商业级代码中,类设计远不止语法正确那么简单。我曾见过一个电商系统的订单类膨胀到3000多行代码,仅仅因为初期没有遵循单一职责原则。后来每次修改支付逻辑都要冒着破坏物流计算的风险,维护成本呈指数级增长。这就是为什么我们需要在Week 2 Day 1这个阶段就建立正确的设计思维。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. SOLID原则的实战解读
2.1 单一职责原则(SRP)的边界划分
SRP看似简单,实操中却最容易违反。去年重构一个文件解析器时,我发现某个类同时负责XML解析、数据校验和数据库写入。这种"全能类"导致:
- 修改解析逻辑会影响数据库操作
- 无法单独复用校验功能
- 单元测试需要mock多个依赖
正确的做法是拆分为:
python复制class XmlParser:
def parse(raw_data): ...
class DataValidator:
def validate(parsed_data): ...
class DbWriter:
def write(valid_data): ...
经验:判断职责是否单一的标准是"修改理由"。如果一个类有多个修改的原因,就需要拆分。
2.2 开闭原则(OCP)的落地姿势
OCP要求对扩展开放,对修改关闭。在开发支付模块时,我们最初用if-else处理不同支付方式:
python复制class Payment:
def pay(self, method):
if method == "alipay":
# 支付宝逻辑
elif method == "wechat":
# 微信逻辑
这种写法在新增银联支付时需要修改原有类,违反OCP。
重构后的方案:
python复制class Payment(ABC):
@abstractmethod
def pay(self): pass
class Alipay(Payment): ...
class WechatPay(Payment): ...
现在新增支付方式只需扩展新类。关键在于识别哪些部分会变化,哪些保持稳定。
2.3 里氏替换原则(LSP)的继承陷阱
LSP强调子类必须能替换父类。我曾见过这样的继承体系:
python复制class Rectangle:
def set_width(self, w): ...
def set_height(self, h): ...
class Square(Rectangle):
def set_width(self, w):
super().set_width(w)
super().set_height(w) # 破坏矩形行为
这会导致使用Rectangle的代码在接收Square时出现意外行为。解决方法:
- 取消继承关系
- 引入Shape抽象基类
- 或使用组合替代继承
