DDD是领域驱动设计,是Eric Evans于2003年提出的,离如今有17年。编程
当软件愈来愈复杂,实际开发中,大量的业务逻辑堆积在一个巨型类中的例子家常便饭,代码的复用性和扩展性没法获得保证。为了解决这样的问题,DDD提出了清晰的分层架构和领域对象的概念,让面向对象的分析和设计进入了一个新的阶段,对企业级软件开发起到了巨大的推进做用。架构
面向过程编程(POP),接触到需求第一步考虑把需求自顶向下分解成一个一个函数。而且在这个过程当中考虑分层,模块化等具体的组织方式,从而分解软件的复杂度。当软件的复杂度不是很大,POP也能获得很好的效果。模块化
面向对象编程(OOP),接触到需求第一步考虑把需求分解成一个一个对象,而后每一个对象添加一个一个方法和属性,程序经过各类对象之间的调用以及协做,从而实现计算机软件的功能。跟不少工程方法同样,OOP的初衷就是一种处理软件复杂度的设计方法。函数
领域驱动设计(DDD),接触到需求第一步考虑把需求分解成一个一个问题域,而后再把每一个问题域分解成一个一个对象,程序经过各类问题域之间的调用以及协做,从而实现计算机软件的功能。DDD是解决复杂中大型软件的一套行之有效方式,现已成为主流。oop
POP,无边界,软件复杂度小适用,例如“盖房子”。设计
OOP,以“对象”为边界,软件复杂度中适用,例如“盖小区”。对象
DDD,以“问题域”为边界,软件复杂度大适用,例如“盖城市”。接口
整个架构分为四层,其核心就是领域层(Domain),全部的业务逻辑应该在领域层实现,具体描述以下:内存
用户界面/展示层,负责向用户展示信息以及解释用户命令。开发
应用层,很薄的一层,用来协调应用的活动。它不包含业务逻辑。它不保留业务对象的状态,但它保有应用任务的进度状态。
领域层,本层包含关于领域的信息。这是业务软件的核心所在。在这里保留业务对象的状态,对业务对象和它们状态的持久化被委托给了基础设施层。
基础设施层,本层做为其余层的支撑库存在。它提供了层间的通讯,实现对业务对象的持久化,包含对用户界面层的支撑库等做用。
实体(Entity),具有惟一ID,可以被持久化,具有业务逻辑,对应现实世界业务对象。
值对象(Value Object),不具备惟一ID,由对象的属性描述,通常为内存中的临时对象,能够用来传递参数或对实体进行补充描述。
领域服务(Domain Service),为上层建筑提供可操做的接口,负责对领域对象进行调度和封装,同时能够对外提供各类形式的服务。
聚合根(Aggregate Root),聚合根属于实体对象,聚合根具备全局惟一ID,而实体只有在聚合内部有惟一的本地ID,值对象没有惟一ID
工厂(Factories),主要用来建立聚合根,目前架构实践中通常采用IOC容器来实现工厂的功能。
仓储(Repository),封装了基础设施来提供查询和持久化聚合操做。
经过本文介绍,咱们了解DDD是为解决软件复杂性而诞生,与OOP最大的区别就是划分边界的方式不同,因此DDD自己掌握起来并不会感受复杂,DDD实际上是研究将包含业务逻辑的ifelse语句放在哪里的学问。