哪些代码设计看似是面向对象,实际是面向过程的?

107 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情 常见的编程范式或者说编程风格有三种,面向过程编程、面向对象编程、函数式编程,而面向对象编程又是这其中最主流的编程范式

有时候,从表面上看似是面向对象编程风格的代码,从本质上看却是面向过程编程风格的。

如何辨别

滥用 getter、setter 方法

实际上,这样的做法是非常不推荐的。它违反了面向对象编程的封装特性,相当于将面向对象编程风格退化成了面向过程编程风格

而面向对象封装的定义是:通过访问权限控制,隐藏内部数据,外部仅能通过类提供的有限的接口访问、修改内部数据。所以,暴露不应该暴露的 setter 方法,明显违反了面向对象的封装特性。数据没有访问权限控制,任何代码都可以随意修改它,代码就退化成了面向过程编程风格的了。

所以:

在设计实现类的时候,除非真的需要,否则,尽量不要给属性定义 setter 方法。除此之外,尽管 getter 方法相对 setter 方法要安全些,但是如果返回的是集合容器(比如例子中的 List 容器),也要防范集合内部数据被修改的危险。

滥用全局变量和全局方法

全局变量最常见的就是Constans类,里面存放了各式各样的常量。有以下这几个缺点:

1.不易理解和维护(这个类会越来越大,增加提交代码的冲突率,查找修改某个常量更加费时)

2.编译耗时(常量类每次改动所以依赖常量类的其他地方都需要重新编译)

3.影响代码复用性:如果新项目需要使用到某个类,而某个类中依赖Contans类,就需要吧整个Contsnas类都导入进来,哪怕只是用一小部分

我们为什么需要 Utils 类?Utils 类存在的意义是什么?

不需要数据共享的时候实现代码复用

实际上,只包含静态方法不包含任何属性的 Utils 类,是彻彻底底的面向过程的编程风格。静态方法将方法与数据分离,破坏了封装特性,是典型的面向过程风格。

解决方法:

在定义 Utils 类之前,你要问一下自己,你真的需要单独定义这样一个 Utils 类吗?是否可以把 Utils 类中的某些方法定义到其他类中呢?如果在回答完这些问题之后,你还是觉得确实有必要去定义这样一个 Utils 类,那就大胆地去定义它吧

即便在面向对象编程中,我们也并不是完全排斥面向过程风格的代码。只要它能为我们写出好的代码贡献力量,我们就可以适度地去使用。但是不要定义一个大而全的Utils按功能拆分