设计模式之美一-导学篇

60次阅读

共计 3136 个字符,预计需要花费 8 分钟才能阅读完成。

导学篇

为什么要学设计模式

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. 教学大纲(面向对象、设计原则、设计模式、编程规范、重构之间的关系)

    1. 面向对象
  • 主流的编程范式或编程风格有三类,面向过程、面向对象、函数式编程
  • 7 大知识点
  • ① 面向对象的四大特性:封装、抽象、继承、多态
  • ② 面向对象和面向过程编程的区别和联系
  • ③ 面向对象分析,面向对象设计,面向对象编程
  • ④ 接口和抽象类的区别以及各自应用场景
  • ⑤ 基于接口而非实现编程的设计思想
  • ⑥ 多用组合少用继承的设计思想
  • ⑦ 面向过程的贫血模式 和 面向对象的充血模式
    1. 设计原则
  • 理解各类设计原则定义、掌握设计初衷、能解决哪些编程问题、有哪些应用场景
  • SOLID 原则 -SRP 单一职权原则
  • SOLID 原则 -OCP 开闭原则
  • SOLID 原则 -LSP 里式替换原则
  • SOLID 原则 -ISP 接口隔离原则
  • SOLID 原则 -DIP 依赖倒置原则
  • DRY 原则
  • KISS 原则
  • YAGNI 原则
  • LOD 法则
    1. 设计模式
  • 针对软件开发中经常遇到的一些设计问题,总结出的一套解决方案或设计思路,大部分的设计模式要解决的都是代码可拓展性问题
  • 23 种经典设计模式,分为以下几类
  • (1)创建型 4 种

常用:①单例模式②工厂模式③建造者模式
不常用:④原型模式

  • (2)结构型 7 种

常用:⑤代理模式⑥桥接模式⑦装饰者模式⑧适配器模式
不常用:⑨门面模式⑩组合模式⑪享元模式

  • (3)行为型 11 种

常用:⑫观察者模式⑬模板模式⑭策略模式⑮职责链模式⑯迭代器模式⑰状态模式
不常用:⑱访问者模式⑲备忘录模式⑳命令模式㉑解释器模式㉒中介模式

㉓对象模式

    1. 编程规范
  • 代码规范主要解决代码的可读性问题,比如如何给变量、类、函数命名、如何写代码注释等问题
  • 《重构代码大全》《代码整洁之道》
  • 此处总结 20 条规范
    1. 代码重构
  • 重构的目的(why)、对象(what)、时机(when)、方法(how)
  • 保证重构不出错的技术手段:单元测试和代码的可测试性
  • 两种不同规范的重构:大重构(大规模高层次)、小重构(小规模低层次)
    1. 五者之间联系
  • 面向对象编程,因为具有丰富的特性(封装、抽象、继承、多态),可以实现很多复杂的设计思路,是很多设计原则、设计模式等编码实现的 基础
  • 设计原则是指导我们代码设计的一些经验总结,对于某些场景下,是否应该应用某种设计模式,具有 指导意义。比如,“开闭原则”是很多设计模式(策略、模板等)的指导原则
  • 设计模式是针对软件开发中经常遇到的一些设计问题,总结出来的一套解决方案或者设计思路。应用设计模式的主要目的是提高代码的可扩展性。从抽象程度上来讲,设计原则比设计模式更抽象。设计模式更加具体、更加可执行
  • 编程规范主要解决的是代码的可读性问题。编码规范相对于设计原则、设计模式,更加具体、更加偏重代码细节、更加能落地。持续的小重构依赖的 理论基础 主要就是编程规范
  • 重构作为保持代码质量不下降的有效手段,利用 的就是面向对象、设计原则、设计模式、编码规范这些理论
正文完
 0