今天下午在一个组的项目回顾会议上,这个同事讲了自己用DDD思想对三个模块的重构。把之前在Service层的一些业务逻辑下沉到了领域层里,由之而引起的讨论。
部门经理:“其实你的业务逻辑总体并没有少,只是把边界重新划分了一下。”
一起参与开发的同事:“在第二个模块中(任务系统,包括了任务拆分,状态跟踪等)这种思想比较有优势,在一三项目中不是很明显。”
于是引出了我的一个问题:“到底什么是面向对象,什么是面向过程,在什么情况下适合面向对象,什么场景下适用于面向过程?”
以C语言和Java语言为例: C语言没有类,但是有结构体,结构体中不能有函数,只能有属性。这说明了什么?说明了在面向过程的思考方式中,数据和操作是严格分离的。
C语言中为什么函数需要定义到调用此函数的前面,也就是说先声明后调用?如果按照流程化的思路来看这种设计方式,想要调用一个子流程,势必要在调用之前就定义好。
而在java的类中,就没有函数定义先后的问题,这与面向过程和面向对象的最小定义粒度有关,面向过程的最小定义粒度为流程(方法、操作、函数),而在面向对象中,最小定义粒度为对象,这个对象的行为没有先后,包含在对象这个大的容器中。
封装、抽象、继承、多态其实就是类比的对象进行的建模,比如以人为例,人有些属性不想示人,有些属性只能给指定的人了解,这就是封装。人掌握的知识其实是现象的一种抽象。人继承来来自父母的一些生活习惯,而又有所不同,这就是多态。
归总,子类相对父类来说有不同的模型(对真实世界的建模),这是4种面向对象的终极原因。
为什么面向对象的思考方式更有利于扩展维护?拿一个工作岗位为例,一个人在一个工作岗位上,如果有一天这个岗位有了更多的工作要求,如果改动量较小,那么对该岗位的人进行技能培训就可以了。如果要求多到一种程度,拆分成两个人,或者拆分成多个岗位。而如果用面向过程的思路,那么每次改动,都相当于多了一个流程?(这里存疑,多流程的问题在哪?难维护的理由是什么?这里我没有想明白)
面向过程要求人有更好的流程化思维方式,面向对象要求人有更好的抽象思维方式。那么如果有一天出现一个“面向文档编程”呢?要求人有更好的把问题描述清楚的表达能力。换句话说,面向过程就是面向流程思考,面向对象就是针对模型思考。
最后距离,如果我们描述入职流程,一个大牛的入职流程可能和一个应届生的入职流程完全不一样,如果把入职这个行为写到employee的方法中,那么这就是面向对象的写法,如果维护一个入职流程的方法,根据不同的人用switch
case的方式进行不同行为的跳转,那么就是面向过程。
面向过程就是面向流程思考,面向对象就是针对模型思考。
作者丨博客园:weggi
想要在程序员生涯内有更高的成就的话,最最重要的是尽可能的提升自己的编程能力,并且,与其想着怎么去提升,不如从现在开始动手动脑,如果对于C/C++感兴趣的话,可以关注+私信小编【编程交流】有一些视频希望可以帮助到你,学习不怕从零开始,就怕从不开始。