OO:Object-Oriented,面向对象,基于对象概念,以对象为中心,以类和继承为构造机制,来认识理解,刻画客观世界和设计;
OOA:Object-oriented Analysis 面向对象分析,进一步对OO进行细化,初步得到OO的方法;
OOD:Object-Oriented Design,面向对象设计,OO方法中一个中间过渡环节,对OOA分析的结果进行进一步规范和整理,以便能被OOP接受,,整理和定义OO的属性和方法
OOP:Object-Oriented Programming,把组件的实现和接口分开,并且让组件具有多态性,面向接口编程;
DDD:Domain-Driven Design 领域驱动设计,面向对象分析,对事物的抽象能力
OOA/OOD/OOP中,尤其是OOD/OOP,大家都不陌生,用了很多年。并且大部分人,都是从OOP开始,到了一定阶段,会再去接触OOD, 之后是OOA。
这样用久了,自然而然会觉得“面向对象”是天经地义的,不太会去想面向对象有什么问题所在。
而DDD里面,就很明确的指出了面向对象的2个问题,并给出了相应的解决答案。
问题1:面向对象擅长表达“结构”,不擅长表达“行为”
在面向对象里面,我们把系统里面所有东西都表达成对象 + 对象之间的关系,这样清晰的表达出了系统的“结构”。
但是对于“行为”,也acazacyzz’-xx,就是“流程”,通常被掩盖了。比如一个业务流程,它牵扯到好几个对象,那这个流程,反映在代码里面,就是对象与对象之间的引用和互相调用关系,这实际是一种“隐性表达”。虽然你可以画“交互图”,但这种交互图只能停留在设计层面,在代码层面,没有对应物。
所以DDD里面引入了“领域服务”,单独把重要的“行为”抽出来进行“显性”表达。
问题2:面向对象不擅长表达“业务规则”
业务规则,说到底也是种“行为”,而在代码里面,我们通常把业务规则表达成了对象的某个方法。
随着业务规则的复杂,这个方法也变得越来越难理解。所以设计模式里面有Strategy模式,对这种场景进行建模。
但设计模式主要偏重从技术角度去谈这个问题,DDD呢,把这个特意强调了出来。强调在业务分析的时候,就把“业务规则显性化”,为此引入了Specification模式。
总结
所以说,DDD其实是面向对象方法论的一个升华,强调的是需要更多的跨界思维,并从业务的应用流程出发建立统一的领域模型,软件开发过程中,必须以建立领域模型为中心,以保障领域模型的忠实体现。