要写出满足这些评价标准的高质量代码,我们需要掌握一些更加细化、更加能落地的编程方法论,包括面向对象设计思想、设计原则、设计模式、编码规范、重构技巧等。
比如:
- 面向对象中的继承、多态能让我们写出可复用的代码;
- 编码规范能让我们写出可读性好的代码;
- 设计原则中的单一职责、DRY、基于接口而非实现、里式替换原则等,可以让我们写出可复用、灵活、可读性好、易扩展、易维护的代码;
- 设计模式可以让我们写出易扩展的代码;
- 持续重构可以时刻保持代码的可维护性等等。
面向对象
主流的编程范式或者是编程风格有三种,它们分别是面向过程、面向对象和函数式编程。面向对象这种编程风格又是这其中最主流的。大部分项目也都是基于面向对象编程风格开发的。
面向对象编程因为其具有丰富的特性(封装、抽象、继承、多态),可以实现很多复杂的设计思路,是很多设计原则、设计模式编码实现的基础。
需要掌握下面这 7 个大的知识点:
● 面向对象的四大特性:封装、抽象、继承、多态
● 面向对象编程与面向过程编程的区别和联系
● 面向对象分析、面向对象设计、面向对象编程
● 接口和抽象类的区别以及各自的应用场景
● 基于接口而非实现编程的设计思想
● 多用组合少用继承的设计思想
● 面向过程的贫血模型和面向对象的充血模型
设计原则
设计原则是指导我们代码设计的一些经验总结。
设计原则这块儿的知识有一个非常大的特点,那就是这些原则听起来都比较抽象,定义描述都比较模糊,不同的人会有不同的解读。所以,如果单纯地去记忆定义,对于编程、设计能力的提高,意义并不大。
对于每一种设计原则,我们需要掌握它的设计初衷,能解决哪些编程问题,有哪些应用场景。只有这样,我们才能在项目中灵活恰当地应用这些原则。
对于这一部分内容,你需要透彻理解并且掌握
,如何应用下面这样几个常用的设计原则。
● SOLID 原则 -SRP 单一职责原则
● SOLID 原则 -OCP 开闭原则
● SOLID 原则 -LSP 里式替换原则
● SOLID 原则 -ISP 接口隔离原则
● SOLID 原则 -DIP 依赖倒置原则
● DRY 原则、KISS 原则、YAGNI 原则、LOD 法则
设计模式
设计模式是针对软件开发中经常遇到的一些设计问题,总结出来的一套解决方案或者设计思路。
大部分设计模式要解决的都是代码的可扩展性问题
。设计模式相对于设计原则来说,没有那么抽象,而且大部分都不难理解,代码实现也并不复杂。这一块的学习难点是了解它们都能解决哪些问题,掌握典型的应用场景,并且懂得不过度应用。
我们会重点讲解 23 种经典的设计模式。它们又可以分为三大类:创建型、结构型、行为型。对于这 23 种设计模式的学习,我们要有侧重点,因为有些模式是比较常用的,有些模式是很少被用到的。
对于常用的设计模式,我们要花多点时间理解掌握。对于不常用的设计模式,我们只需要稍微了解即可。
1. 创建型
常用的有:单例模式、工厂模式(工厂方法和抽象工厂)、建造者模式。
不常用的有:原型模式。
2. 结构型
常用的有:代理模式、桥接模式、装饰者模式、适配器模式。
不常用的有:门面模式、组合模式、享元模式。
3. 行为型
常用的有:观察者模式、模板模式、策略模式、职责链模式、迭代器模式、状态模式。
不常用的有:访问者模式、备忘录模式、命令模式、解释器模式、中介模式。
编程规范
编码规范解决的主要是可读性问题,设计模式主要解决的是可扩展性问题
。也就是注意到了这些,代码的可读性和可扩展性将大大提高。
重构分为大重构和小重构两种类型,而小重构利用的知识基本上就是编码规范。
编程规范主要解决的是代码的可读性问题。编码规范相对于设计原则、设计模式,更加具体、更加偏重代码细节。即便你可能对设计原则不熟悉、对设计模式不了解,但你最起码要掌握基本的编码规范,比如,如何给变量、类、函数命名,如何写代码注释,函数不宜过长、参数不能过多等等。
对于编码规范,考虑到很多书籍已经讲得很好了(比如《重构》《代码大全》《代码整洁之道》等)。而且,每条编码规范都非常简单、非常明确,比较偏向于记忆,你只要照着来做可以。它不像设计原则,需要融入很多个人的理解和思考。
除了编码规范,我们还会介绍一些代码的坏味道,让你知道什么样的代码是不符合规范的,应该如何优化。参照编码规范,你可以写出可读性好的代码;参照代码的坏味道,你可以找出代码存在的可读性问题。
代码重构(持续重构意识)
在软件开发中,只要软件在不停地迭代,就没有一劳永逸的设计。
随着需求的变化,代码的不停堆砌,原有的设计必定会存在这样那样的问题。针对这些问题,我们就需要进行代码重构。重构是软件开发中非常重要的一个环节。持续重构
是保持代码质量不下降的有效手段。
而重构的工具就是我们前面罗列的那些面向对象设计思想、设计原则、设计模式、编码规范。
实际上,设计思想、设计原则、设计模式一个最重要的应用场景就是在重构的时候
。
使用设计模式可以提高代码的可扩展性,但过度不恰当地使用,也会增加代码的复杂度,影响代码的可读性。
在开发初期,除非特别必须,我们一定不要过度设计,应用复杂的设计模式。而是当代码出现问题的时候,我们再针对问题,应用原则和模式进行重构。这样就能有效避免前期的过度设计
。
对于重构这部分内容,你需要掌握以下几个知识点:
● 重构的目的(why)、对象(what)、时机(when)、方法(how);
● 保证重构不出错的技术手段:单元测试和代码的可测试性;
● 两种不同规模的重构:大重构(大规模高层次)和小重构(小规模低层次)。
不仅仅是掌握一些重构技巧、套路,更重要的是建立持续重构意识,把重构当作开发的一部分,融入到日常的开发中。
五者之间的联系
实际上,面向对象、设计原则、设计模式、编程规范、代码重构,这五者都是保持或者提高代码质量的方法论,本质上都是服务于编写高质量代码
这一件事的。
当我们追本逐源,看清这个本质之后,很多事情怎么做就清楚了,很多选择怎么选也清楚了。比如,在某个场景下,该不该用这个设计模式,那就看能不能提高代码的可扩展性;要不要重构,那就看重代码是否存在可读、可维护问题等
。
-
面向对象编程因为其具有丰富的特性(封装、抽象、继承、多态),可以实现很多复杂的设计思路,是很多设计原则、设计模式等编码实现的基础。
-
设计原则是指导我们代码设计的一些经验总结
,对于某些场景下,是否应该应用某种设计模式,具有指导意义。比如,“开闭原则”是很多设计模式(策略、模板等)的指导原则。 -
设计模式是针对软件开发中经常遇到的一些设计问题,总结出来的
一套解决方案或者设计思路
。应用设计模式的主要目的是提高代码的可扩展性。从抽象程度上来讲,设计原则比设计模式更抽象。设计模式更加具体、更加可执行。 -
编程规范主要解决的是代码的可读性问题。编码规范相对于设计原则、设计模式,更加具体、更加偏重代码细节、更加能落地。持续的小重构依赖的理论基础主要就是编程规范。
-
重构作为保持代码质量不下降的有效手段,利用的就是面向对象、设计原则、设计模式、编码规范这些理论。
在软件设计方面,很多人习惯了一开始就设计数据库表结构,结果就是代码逻辑跟数据库构成了强耦合,数据库一改,代码基本上会被改个彻底。在这种情况下,我们用的java面向对象的语言,结果却写的是面向过程的代码,这种代码基本没有可维护,可扩展,更没有可测试性一说。所以,面向对象的这个词语,被太多的人只是挂在嘴边上了,落实到代码里边,就成了面向过程。
1: 要真正落地面向对象编程,面向对象设计是前提,没有面向对象的设计意识,写着写着就成了面条代码。
2:以前只知道封装、继承、多态,全然忽视了最重要的抽象,抽象是封装、继承、和多态的基础。合理的抽象源于对业务主体的合理分析和认识。合理的抽象,应该是自洽的,易于理解的。
3:关于组合和聚合的关系,最核心的区别就是生命周期的区别,组合关系中,整体和部分是一个整体,离开了整体,部分没有意义,同时产生,同时销毁,而聚合关系中,部分单独存在也可以是有意义的。
4:别滥用继承,继承的作用更多的时候使用多态的特性。
关于UML : 在工作的过程中,试着画过UML图,UML图有着自己一条完整的语言和生态,学习成本还是相当高的,问题在于,即使用了标准的UML 图,如果沟通过程中,对方不懂,也依然效果不大,所以我对UML的感觉就是: 能看懂,会画基本的即可,没必要太追求标准化,虽然如此,但是UML 还是很重要的,它的意义是提供一种面向对象设计的表达方式,是学习面向对象设计中不可缺少的一部分(个人理解)。
无论是设计模式还是编程规范等,很多都是结合面相对象的四大特性:封装,继承,多态,抽象。设计模式本身就要结合编程语言特点,才能发挥更大的效果。
标签:重构,设计模式,原则,代码,面向对象,设计,这五者 From: https://www.cnblogs.com/jimmyhu/p/17288975.html