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