设计模式(二):面向对象与面向过程的区别与联系

面向对象与面向过程

在前面我们讲述了面向对象的概念,在这里我们再分析一些另一种编程范式:面向过程。

面向过程和面向过程语言

针对面向对象的概念解释,这里,我们用相同的方式来对面向过程进行解释:

  • 面向过程是一种编程范式,其重点是将函数作为代码组织的基本单元,其将数据和方法相分离,通过函数的顺序执行来完成任务;
  • 面向过程语言对应的就是不支持类和对象的定义,也不支持面向对象的一些特性,如封装、多态等。

优劣

从上面的定义看出,面向过程的优劣势如下所示:

  • 在流程比较复杂的时候,面向过程会变得吃力,因为流程复杂,因此可能会创建出许多函数和组织结构,但因为没有类和对象的概念,只能程序员手动组织代码来进行维护,因此会无处下手,很繁琐;
  • 面向对象风格的代码更易复用、易拓展、易维护:
    • 易复用:通过继承的方式来复用代码;
    • 易拓展:通过多态可以直接用父类指针来调用新的子类实现逻辑,而不需要再进行更改,通过抽象,我们不需要知道方法的具体实现,这样实现改变了,也不用改代码;
    • 易维护:通过封装,因为外部可修改的渠道被限制,因此方便维护。
  • 面向过程关注的是设计一组流程来让机器来执行,会更加的死板;而面向对象关注的是对现实世界的建模,对真实业务的抽象;
  • 但是简单的实现逻辑,直接使用面向过程也可以,因为其更符合人完成一件事的思维习惯。

开发坏习惯

现在主流的编程语言基本都是面向对象的,可能我们也认为自己平常写的代码肯定都是符合面向对象的定义的。
因此,现在就让我们来看一下,平常我们的哪些坏习惯,让我们不经意间写出了面向过程的代码吧。

滥用getter、setter

在设计类的时候,不管三七二十一,直接为所有的属性设置 getter/setter 方法。

这样的设计方式,首先破坏了封装的特性,会导致所有外部方可以直接修改类中的属性字段。

通过返回 getter 方法,如果返回的是一个对象,那么即使类没有提供 setter 方法,也可以直接进行更改,大家想一下,这种情况,该如何避免呢?

滥用全局变量和全局方法

在编程过程中,可能会用到一些常量类和工具类,在编程中,就会将所有的常量全部放到一个类中,或将工具类的方法全部设计静态的。

针对常量类来说,不推荐将所有的常量全部放到一个类中,首先这样的代码不易维护,太乱,其次,如果只需要里面的一两个常量而已,也会增加整体项目的编译时间。

因此针对常量来说,一种方式是将相关的常量分门别类的放到不同的类中,或者如果就只有一个类需要该常量的话,就不要再设计一个第三方类了,直接放到对应类需要用的地方,

再说工具类,其实工具类的设计是纯面向过程的,因为里面全都是 static 方法,也即以函数作为组织代码的基本单元,但该设计是十分有必要且合理的,因为有一些方法其的确在项目中,不属于任何一个类,但是又有很多类需要用到。因此在实际编写中,工具类就尽量采用分门别类的方式,这样会更加荣易维护一些。

定义数据和方法分离的类

该说法第一次听过可能会有点懵,什么叫数据和方法分离的类。其实我们大家看一下现在自己写的类就懂了。

我们写的代码里面是不是有很多 VO、DTO 等实体类,这些实体类里面全都是一些属性定义,而不包括方法的定义,相关的方式大多数都放在了 Service 层中以函数为形式组织在了一起。

其实,我们现在用的这种 MVC 的开发模式就是典型的面向过程开发风格,其是基于贫血模型的开发模式,不符合面向对象的定义。

相对应,就是基于充血模型的 DDD 开发模式,其设计的类是包含属性和方法的,以类作为领域中的基本的实体,从而达到高内聚的作用。

公众号截图

文章在公众号「iceWang」第一手更新,有兴趣的朋友可以关注公众号,第一时间看到笔者分享的各项知识点,谢谢!笔芯!