就只剩下一天了;一定要今天全部给搞完;
开篇词:数据结构与算法是教如何写出高效的解决问题的代码,而设计模式是教写出高质量的代码。
高质量:可扩展、可维护、可读。
目的:主要是学习掌握高质量代码的技巧,方法和理论。实际上,写烂代码和好代码花费时间是差不多的。当把写高质量代码培养成一种习惯之后,就会有一种代码质量意识。
书本:设计模式、编程规范、重构相关书籍。
1 设计模式导读
核心问题:如何将基础知识 转化成开发“生产力”。基础知识:考研六大件:计算机组成原理(微机原理代替)、操作系统、数据库、数据结构与算法、计算机网络、编程语言。这是内功; Talk is cheap,show me the code. 烂代码:命名不规范、类设计不合理、分成不清晰、没有哦模块化概念、代码结构混乱、高度耦合等等。
1.1.1 重点思考问题
如何分层、分模块?应该怎么样划分类?每个类应该具有哪些属性、方法?怎么设计类之间的交互?该用继承还是组合?该使用接口还是抽象类?怎么样做到解耦、高内聚低耦合?该用单例模式还是静态方法?用工厂模式创建对象还是直接new出来?如何避免引入设计模式提高扩展性的同时带来的降低可读性问题?… 面对复杂代码、功能、系统的设计和开发会发现就是似曾相识–套路的感觉。
1.1.2 让读源码、学框架事半功倍
对于看源码,经常遇到看不懂、看不下去的问题的这种情况? 问题原因很简单:基类的基本功太少,能力不足以支撑起看懂这些代码。 优秀的开源项目、框架、中间件、代码量、类的个数都会比较多,类结构、类之间的关系及其复杂,调用来调用去 如果对设计模式、原则、思想非常了解,一眼就能参透作者的设计思路、设计初衷,很快就会把脑容量释放出来,专注重点,问题解决本身。
1.1.3 重点总结
- 应对面试中的设计模式相关问题
- 告别写烂代码,其实写高质量代码花费时间一样,只不过意识问题
- 提复杂代码的设计和开发能力
- 让读源码、学框架事半功倍
- 提早为职场做铺垫
有些能力,要尽早端丽;有些东西,要尽早知道;有些书,要尽早读; 设计模式是一门与编码、开发有着直接关系的基础知识,是现在就要有意识开始学习,早点去学习,以后的项目都可以拿来锻炼内功,收益整个职业生涯。
1.2 评判代码质量的维度
怎么才算可读性好?才算可扩展?可读、可扩展与可维护之间有什么关系?
1.2.1 重点介绍
- 可维护性
代码维护:就是在不破坏原有diamante设计、不引入新的bug情况下,能够快速地修改或者调价代码。代码不易维护:就是指修改或者添加代码需要冒着极大引入新bug的风险,并且需要花费很长的时间去完成。 细化来说: 如果代码分层清晰、模块化好、高内聚低耦合、遵从基于接口协议而非实现编程的设计原则等。 - 可读性
代码被阅读的次数远远超过被编写和执行的次数。这只是一个理念问题,不是实际。 在编写代码的时候,要时时刻刻考虑到代码是否是易读、易理解。 细化:看代码是否符合编程规范、命名是否达意、注释是否详尽、函数是否长短合适、模块划分是否清晰、是否符合高内聚低耦合。 code review就是一个很好的测试代码可读性的手段–即让别人来读。 - 可扩展性
可扩展性表示代码应对未来需求变化的能力。在不修改或者少修改的基础上,通过扩展的方式添加新的功能代码。–代码预留了一些功能扩展点,可以把新功能代码,直接插到扩展点上,而不需要添加一个功能而打动干戈,带动大量的原始代码。 - 灵活性
应用场景:
- 当我们添加一个新的功能代码的时候,原有的代码已经预留好了扩展点,不需要修改原有的代码,只要在扩展点上添加新的代码即可。这时除了说代码易扩展,还可以说代码好灵活。
- 当我们实现一个功能的时候,发现原有代码中,已经抽象出了很多底层可以复用的模块、类等代码,我们可以拿来直接使用。这个时候,除了可以说代码复用之外,还可以说代码写的好灵活。
- 当我们使用某组接口的时候,如果这组接口可以应对各种使用场景,满足各种不同的需求,除了还可以说接口易用之外,还可以说接口设计得好或者代码写的好灵活。
- 简洁性
KISS原则:keep it Simple and Stupid。 - 可复用性
代码的复用性可以理解为:尽量减少代码的编写,复用已有的代码。 当讲到面向对象特性的时候,会讲到继承,多态存在的目的之一,就是为了提高代码的可复用性; 当讲到设计原则的时候,会讲到单一职责原则也跟代码的可复用性相关。 当讲到重构技巧的时候,会讲到解耦、高内聚、模块化等都能提高代码的可复用性。 - 可测试性
代码的可测试性差,比较难写单元测试,那基本上能说明代码设计得有问题。
1.2.2 实现满足原则
要想写出这些评价标准的高质量代码,需要掌握一些更加细化、更加能落地的编程方法论–包括面向对象设计思想、设计原则、设计模式、编码规范、重构技巧等。这些所有编程方法论的的最终目的是为了编写出高质量的代码。
- 面向对象中的继承、多态能让我们写出可复用的代码;
- 编程规范能让我们写出可读性好的代码;
- 设计原则中的单一职责、DRY、基于接口而非实现、里式替换原则等,可以让我们写出可复用、灵活、可读性好、易扩展、易维护的代码;
- 设计模式可以让我们写出易扩展的代码;
- 持续重构可以时刻保持代码的可维护性;
1.2.3 小结
- 最常用的评价标准有哪几个?最常用到几个评判代码质量的标准是:可维护性、可读性、可扩展性、灵活性、简洁性、可复用性、可测试性。其中,可维护性、可读性、可扩展性又是提到最多的、最重要的三个评价标准。
- 如何才能写出高质量的代码?要写出高质量代码,我们就需要掌握一些更加细化、更加能落地的编程方法论,这就包含面向对象设计思想、设计原则、设计模式、编码规范、重构技巧等等,这也是我们后面课程学习的重点。
1.3 面向对象、设计原则、设计模式、编程规范、重构
编程方法论:设计思想、设计原则、设计模式、编程规范、重构技巧。
1.3.1 面向对象
主流的编程范式或是编程风格有三种:面向过程、面向对象和函数式编程。面向对象编程风格是其中最主流的。 面向对象编程语言:具有丰富的特性(封装、抽象、继承、多态),可以实现复杂的设计思路,是很多设计原则、设计模式实现的基础。 对于这部分内容,需要掌握以下7大知识点:
- 面向对象的四大特性:封装、抽象、继承、多态
- 面向对象编程与面向过程编程的区别于联系
- 面向对象分析、面向对象设计、面向对象编程
- 接口和抽象类的区别以及各自的应用场景
- 基于接口而非实现编程的设计思想
- 多用组合少用继承的设计思想
- 面向过程的贫血模型和面向对象的充血模型
1.3.2 设计原则
设计原则是指导我们代码设计的经验总结。 对于每一种设计原则,我们需要掌握它的设计初衷,能解决哪些编程问题,有哪些应用场景。只有这样,我们才能在在项目中灵活恰当运用这些原则; SOLID 原则 -SRP 单一职责原则,一个东西就一个功能 SOLID 原则 -OCP 开闭原则 : 修改的时候,要保留原来的功能 SOLID 原则 -LSP 里式替换原则 避免子类重写父类中已经实现的方法 SOLID 原则 -ISP 接口隔离原则 :1.接口里不要有其它的功能,比如查一个订单的,你调个接口还查一遍用户,浪费数据库消耗2.不要影响到实现类,比如你突然throws异常 SOLID 原则 -DIP 依赖倒置原则 尽可能使用接口或抽象类 LOD 法则:迪米特法则 :尽可能的少暴露自己的接口,能不 public 就不 public DRY 原则:是指编程过程中不写重复代码,将能够公共的部分抽象出来 KISS 原则、YAGNI 原则、
1.3.3 设计模式
大部分设计模式要解决的都是代码的可拓展性问题。设计模式相对于设计原则来说,没有那么抽象,而且大部分都不难理解,代码实现也并不复杂。这一块的学习难点是了解他们都能解决哪些问题,掌握典型的应用场景,并且懂得不过度应用。
经典的设计模式有23种:又被分为三大类:创建型、结构型、行为型。
- 创建型:单例模式、工厂模式(工厂方法和抽象工厂)、建造者模式 不常用的有:原型模式
- 结构型:代理模式、桥接模式、装饰者模式、适配器模式 不常用的:门面模式、组合模式、享元模式
- 行为型:观察着模式、模板模式、策略模式、职责链模式、迭代器模式、状态模式
1.3.4 编程规范
编程规范主要解决的就是代码的可读性问题。编码规范相对于设计原则、设计模式,更加具体、更加偏重代码细节。即便你可能对设计原则不熟悉、对设计模式不了解,但你最起码要掌握基本的编码规范,比如,如何给变量、类、函数命名,如何写代码注释,函数不宜过长、参数不能过多等等。 经典书籍:《重构》《代码大全》《代码整洁之道》; 阿里的JAVA规范 最能改善代码质量的 20 条规范,放在重构模块里面。
1.3.5 代码重构
重构的工具就是我们前面罗列的那些面向对象设计思想、设计原则、设计模式、编码规范。实际上,设计思想、设计原则、设计模式一个最重要的应用场景就是在重构的时候。我们前面讲过,虽然使用设计模式可以提高代码的可扩展性,但过度不恰当地使用,也会增加代码的复杂度,影响代码的可读性。在开发初期,除非特别必须,我们一定不要过度设计,应用复杂的设计模式。而是当代码出现问题的时候,我们再针对问题,应用原则和模式进行重构。这样就能有效避免前期的过度设计。 对于重构这部分内容,掌握以下知识点:
- 重构的目的(Why)、对象(What)、时机(When)、方法(How)
- 保证不重构的技术手段:单元测试和代码的可测试性
- 两种不同规模的重构:大重构和小重构–按照规模程度
1.3.6 五者之间联系
- 面向对象编程因为其具有丰富的特性(封装、抽象、继承、多态),可以实现很多复杂的设计思路,是很多设计原则、设计模式等编码实现的基础。
- 设计原则是指导我们代码设计的一些经验总结,对于某些场景下,是否应该应用某种设计模式,具有指导意义。比如,“开闭原则”是很多设计模式(策略、模板等)的指导原则。
- 设计模式是针对软件开发中经常遇到的一些设计问题,总结出来的一套解决方案或者设计思路。应用设计模式的主要目的是提高代码的可扩展性。从抽象程度上来讲,设计原则比设计模式更抽象。设计模式更加具体、更加可执行。
- 编程规范主要解决的是代码的可读性问题。编码规范相对于设计原则、设计模式,更加具体、更加偏重代码细节、更加能落地。持续的小重构依赖的理论基础主要就是编程规范。
- 重构作为保持代码质量不下降的有效手段,利用的就是面向对象、设计原则、设计模式、编码规范这些理论。
这个图设计的是真棒,清晰直观 【精彩留言】 以前只知道封装、继承、多态,全然忽视了最重要的抽象,抽象是封装、继承、和多态的基础。合理的抽象源于对业务主体的合理分析和认识。合理的抽象,应该是自洽的,易于理解的。 要真正落地面向对象编程,面向对象设计是前提,没有面向对象的设计意识,写着写着就成了面条代码。 别滥用继承,继承的作用更多的时候使用多态的特性。 其他提高代码质量的方法: 阅读高质量框架代码,先模仿; 代码Review,定期总结; 技术分享,倒逼输出,看了、做了都不如说给比人听更有效果; 工具检查(如lint、leakcanary等),开发过程中避免常识性错误和隐藏问题。
原则是基础,模式是套路,规范是可读,重构是行为
【学习来源】:设计模式之美 极客时间
|