title: 七大设计原则 category: 小白笔记 updatedAt: 2025-01-02T02:38:39.669Z createdAt: 2025-01-02T01:44:48.663Z
定义:一个类应该只有一个引起其变化的原因。
解释:一个类只负责完成一个功能或者职责,避免一个类承担过多职责导致的高耦合和低内聚。
好处:降低复杂性,提高代码的可读性和维护性。
总结: 如果一个类负责太多的事情,改动一处就会影响很多功能,所以要一个类做一个事。
python# 不遵守SRP:一个类干了两件事
class UserManager:
def manage_user(self):
print("管理用户")
def manage_order(self):
print("管理订单") # 不应该出现在这里
# 遵守SRP:拆分职责
class UserManager:
def manage_user(self):
print("管理用户")
class OrderManager:
def manage_order(self):
print("管理订单")
定义:软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。
解释:在不修改已有代码的情况下,通过扩展实现新功能(如使用继承或接口)。
好处:提高系统的稳定性和可扩展性,减少对现有代码的影响。
总结:能加新代码,不改老代码。
python# 不遵守OCP:直接修改老代码
def calculate_discount(order):
if order.type == "VIP":
return order.total * 0.8
elif order.type == "Normal":
return order.total * 0.9
# 遵守OCP:通过扩展增加功能
class Discount:
def calculate(self, order):
raise NotImplementedError
class VIPDiscount(Discount):
def calculate(self, order):
return order.total * 0.8
class NormalDiscount(Discount):
def calculate(self, order):
return order.total * 0.9
定义:子类对象必须能够替代父类对象且程序行为保持一致。
解释:子类在继承时不能破坏父类的功能,也不能违反父类的约定。
好处:保证系统的健壮性,避免因继承导致的异常行为。
总结:子类在继承时不能破坏父类的功能,也不能违反父类的约定。
例子:鸟类飞翔不能让企鹅飞
python
# 不遵守LSP:企鹅不能飞,违背鸟类规则
class Bird:
def fly(self):
print("飞翔!")
class Penguin(Bird):
def fly(self):
raise Exception("企鹅不会飞") # 问题:不该有飞的方法
# 遵守LSP:抽象出具体行为
class Bird:
def move(self):
print("移动!")
class Penguin(Bird):
def move(self):
print("企鹅在游泳")
定义:高层模块不应该依赖于低层模块,二者都应该依赖于抽象;抽象不应该依赖于具体实现,具体实现应该依赖于抽象。
解释:通过接口或抽象类隔离高层模块和底层模块的依赖关系。
好处:降低模块间的耦合,提高代码的灵活性和复用性。
大白话:老大和小弟都听总指挥,不直接互相使唤。代码中,高层模块和底层模块都依赖接口。
例子:键盘和鼠标都接电脑,但电脑只依赖“外设接口”。
python# 不遵守DIP:电脑依赖具体设备
class Computer:
def use_keyboard(self):
print("使用键盘")
def use_mouse(self):
print("使用鼠标")
# 遵守DIP:通过接口隔离
class Peripheral:
def connect(self):
raise NotImplementedError
class Keyboard(Peripheral):
def connect(self):
print("键盘连接")
class Mouse(Peripheral):
def connect(self):
print("鼠标连接")
class Computer:
def use_device(self, device: Peripheral):
device.connect()
pc = Computer()
pc.use_device(Keyboard()) # 键盘连接
pc.use_device(Mouse()) # 鼠标连接
定义:客户端不应该被迫依赖于它不需要的接口。 解释:将大的接口拆分为更小的、特定的接口,避免单个接口包含过多无关方法。 好处:提高系统的灵活性和解耦性。
定义:一个对象应当对其他对象有最少的了解。 解释:对象只与直接关联的对象通信,而不是与它不直接关联的对象通信(减少“朋友的朋友”关系)。 好处:降低耦合性,减少因变化引起的连锁反应。
定义:优先使用对象组合,而不是继承来实现代码复用。 解释:通过将已有对象作为成员变量,而不是直接继承来实现功能复用。 好处:减少继承层级,增加设计灵活性。e111e
本文作者:墨洺的文档
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!