前言:我们常见到的编程范式或者编程风格有三种,面向过程、面向对象、函数式,其中面向对象是主流的编程范式。在从事使用面向对象语言开发过程中,你写的代码到底是不是面向对象的呢?下面我们具体聊聊。
哪些代码设计看似是面向对象设计,实际是面向过程的?
1.滥用getter、setter方法
在之前的项目开发过程中,小编经常看到,有同事定义完类属性之后,就顺手把这些属性的getter、setter方法都定义上。还有些同事更加省事,直接食用ide或loombok(java)自动生成 各属性的getter、setter方法。实际上这种做法是非常不推荐的。它违反了面向对象的封装特性,实际上是将面形对象退化成面向过程了。在设计实现类的时候,除非我们真的需要,否则,尽量不要给这些属性定义setter方法。除此之外尽管getter相对于setter安全些,但是如何是返回的类似集合类引用对象,也要防范数据被秀给的风险。
2.滥用全局变量和全局方法
在面向对象编程中,常见的全局变量有单例类、静态成员变量、常量等,常见的全局方法有静态方法。单例类对象在全局代码中只有一份,所以,它相当于一个全局变量。静态成员变量归属于类上的数据,被所有实例化的对象所共享,也相当于一定程度上的全局变量。而常量更是一种非常常见的全局变量。静态方法一般用来操作静态变量或者外部数据。你可以联想下我们常用的各种utils类,里面的方法一般都会定义成静态方法,可以在不用创建对象的情况下,直接拿来使用。静态方法将方法与数据分离,破坏了封装特性,是典型的面向过程风格。
3.定义数据和方法分离的类
我们再来看一看面向对象编程中,常见的面向过程的风格。那就是,数据定义在一个类中,方法定义在另一个类中。你可能觉着,这么明显的面向过程的代码谁会这么写呢?实际上,如果你是基于MVC三层结构做web层面的后端开发,这样的代码你可能天天都在写。
传统的MVC结构分为model层、controller层、view视图层。不过在前后端分离之后,三层结构在后端开发中,会稍微有些调整,被分为controller层、service层、repository层。controller层负责暴露接口,service层负责核心业务逻辑,repository层负责数据读写。而每一层中都会定义VO、BO、Entity。一般来说VO、BO、Entity中只会定义数据,不会定义方法,所有操作数据的逻辑都在对应controller类、service类、repository类中。这就是典型的面向过程的编程风格。
实际上,这种开发模式叫做基于贫血模型的开发模式,也是我们比较常用的一种开发模式。至于为什么会这样,我们会面会聊。



