首页 > 编程语言 >面向对象、设计原则、设计模式、编程规范、重构,这五者的关系(三)

面向对象、设计原则、设计模式、编程规范、重构,这五者的关系(三)

时间:2023-04-05 11:12:44浏览次数:43  
标签:重构 设计模式 原则 代码 面向对象 设计 这五者

要写出满足这些评价标准的高质量代码,我们需要掌握一些更加细化、更加能落地的编程方法论,包括面向对象设计思想、设计原则、设计模式、编码规范、重构技巧等。
比如:

  1. 面向对象中的继承、多态能让我们写出可复用的代码;
  2. 编码规范能让我们写出可读性好的代码;
  3. 设计原则中的单一职责、DRY、基于接口而非实现、里式替换原则等,可以让我们写出可复用、灵活、可读性好、易扩展、易维护的代码;
  4. 设计模式可以让我们写出易扩展的代码;
  5. 持续重构可以时刻保持代码的可维护性等等。

面向对象

主流的编程范式或者是编程风格有三种,它们分别是面向过程、面向对象和函数式编程。面向对象这种编程风格又是这其中最主流的。大部分项目也都是基于面向对象编程风格开发的。
面向对象编程因为其具有丰富的特性(封装、抽象、继承、多态),可以实现很多复杂的设计思路,是很多设计原则、设计模式编码实现的基础。
需要掌握下面这 7 个大的知识点:
● 面向对象的四大特性:封装、抽象、继承、多态
● 面向对象编程与面向过程编程的区别和联系
● 面向对象分析、面向对象设计、面向对象编程
● 接口和抽象类的区别以及各自的应用场景
● 基于接口而非实现编程的设计思想
● 多用组合少用继承的设计思想
● 面向过程的贫血模型和面向对象的充血模型

设计原则

设计原则是指导我们代码设计的一些经验总结。
设计原则这块儿的知识有一个非常大的特点,那就是这些原则听起来都比较抽象,定义描述都比较模糊,不同的人会有不同的解读。所以,如果单纯地去记忆定义,对于编程、设计能力的提高,意义并不大。
对于每一种设计原则,我们需要掌握它的设计初衷,能解决哪些编程问题,有哪些应用场景。只有这样,我们才能在项目中灵活恰当地应用这些原则。
对于这一部分内容,你需要透彻理解并且掌握,如何应用下面这样几个常用的设计原则。
● SOLID 原则 -SRP 单一职责原则
● SOLID 原则 -OCP 开闭原则
● SOLID 原则 -LSP 里式替换原则
● SOLID 原则 -ISP 接口隔离原则
● SOLID 原则 -DIP 依赖倒置原则
● DRY 原则、KISS 原则、YAGNI 原则、LOD 法则

设计模式

设计模式是针对软件开发中经常遇到的一些设计问题,总结出来的一套解决方案或者设计思路。
大部分设计模式要解决的都是代码的可扩展性问题。设计模式相对于设计原则来说,没有那么抽象,而且大部分都不难理解,代码实现也并不复杂。这一块的学习难点是了解它们都能解决哪些问题,掌握典型的应用场景,并且懂得不过度应用。
我们会重点讲解 23 种经典的设计模式。它们又可以分为三大类:创建型、结构型、行为型。对于这 23 种设计模式的学习,我们要有侧重点,因为有些模式是比较常用的,有些模式是很少被用到的。
对于常用的设计模式,我们要花多点时间理解掌握。对于不常用的设计模式,我们只需要稍微了解即可。
1. 创建型
常用的有:单例模式、工厂模式(工厂方法和抽象工厂)、建造者模式。
不常用的有:原型模式。

2. 结构型
常用的有:代理模式、桥接模式、装饰者模式、适配器模式。
不常用的有:门面模式、组合模式、享元模式。

3. 行为型
常用的有:观察者模式、模板模式、策略模式、职责链模式、迭代器模式、状态模式。
不常用的有:访问者模式、备忘录模式、命令模式、解释器模式、中介模式。

编程规范

编码规范解决的主要是可读性问题,设计模式主要解决的是可扩展性问题。也就是注意到了这些,代码的可读性和可扩展性将大大提高。
重构分为大重构和小重构两种类型,而小重构利用的知识基本上就是编码规范
编程规范主要解决的是代码的可读性问题。编码规范相对于设计原则、设计模式,更加具体、更加偏重代码细节。即便你可能对设计原则不熟悉、对设计模式不了解,但你最起码要掌握基本的编码规范,比如,如何给变量、类、函数命名,如何写代码注释,函数不宜过长、参数不能过多等等。
对于编码规范,考虑到很多书籍已经讲得很好了(比如《重构》《代码大全》《代码整洁之道》等)。而且,每条编码规范都非常简单、非常明确,比较偏向于记忆,你只要照着来做可以。它不像设计原则,需要融入很多个人的理解和思考。
除了编码规范,我们还会介绍一些代码的坏味道,让你知道什么样的代码是不符合规范的,应该如何优化。参照编码规范,你可以写出可读性好的代码;参照代码的坏味道,你可以找出代码存在的可读性问题。

代码重构(持续重构意识)

在软件开发中,只要软件在不停地迭代,就没有一劳永逸的设计。
随着需求的变化,代码的不停堆砌,原有的设计必定会存在这样那样的问题。针对这些问题,我们就需要进行代码重构。重构是软件开发中非常重要的一个环节。持续重构是保持代码质量不下降的有效手段。
而重构的工具就是我们前面罗列的那些面向对象设计思想、设计原则、设计模式、编码规范。
实际上,设计思想、设计原则、设计模式一个最重要的应用场景就是在重构的时候
使用设计模式可以提高代码的可扩展性,但过度不恰当地使用,也会增加代码的复杂度,影响代码的可读性。
在开发初期,除非特别必须,我们一定不要过度设计,应用复杂的设计模式。而是当代码出现问题的时候,我们再针对问题,应用原则和模式进行重构。这样就能有效避免前期的过度设计
对于重构这部分内容,你需要掌握以下几个知识点:
● 重构的目的(why)、对象(what)、时机(when)、方法(how);
● 保证重构不出错的技术手段:单元测试和代码的可测试性;
● 两种不同规模的重构:大重构(大规模高层次)和小重构(小规模低层次)。
不仅仅是掌握一些重构技巧、套路,更重要的是建立持续重构意识,把重构当作开发的一部分,融入到日常的开发中。

五者之间的联系

实际上,面向对象、设计原则、设计模式、编程规范、代码重构,这五者都是保持或者提高代码质量的方法论,本质上都是服务于编写高质量代码这一件事的。
当我们追本逐源,看清这个本质之后,很多事情怎么做就清楚了,很多选择怎么选也清楚了。比如,在某个场景下,该不该用这个设计模式,那就看能不能提高代码的可扩展性;要不要重构,那就看重代码是否存在可读、可维护问题等

  • 面向对象编程因为其具有丰富的特性(封装、抽象、继承、多态),可以实现很多复杂的设计思路,是很多设计原则、设计模式等编码实现的基础。

  • 设计原则是指导我们代码设计的一些经验总结,对于某些场景下,是否应该应用某种设计模式,具有指导意义。比如,“开闭原则”是很多设计模式(策略、模板等)的指导原则。

  • 设计模式是针对软件开发中经常遇到的一些设计问题,总结出来的一套解决方案或者设计思路。应用设计模式的主要目的是提高代码的可扩展性。从抽象程度上来讲,设计原则比设计模式更抽象。设计模式更加具体、更加可执行。

  • 编程规范主要解决的是代码的可读性问题。编码规范相对于设计原则、设计模式,更加具体、更加偏重代码细节、更加能落地。持续的小重构依赖的理论基础主要就是编程规范。

  • 重构作为保持代码质量不下降的有效手段,利用的就是面向对象、设计原则、设计模式、编码规范这些理论。
    image

在软件设计方面,很多人习惯了一开始就设计数据库表结构,结果就是代码逻辑跟数据库构成了强耦合,数据库一改,代码基本上会被改个彻底。在这种情况下,我们用的java面向对象的语言,结果却写的是面向过程的代码,这种代码基本没有可维护,可扩展,更没有可测试性一说。所以,面向对象的这个词语,被太多的人只是挂在嘴边上了,落实到代码里边,就成了面向过程。
1: 要真正落地面向对象编程,面向对象设计是前提,没有面向对象的设计意识,写着写着就成了面条代码。
2:以前只知道封装、继承、多态,全然忽视了最重要的抽象,抽象是封装、继承、和多态的基础。合理的抽象源于对业务主体的合理分析和认识。合理的抽象,应该是自洽的,易于理解的。
3:关于组合和聚合的关系,最核心的区别就是生命周期的区别,组合关系中,整体和部分是一个整体,离开了整体,部分没有意义,同时产生,同时销毁,而聚合关系中,部分单独存在也可以是有意义的。
4:别滥用继承,继承的作用更多的时候使用多态的特性。
关于UML : 在工作的过程中,试着画过UML图,UML图有着自己一条完整的语言和生态,学习成本还是相当高的,问题在于,即使用了标准的UML 图,如果沟通过程中,对方不懂,也依然效果不大,所以我对UML的感觉就是: 能看懂,会画基本的即可,没必要太追求标准化,虽然如此,但是UML 还是很重要的,它的意义是提供一种面向对象设计的表达方式,是学习面向对象设计中不可缺少的一部分(个人理解)。

无论是设计模式还是编程规范等,很多都是结合面相对象的四大特性:封装,继承,多态,抽象。设计模式本身就要结合编程语言特点,才能发挥更大的效果。

标签:重构,设计模式,原则,代码,面向对象,设计,这五者
From: https://www.cnblogs.com/jimmyhu/p/17288975.html

相关文章

  • java23设计模式创建者模式
    packagecom.bjsxt.builder;/***尚学堂牌宇宙飞船*@author尚学堂高淇www.sxt.cn**/publicclassAirShip{privateOrbitalModuleorbitalModule;//轨道舱privateEngineengine;//发动机privateEscapeTowerescapeTower;//逃逸塔......
  • 设计模式(三十一)----综合应用-自定义Spring框架-自定义Spring IOC-定义解析器、IOC容
    3定义解析器相关类3.1BeanDefinitionReader接口BeanDefinitionReader是用来解析配置文件并在注册表中注册bean的信息。定义了两个规范:获取注册表的功能,让外界可以通过该对象获取注册表对象。加载配置文件,并注册bean数据。/***@versionv1.0*@ClassName:BeanDe......
  • 《大话设计模式》程杰
    我时常拿程序员的成长与足球运动员的成长做对比。GoF的《设计模式》好比是世界顶级足球射门集锦,《重构》、《敏捷软件开发》、《设计模式解析》好比是一场场最精彩的足球比赛。我为之疯狂,为之着迷。可是我并不只是想做一个球迷(软件使用者),而是更希望自己能成为一个足球运动员(软......
  • 重学Java设计模式-结构型模式-代理模式
    重学Java设计模式-结构型模式-代理模式内容摘自:https://bugstack.cn/md/develop/design-pattern/2020-06-16-重学Java设计模式《实战代理模式》.html#重学-java-设计模式-实战代理模式「模拟mybatis-spring中定义dao接口-使用代理类方式操作数据库原理实现场景」代理模式介绍......
  • [2]Python面向对象-【1】类
    什么是类类是Python面向对象编程的基本概念之一,它是一种抽象数据类型,用于封装数据和行为。可以把类看作是一种蓝图或者模板,用于创建对象。类的命名规范类名应该采用驼峰式命名法(CamelCase),即每个单词的首字母都要大写,不使用下划线连接单词。例如,类名可以是MyClass或者MyAwesomeCl......
  • java面向对象编程-对象的创建分析
    对象的创建分析类与对象的关系类是一种抽象的数据类型,他是对某一类事物整体描述/定义,但是并不能代表某一个具体的事物动物,植物,手机,电脑Person类,Pet类等,这些类都是用来描述/定义某一类具体的事物应该具备的特点和行为对象是抽象概念的具体事例张三就是人的一个具......
  • java面向对象编程
    面向对象编程java的核心思想就是OOP面向过程&面向对象面向过程:步骤清晰简单,第一步做什么,第二步做什么···适合处理较为简单的问题面向对象:物理类聚,分类的思维模式,思考问题首先解决问题需要哪些分类,然后对这些分类进行单独思考,最后对某个分类下的细节进行面向过......
  • java面向对象编程-方法回顾
    方法回顾和加深方法的定义修饰符返回类型方法名:注意规范,见名知意参数列表:参数类型参数名异常抛出:后面讲解  方法的调用静态方法非静态方法形参和实参值传递和引用传递this关键字    ......
  • 面向对象
    一、面向对象基本概念1、面向对象编程:oop2、面向过程:根据需求将某些独立功能封装为一个又一个函数,最后完成的代码,就是顺序地调用不同函数3、面向对象:相比较函数,面向对象就是更大的封装,根据职责在一个对象中封装多个方法,根据职责确定不同对象,在对象内部封装不同方法......
  • python面向对象进阶
    面向对象进阶类型判断issubclasstypeisinstance反射反射的四个函数importlib类的其他成员__str____repr____format____del____dict__和__slots____item__系列__init____new____call____doc____iter__和__next____ente......