导学篇
为什么要学设计模式
1. 程序员的看家本领!
数据结构与算法
教你写出高效
的代码,设计模式
教你写出高质量
的代码- 写代码可以说是程序员天天要干的事情,要是代码都写不好,最基本的看家本领都练不好,成天堆砌烂代码,写代码还有啥意思呢?那还干啥程序员啊!写出“能用”代码的人比比皆是,但是,并不是每个人都能写出“好用”的代码。只会写能用的代码,我们永远成长不成大牛,成长不成最优秀的那批人。
- 很多工程师写了多年代码,代码功力一点都没长进,编写的代码仍然只是能用即可,能运行就好。平日的工作就是修修补补、抄抄改改,一直在做重复劳动,能力也一直停留在“会干活”的层面,就像高速路上的收银员,只能算是一个“熟练工”。
- “为什么要有这种设计原则、思想或者模式?它能解决什么编程问题?有哪些应用场景?又该如何权衡、恰当地在项目中应用?”等等。
思考,回顾,思考,实践
- 很多程序员都已经意识到基础知识的重要性,觉得要夯实基础,才能走得更远,但同时对于如何将基础知识转化成开发“生产力”仍然有些疑惑。所以,你可能看了很多基础的书籍,比如
操作系统、组成原理、编译原理
等,但还是觉得很迷茫,觉得在开发中用不上,起码在平时的 CRUD 业务开发中用不上。实际上,这些基础的知识确实很难直接转化成开发“生产力”。但是,它能潜移默化地、间接地提高你对技术的理解。设计模式、数据结构、算法
更像是一道儿的,相比那些更加基础的学科,设计模式能更直接地提高你的开发能力
2. 为什么学习设计模式
1. 应对面试中的设计模式相关问题
- BAT-TMD
- 区分度选项
2. 告别写被人吐槽的烂代码
- Talk is cheap,show me the code
- 代码能力是一个程序员最基础的能力,是基本功,是展示一个程序员基础素养的最直接的衡量标准
- 你写的代码,实际上就是你名片
- 烂代码,比如命名不规范、类设计不合理、分层不清晰、没有模块化概念、代码结构混乱、高度耦合等等
3. 提高复杂代码的设计和开发能力
- 如何分层、分模块?
- 应该怎么划分类?
- 每个类应该具有哪些属性、方法?
- 怎么设计类之间的交互?该用继承还是组合?
- 该使用接口还是抽象类?
- 怎样做到解耦、高内聚低耦合?
- 该用单例模式还是静态方法?
- 用工厂模式创建对象还是直接 new 出来?
- 如何避免引入设计模式提高扩展性的同时带来的降低可读性问题?
4. 让读源码、学框架事半功倍
- 优秀的开源项目、框架、中间件,代码量、类的个数都会比较多,类结构、类之间的关系极其复杂,常常调用来调用去。所以,为了保证代码的扩展性、灵活性、可维护性等,代码中会使用到很多设计模式、设计原则或者设计思想。
- 如果你不懂这些设计模式、原则、思想,在看代码的时候,你可能就会琢磨不透作者的设计思路,对于一些很明显的设计思路,你可能要花费很多时间才能参悟。
- 相反,如果你对设计模式、原则、思想非常了解,一眼就能参透作者的设计思路、设计初衷,很快就可以把脑容量释放出来,重点思考其他问题,代码读起来就会变得轻松了。
5. 为你的职场发展做铺垫
3. 哪些维度评判代码质量好坏
- 可维护性
- “代码易维护”就是指,在不破坏原有代码设计、不引入新的 bug 的情况下,能够快速地修改或者添加代码
- 代码的可读性好、简洁、可扩展性好,就会使得代码易维护
- 更细化地讲,如果代码分层清晰、模块化好、高内聚低耦合、遵从基于接口而非实现编程的设计原则等等,那就可能意味着代码易维护
- 可读性
- 看代码是否符合编码规范
- 命名是否达意
- 注释是否详尽
- 函数是否长短合适
- 模块划分是否清晰
- 是否符合高内聚低耦合等等
- 可扩展性
- 代码的可扩展性表示,我们在不修改或少量修改原有代码的情况下,通过扩展的方式添加新的功能代码。说直白点就是,代码预留了一些
功能扩展点
,你可以把新功能代码,直接插到扩展点上,而不需要因为要添加一个功能而大动干戈,改动大量的原始代码。- 对修改关闭,对扩展开放
- 灵活性
- 如果一段代码易扩展、易复用或者易用,我们都可以称这段代码写得比较灵活
- 简洁性
- KISS 原则(keep it simple stupid)
- 代码简单、逻辑清晰,也就意味着易读、易维护
- 思从深而行之简,用最简单的方法解决最复杂的问题
- 可复用性
- 尽量
减少重复代码的编写
,复用已有的代码
- 面向对象特性,继承、多态存在的目的之一,就是为了提高代码的可复用性
- 设计原则中的单一职责原则也跟代码的可复用性相关
- 重构技巧,解耦、高内聚、模块化等都能提高代码的可复用性
- 可测试性
- 容易编写单元测试
4. 如何写出高质量代码
- 要写出满足多种评价标准的高质量代码,我们需要掌握一些更加细化、更加能落地的编程方法论,包括
面向对象设计思想、设计原则、设计模式、编码规范、重构技巧
等- 面向对象中的继承、多态能让我们写出可复用的代码
- 编码规范能让我们写出可读性好的代码
- 设计原则中的单一职责、DRY、基于接口而非实现、里式替换原则等,可以让我们写出可复用、灵活、可读性好、易扩展、易维护的代码
- 设计模式可以让我们写出易扩展的代码
- 持续重构可以时刻保持代码的可维护性
5. 教学大纲(面向对象、设计原则、设计模式、编程规范、重构之间的关系)
- 面向对象
- 主流的编程范式或编程风格有三类,面向过程、面向对象、函数式编程
- 7 大知识点
- ① 面向对象的四大特性:封装、抽象、继承、多态
- ② 面向对象和面向过程编程的区别和联系
- ③ 面向对象分析,面向对象设计,面向对象编程
- ④ 接口和抽象类的区别以及各自应用场景
- ⑤ 基于接口而非实现编程的设计思想
- ⑥ 多用组合少用继承的设计思想
- ⑦ 面向过程的贫血模式 和 面向对象的充血模式
- 设计原则
- 理解各类设计原则定义、掌握设计初衷、能解决哪些编程问题、有哪些应用场景
- SOLID 原则 -SRP 单一职权原则
- SOLID 原则 -OCP 开闭原则
- SOLID 原则 -LSP 里式替换原则
- SOLID 原则 -ISP 接口隔离原则
- SOLID 原则 -DIP 依赖倒置原则
- DRY 原则
- KISS 原则
- YAGNI 原则
- LOD 法则
- 设计模式
- 针对软件开发中经常遇到的一些设计问题,总结出的一套解决方案或设计思路,大部分的设计模式要解决的都是代码可拓展性问题
- 23 种经典设计模式,分为以下几类
- (1)
创建型
4 种常用:
①单例模式②工厂模式③建造者模式
不常用:④原型模式
- (2)
结构型
7 种常用:
⑤代理模式⑥桥接模式⑦装饰者模式⑧适配器模式
不常用:⑨门面模式⑩组合模式⑪享元模式
- (3)
行为型
11 种常用:
⑫观察者模式⑬模板模式⑭策略模式⑮职责链模式⑯迭代器模式⑰状态模式
不常用:⑱访问者模式⑲备忘录模式⑳命令模式㉑解释器模式㉒中介模式
㉓对象模式
- 编程规范
- 代码规范主要解决代码的可读性问题,比如如何给变量、类、函数命名、如何写代码注释等问题
- 《重构代码大全》《代码整洁之道》
- 此处总结 20 条规范
- 代码重构
- 重构的目的(why)、对象(what)、时机(when)、方法(how)
- 保证重构不出错的技术手段:单元测试和代码的可测试性
- 两种不同规范的重构:大重构(大规模高层次)、小重构(小规模低层次)
- 五者之间联系
- 面向对象编程,因为具有丰富的特性(封装、抽象、继承、多态),可以实现很多复杂的设计思路,是很多设计原则、设计模式等编码实现的
基础
。- 设计原则是指导我们代码设计的一些经验总结,对于某些场景下,是否应该应用某种设计模式,具有
指导意义
。比如,“开闭原则”是很多设计模式(策略、模板等)的指导原则- 设计模式是针对软件开发中经常遇到的一些设计问题,总结出来的一套解决方案或者设计思路。应用设计模式的主要目的是提高代码的可扩展性。从抽象程度上来讲,
设计原则比设计模式更抽象。设计模式更加具体、更加可执行
- 编程规范主要解决的是代码的可读性问题。编码规范相对于设计原则、设计模式,更加具体、更加偏重代码细节、更加能落地。持续的小重构依赖的
理论基础
主要就是编程规范- 重构作为保持代码质量不下降的有效手段,
利用
的就是面向对象、设计原则、设计模式、编码规范这些理论