写在学习之前
From 《Head First 设计模式》
- 如何欺骗大脑“这是一件非常重要的必须记住的事情”:
- 大量重复
- 尽可能调动大脑思考:
- 图中嵌入文字,思考图文关系
- 交谈式风格(对白),而不是听报告(干巴巴)
- 新鲜感:以不同方式表述
- 实践练习
- Tips:
- 欲速则不达,思考理解越多,需要记忆的越少
- 练习+笔记(让阅读的速度慢下来)
- 阅读There are no Dumb Questions部分
- 学习一段时间之后别再学有难度的东西,给大脑留出处理和记忆知识的时间
- 多喝水
- 大声说出来
- 学不进去时,休息一会儿
- 融入到书中的故事里
- 应用到新项目中
1. 设计模式学习导读
知识是用来解决问题的,而不是用来记忆考试的
- 即便细节记不清了,只需要稍微查看一下资料,就能全部回忆起来。
学习对能力的锻炼,比单纯的知识记忆要有意义得多
- 最基础的自学能力、理解能力、逻辑思维能力
- 时间空间复杂度分析能力、分析发现解决代码问题能力
忘记并不等于就白学了,学习对于一个人的影响是潜移默化的
- 你要相信,它总有一天会发挥作用的,机会都是给有准备的人,我们要学会“延迟满足”。
1.1. 为什么要学习设计模式?
- 应对面试
- 告别烂代码
- 编写易扩展、易用、易维护的高质量代码
- 读源码、学框架
- 胜任技术 leader
1.2. 从哪些维度评价代码质量?
-
可维护性(maintainability)★
- 主观评价:bug 容易修复,修改、添加功能能够轻松完成
-
可读性(readability)★
- 代码符合编码规范、命名达意、注释详尽、函数长短合适、模块划分清晰、符合高内聚低耦合……(通过同事的 code review)
-
可扩展性(extensibility)★
- 不需修改原有代码,将新功能直接插到代码预留的功能扩展点上
-
灵活性(flexibility)
- 一段代码易扩展、易复用或者接口易用 → 灵活
-
简洁性(simplicity)
- KISS 原则:“Keep It Simple,Stupid”
- 代码简单、逻辑清晰
-
可复用性(reusability)
- 设计原则 DRY(Don’t Repeat Yourself)
-
可测试性(testability)
- 易写单元测试
- 从侧面准确反映代码质量
简洁性 → 可读性 → 可维护性
可扩展性↗
可扩展性↘
灵活性
可复用性↗
1.3. 面向对象、设计原则、设计模式、编程规范、重构有何关系?
面向对象(设计思想):
- 四大特性:封装、抽象、继承、多态
- 面向对象编程与面向过程编程的区别和联系
- 面向对象分析、面向对象设计、面向对象编程
- 接口和抽象类的区别以及各自的应用场景
- 基于接口而非实现编程的设计思想
- 多用组合少用继承的设计思想
- 面向过程的贫血模型和面向对象的充血模型
设计原则:
- SOLID 原则 - SRP 单一职责原则
- SOLID 原则 - OCP 开闭原则
- SOLID 原则 - LSP 里式替换原则
- SOLID 原则 - ISP 接口隔离原则
- SOLID 原则 - DIP 依赖倒置原则
- DRY 原则、KISS 原则、YAGNI 原则、LOD 法则
- 设计初衷
- 能够解决的问题
- 应用场景
设计模式:
开发初期不要使用复杂的设计模式,代码出现问题再进行重构
- 创建型
常用:单例模式、工厂模式(工厂方法和抽象工厂)、建造者模式
不常用:原型模式
- 结构型
常用:代理模式、桥接模式、装饰者模式、适配器模式
不常用:门面模式、组合模式、享元模式
- 行为型
常用:观察者模式、模板模式、策略模式、职责链模式、迭代器模式、状态模式
不常用:访问者模式、备忘录模式、命令模式、解释器模式、中介模式
- 能够解决的问题
- 应用场景
- 不过度应用
编程规范:
最能改善代码质量的 20 条规范
代码重构:
- 重构的目的(why)、对象(what)、时机(when)、方法(how)
- 保证重构不出错的技术手段:单元测试和代码的可测试性
- 两种不同规模的重构:大重构(大规模高层次)和小重构(小规模低层次)
总结:
- 面向对象中的继承、多态 → 可复用性
- 编码规范 → 可读性
- 设计原则中的单一职责、DRY、基于接口而非实现、里式替换原则等 → 可复用性、灵活性、可读性、可扩展性、可维护性
- 设计模式 → 可扩展性
- 持续重构 → 可维护性
- 面向对象编程(丰富特性:封装、抽象、继承、多态) → 复杂的设计思路 → 设计原则、设计模式的基础
- 设计原则(抽象) → 代码设计经验 → 指导设计模式
- 设计模式(具体) → 针对设计问题的解决方案
- 编程规范(更细节) → 持续的小重构的理论基础
- 重构 → 保持代码质量不下降 → 重构工具:面向对象、设计原则、设计模式、编码规范