https://time.geekbang.org/column/article/161587
07 | 理论四:哪些代码设计看似是面向对象,实际是面向过程的?-极客时间
-
什么是面向过程编程?什么是面向过程编程语言?
实际上,面向过程编程和面向过程编程语言并没有严格的官方定义。
理解这两个概念最好的方式是跟面向对象编程和面向对象编程语言进行对比。
相较于面向对象编程以类为组织代码的基本单元,面向过程编程则是以过程(或方法)作为组织代码的基本单元。它最主要的特点就是数据和方法相分离。
相较于面向对象编程语言,面向过程编程语言最大的特点就是不支持丰富的面向对象编程特性,比如继承、多态、封装。
-
面向对象编程相比面向过程编程有哪些优势?
- 对于大规模复杂程序的开发,程序的处理流程并非单一的一条主线,而是错综复杂的网状结构。面向对象编程比起面向过程编程,更能应对这种复杂类型的程序开发。
- 面向对象编程相比面向过程编程,具有更加丰富的特性(封装、抽象、继承、多态)。利用这些特性编写出来的代码,更加易扩展、易复用、易维护。
- 从编程语言跟机器打交道的方式的演进规律中,我们可以总结出:面向对象编程语言比起面向过程编程语言,更加人性化、更加高级、更加智能。
-
切忌滥用 getter、setter 方法
在设计实现类的时候,除非真的需要,否则尽量不要给属性定义 setter 方法。
除此之外,尽管 getter 方法相对 setter 方法要安全些,但是如果返回的是集合容器,那也要防范集合内部数据被修改的风险。
-
Constants 类、Utils 类的设计问题
对于这两种类的设计,我们尽量能做到职责单一,定义一些细化的小类,比如 RedisConstants、FileUtils,而不是定义一个大而全的 Constants 类、Utils 类。
除此之外,如果能将Constants 类、Utils 类中的属性和方法,划分归并到其他业务类中,那是最好不过的了,能极大地提高类的内聚性和代码的可复用性。
-
基于贫血模型的开发模式
我们在进行面向对象编程的时候,很容易不由自主地就写出面向过程风格的代码,或者说感觉面向过程风格的代码更容易写。这是为什么呢?
在生活中,你去完成一个任务,你一般都会思考,应该先做什么、后做什么,如何一步一步地顺序执行一系列操作,最后完成整个任务。
面向过程编程风格恰恰符合人的这种流程化思维方式。
而面向对象编程风格正好相反。它是一种自底向上的思考方式。它不是先去按照执行流程来分解任务,而是将任务翻译成一个一个的小的模块(也就是类),设计类之间的交互,最后按照流程将类组装起来,完成整个任务。
这样的思考路径比较适合复杂程序的开发,但并不是特别符合人类的思考习惯。
思考:
” 贫血模型 “的开发模式为什么会流行?
贫血模型(Anemic Domain Model 由 MatinFowler 提出)又称为失血模型,是指 domain object 仅有属性的 getter/setter 方法的纯数据类,将所有类的行为放到 service 层。
1、实现简单。Object 仅仅作为传递数据的媒介,不用考虑过多的设计方面,将核心业务逻辑放到 service 层,用 Hibernate 之类的框架一套,完美解决任务。
2、上手快。使用贫血模式开发的 web 项目,新来的程序员看看代码就能 “照猫画虎” 干活了,不需要多高的技术水平。所以很多程序员干了几年,仅仅就会写 CURD。
3、一些技术鼓励使用贫血模型。例如 J2EE Entity Beans,Hibernate 等。
总结:各种模型的好坏讨论一直不断,企业需要的是使用合适的技术把任务完成,从这个角度来说当下管用模型就是好模型。当然我们也要持开放的心态接受新的技术和思想,并结合业务的实际需要选择合适的技术。