编辑
2025-01-02
小白笔记
0

目录

1. 单一职责原则(SRP - Single Responsibility Principle)
2. 开放关闭原则(OCP - Open/Closed Principle)
3. 里氏替换原则(LSP - Liskov Substitution Principle)
4. 依赖倒置原则(DIP - Dependency Inversion Principle)
5. 接口隔离原则(ISP - Interface Segregation Principle)
6. 最少知识原则(LoD - Law of Demeter)
7. 合成复用原则(CRP - Composite Reuse Principle)

title: 七大设计原则 category: 小白笔记 updatedAt: 2025-01-02T02:38:39.669Z createdAt: 2025-01-02T01:44:48.663Z


1. 单一职责原则(SRP - Single Responsibility Principle)

定义:一个类应该只有一个引起其变化的原因。

解释:一个类只负责完成一个功能或者职责,避免一个类承担过多职责导致的高耦合和低内聚。

好处:降低复杂性,提高代码的可读性和维护性。

总结: 如果一个类负责太多的事情,改动一处就会影响很多功能,所以要一个类做一个事。

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("管理订单")

2. 开放关闭原则(OCP - Open/Closed Principle)

定义:软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。

解释:在不修改已有代码的情况下,通过扩展实现新功能(如使用继承或接口)。

好处:提高系统的稳定性和可扩展性,减少对现有代码的影响。

总结:能加新代码,不改老代码。

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

3. 里氏替换原则(LSP - Liskov Substitution Principle)

定义:子类对象必须能够替代父类对象且程序行为保持一致。

解释:子类在继承时不能破坏父类的功能,也不能违反父类的约定。

好处:保证系统的健壮性,避免因继承导致的异常行为。

总结:子类在继承时不能破坏父类的功能,也不能违反父类的约定。

例子:鸟类飞翔不能让企鹅飞

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("企鹅在游泳")

4. 依赖倒置原则(DIP - Dependency Inversion Principle)

定义:高层模块不应该依赖于低层模块,二者都应该依赖于抽象;抽象不应该依赖于具体实现,具体实现应该依赖于抽象。

解释:通过接口或抽象类隔离高层模块和底层模块的依赖关系。

好处:降低模块间的耦合,提高代码的灵活性和复用性。

大白话:老大和小弟都听总指挥,不直接互相使唤。代码中,高层模块和底层模块都依赖接口。

例子:键盘和鼠标都接电脑,但电脑只依赖“外设接口”。

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()) # 鼠标连接

5. 接口隔离原则(ISP - Interface Segregation Principle)

定义:客户端不应该被迫依赖于它不需要的接口。 解释:将大的接口拆分为更小的、特定的接口,避免单个接口包含过多无关方法。 好处:提高系统的灵活性和解耦性。

6. 最少知识原则(LoD - Law of Demeter)

定义:一个对象应当对其他对象有最少的了解。 解释:对象只与直接关联的对象通信,而不是与它不直接关联的对象通信(减少“朋友的朋友”关系)。 好处:降低耦合性,减少因变化引起的连锁反应。

7. 合成复用原则(CRP - Composite Reuse Principle)

定义:优先使用对象组合,而不是继承来实现代码复用。 解释:通过将已有对象作为成员变量,而不是直接继承来实现功能复用。 好处:减少继承层级,增加设计灵活性。e111e

本文作者:墨洺的文档

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!