六大设计原则
原则 | 描述 |
---|---|
单一职责原则 | 一个类只负责一个功能领域中的相应职责。 |
开闭原则 | 对象应该对于扩展是开放的,对于修改是封闭的。 |
里氏替换原则 | 所有引用基类的地方必须能透明地使用其子类的对象。 |
依赖倒置原则 | 高层模块不依赖低层模块,两者应该依赖其对象;抽象不应该依赖细节;细节应该依赖抽象。 |
接口隔离原则 | 类间的依赖关系应该建立在最小的接口上。 |
迪米特原则 | 也称最少知识原则,一个对象对其他对象有最少的了解。 |
目录
01.面向对象六大原则
六大原则一句话介绍
- 单一职责原则:指一个类的功能要单一,不能包罗万象。
- 开放封闭原则:指一个模块在扩展性方面应是开放的,在更改性方面应是封闭的
- 替换原则:子类应当可以替换父类,并出现在父类能够出现的任何位置
- 依赖原则:具体依赖抽象,上层依赖下层
- 接口分离原则:模块间要通过抽象接口隔开,而不是通过具体的类强行耦合起来。
- 迪米特法则:最少知道原则是指:一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。
02.单一职责原则详解
- 问题思考:单一职责如何评判?实际有哪些运用,有哪些优势?类设计成单一好在哪里,说一下你的看法?为何说单一职责界定不清晰?
- 单一的概念:一种理解是:把模块看作比类更加抽象的概念,类也可以看作模块。另一种理解是:把模块看作比类更加粗粒度的代码块,模块中包含多个类,多个类组成一个模块。
- 单一职责如何理解:这里单一是针对类,一个类只负责完成一个职责或者功能!换一个角度来说,不要设计大而全的类,一个类如果包含多个不相干的功能,就需要将它拆成功能单一粒度的类。
- 单一职责的背景:当一个类或模块承担过多的责任时,它会变得复杂、难以理解和难以维护。所以这个时候出现了单一职责!
- 为何遵守单一原则:避免类大而全降低变更风险;提高类可维护性和可读性;提高系统的可维护性。
- 方法层面单一职责:一个方法应该只负责完成一个明确的功能,而不是承担过多的责任。比如微信支付,支付宝支付,银行卡支付,写成三个方法比写在一个方法中好!
- 接口层面单一职责:将一个接口的责任限制在一个单一的功能领域上。一个接口应该只定义与特定功能相关的方法,而不是承担过多的职责。
- 类层面单一职责:将一个类的责任限制在一个单一的功能领域上。一个类应该只负责实现一个明确的功能,而不是承担过多的职责。
- 单一职责判断有时模糊:因为单一职责原则并不是一个绝对的规则,而是一个指导性原则,需要根据具体的情况和设计目标来进行判断。
- 单一职责判断原则总结:1.类,方法,接口功能是否明确和一致;2.是否有过多的依赖和耦合;3.是否容易理解和维护;4.是否便于拓展和重用。
03.开闭原则详细介绍
- 问题思考:开闭原则的主要用途是什么?如何才能做到对外拓展开放,对内修改关闭?你平常是如何理解开闭原则的,判断的标准是什么?
- 如何理解开闭原则:软件实体(模块、类、方法等)应该“对扩展开放、对修改关闭”。
- 为何开闭原则比较难学:怎样的代码改动才被定义为‘修改’?怎么才算满足或违反‘开闭原则’?如何理解大部分设计模式都是遵循开闭原则!
- 开笔原则的背景:软件/业务迭代升级中,面对代码变化,修改原来代码可能引入原有模块bug风险,因此尽量通过对外拓展来实现功能迭代。
- 实现开闭原则的方式:常用的设计技术有以下几种,1.抽象类和接口;2.策略模式;3.装饰器模式等。
- 开闭原则的案例教学:绘制圆形/矩形,通过if-else来执行不同case逻辑,新增一种类型则需要修改原逻辑。因此考虑通过接口+抽象类方式实现友好拓展。
- 开闭原则的优点:1.提高代码拓展性和可维护性;2.提高代码可测试的粒度;3.降低的代码耦合度。
- 开闭原则的缺点:1.对代码设计要求高;2.可能会导致代码量增大和变得复杂;3.可能会带来设计上的限制。
- 总结如何理解开闭原则:当需求发生变化时,我们应该通过添加新的代码来扩展功能,而不是修改已有的代码。
- 总结如何运用开闭原则:通过封装变化、使用抽象化、利用扩展点和遵循依赖倒置原则来实现。
04.里式替换原则介绍
- 里式替换问题思考:什么是里氏替换的原则?有那些场景满足里氏替换原则?它跟多态有何区别?
- 如何理解里式替换原则:子类可以替换父类,并且保证原有的逻辑不变以及正确性不被破坏。
- 列举一个里氏替换的场景:比如支付宝,微信支付。将通用支付校验逻辑放到父类中,支付子类继承父类进行支付,支付金额都符合父类的约束。
- 里式替换原则的背景:面向对象中继承是一种机制,子类可以继承父类属性和行为。当使用继承时,子类不会破坏父类原有程序功能,这就是里氏替换的背景。
- 实现里式替换原则的方式:应该确保子类在扩展父类功能时,保持父类的行为一致性。简单说就是父类抽取通用的逻辑。
- 里式替换原则的案例教学:通用支付类中,有对金额进行校验,微信和支付宝支付子类通过继承父类,分别拓展自己的业务逻辑,且金额校验逻辑受到父类的约束。
- 里式替换原则的优点:子类替代父类行为,且不需要修改原有逻辑。可以确保代码可拓展,可维护,可重用等优点。
- 里式替换原则的缺点:存在过度设计,需要引入额外的抽象层次可能增加代码复杂性,等等。
- 总结如何理解里式替换原则:1.有继承关系;2.子类遵循父类约定;3.子类拓展行为不破坏父类行为。
- 里式替换原则跟多态的区别:多态是面向对象特性,是一个语法,子类可以替换父类实现。里氏替换是设计原则,是指子类设计要保证替换父类时,不改变原有逻辑和正确性!
05.接口隔离原则介绍
- 接口隔离问题思考:什么叫作接口隔离法则,它和面向对象中的接口有何区别?
- 如何理解接口隔离原则:
- 为何接口隔离比较难学:
- 接口隔离原则的背景:
- 实现接口隔离原则的方式:
- 接口隔离原则的案例教学:
- 接口隔离原则的优点:
- 接口隔离原则的缺点:
- 总结如何理解接口隔离原则:
- 总结如何运用接口隔离原则:
06.依赖倒置原则介绍
依赖倒置原则的概念和理解
- 依赖倒置问题思考:
- 如何理解依赖倒置原则:
- 为何依赖倒置比较难学:
- 依赖倒置原则的背景:
- 实现依赖倒置原则的方式:
- 依赖倒置原则的案例教学:
- 依赖倒置原则的优点:
- 依赖倒置原则的缺点:
- 总结如何理解依赖倒置原则:
- 总结如何运用依赖倒置原则:
07.迪米特原则介绍
迪米特原则的概念和理解
- 迪米特问题思考:
- 如何理解迪米特原则:
- 为何迪米特比较难学:
- 迪米特原则的背景:
- 实现迪米特原则的方式:
- 迪米特原则的案例教学:
- 迪米特原则的优点:
- 迪米特原则的缺点:
- 总结如何理解迪米特原则:
- 总结如何运用迪米特原则:
08.代码保持简单原则
代码保持简单原则的概念和理解
- 代码保持简单问题思考:
- 如何理解代码保持简单原则:
- 为何代码保持简单比较难学:
- 代码保持简单原则的背景:
- 实现代码保持简单原则的方式:
- 代码保持简单原则的案例教学:
- 代码保持简单原则的优点:
- 代码保持简单原则的缺点:
- 总结如何理解代码保持简单原则:
- 总结如何运用代码保持简单原则:
09.DRY原则简单介绍
DRY原则的概念和理解
- DRY问题思考:
- 如何理解DRY原则:
- 为何DRY比较难学:
- DRY原则的背景:
- 实现DRY原则的方式:
- DRY原则的案例教学:
- DRY原则的优点:
- DRY原则的缺点:
- 总结如何理解DRY原则:
- 总结如何运用DRY原则: