知识卡片
从面向过程到面向对象:模型演进背后的认知转变
内容
模型不是一次性出现的,它的演进(面向过程→面向对象→面向领域)本身折射出系统认知方式的变化。面向过程时代(约1970年代)的分析模型(如SASD方法用的DFD数据流图)核心节点是”过程”,这与计算机本身的运行方式高度同构——CPU按预设顺序逐条执行指令,每个过程都有输入数据和输出数据,本质上是一条流水线;面向过程分析就是直接把现实世界的系统转换成计算机能理解的过程式模型,也就是”从计算机的视角看待现实世界”,这样做虽然便于处理系统内部的流程和数据结构问题,但也带来了代码难维护、扩展性差、耦合度高这些问题,引发了第二次软件危机。面向对象时代的核心节点变成了”对象”(用例图里是用户和系统,类图里是实体对象),模型类型也从行为模型(DFD描述的是动态的数据流/过程流)转向了功能模型(用例图更偏静态,只是对象内部的行为是动态的)——这个转变带来两个关键差异:一是服务对象不同,面向过程的行为模型服务于计算机系统,面向对象的功能模型服务于用户的需求和期望;二是应对需求变化的灵活性不同,面向过程下需求一变、数据流和过程流都要跟着调整,面向对象下只需要通过多态实现不同的行为方法就能满足新需求,不影响已有组件。更深一层看,这个转变体现了两个思维层面的跃迁:一是”整体思维”的运用——面向对象在”对象”这个整体层面定义问题(变量和函数只是个体层面),用对象把内部的”动”封装起来、对外只暴露整体的”静”,从而解决了复用性和可扩展性问题;二是”主客体思维”的转换——过程是计算机思维方式的主体,对象才是人类思维方式的主体,面向对象围绕人的价值去思考问题,这也是它能大大激发软件需求、促进行业繁荣的原因。DDD在面向对象基础上又新增了战略设计阶段,根源在于系统复杂度进一步提升——面向对象诞生于系统主要服务单一部门/业务领域的年代,而21世纪跨部门、跨领域、跨组织的系统不断涌现,传统面向对象的分析模式已经无法单独解决这类复杂系统带来的问题,因此才需要DDD的战略设计(划分领域、子领域)来补上这一环。
结构图:
flowchart LR
A["面向过程<br/>核心节点=过程<br/>模型=DFD(行为模型)"]
A -->|服务对象:计算机<br/>需求变化成本高| B["面向对象<br/>核心节点=对象<br/>模型=用例图/类图(功能模型)"]
B -->|服务对象:用户<br/>多态吸收变化| C["整体思维+主客体思维转换<br/>(围绕人的价值思考)"]
C -->|系统复杂度进一步提升<br/>跨部门/跨领域/跨组织| D["DDD新增战略设计阶段<br/>(划分领域/子领域)"]