`

我对DDD的认知(一)

 
阅读更多

1 引言

DDD,全名:Domain Driven Design,中文名:领域驱动设计。

2 DDD的分层

分层的架构方式是我们常用的,这里的分层是说n-layer,指的是逻辑的分层,目的是分离职责。常用的是三层:表现层,业务逻辑层,数据访问层。

DDD把原来经典三层(表现层,业务逻辑层,数据访问层)中的业务逻辑层又细分为两层:应用层和领域层。应用层负责领域对象的协调和调度,领域层包含具体的领域对象,领域规则(也就是业务规则),更大限度的实现业务规则的重用和职责的分离。将数据访问层并入基础架构层。变成了四层:

  1. Presentation
  2. Application
  3. Domain
  4. Infrastructure。

3 DDD的持久化设计

3.1 三层中的持久化设计

三层模式中的数据持久化是由数据访问层负责的,是至下而上的服务。为什么说是至下而上的呢?因为我们会写下面的代码。

public class Product
   {
       public Guid Id { get; set; }
       public string Name { get; set; }
       public List<Parameter> Parameters { get; set; }
       public List<Delivery> Deliverys { get; set; }
       public List<Image> Images { get; set; }
   }

   public class Parameter
   {
   }
   public class Delivery
   { }
   public class Image
   { }

   public class ProductDAL
   {
       public bool Add(Product product);
       public bool Update(Product product);
       public bool Delete(Product product);
       public Product Get(Guid id);
       public List<Product> FindAll();
   }

在数据访问层会写上所有针对这个Product的操作,不管需要与否,有时候干脆每张表一个DAL,用工具生成实体和数据访问类,这下数据访问层就完成了,后面可能会根据需要进行修改。管它业务层是否需要呢,反正需要的我都有了,不需要的我也有了,自己组合吧。

这种情况会造成代码浪费,甚至是大量的数据访问代码根本就没有用过。最重要的是也没有根据上层的需求来完成持久化的任务,而是简单的完成了表的增删改查,反正实现业务你就组合吧。总有一种组合会实现你的业务。这也就怪不得别人叫我们增删改查程序员了,因为如果业务简单,正好大部分业务都很简单,那么业务层就就剩下

new ProductDAL().Add(new Product());

这么一句了。

3.2 DDD的持久化设计

在DDD中,持久化被放在了基础架构层中。基础架构层不仅包括数据持久化,而且包括基础类库,Cross-Cutting等工具。DDD的持久化是至上而下的,是根据DDD的需要进行持久化。持久化的对象也变成了领域对象,而不再是单个表对象。

在领域层定义持久化的接口,持久化的对象是业务对象或者领域对象。在基础架构层实现领域层需要的持久化接口,具体的实现将领域对象持久化到数据存储中,是数据库还是文件,还是其他什么储存设备。一个领域对象是存储在一张表还是分开几张表,甚至是分开几个数据库,都是由基础架构层中的持久化模块来决定的,对领域层屏蔽实现的细节。只是在领域层需要持久化,或者需要反持久化的时候提供领域层需要的对象即可。

4 聚合

在进行面向对象设计的时候,我们会将一些对象进行组合,组合成为新的对象。随着系统的复杂,很容易造成对象的关系也复杂起来,对象的关系真的变成了错综负责的网状。

DDD提出的聚合可以解决这个问题,用来减少对象之间的关联关系。有聚合就有聚合根的概念,要不然就没有终点,还是会变成网状。我理解的聚合根,就是一个聚合的终点。聚合也可以理解为一系列对象,他们的关系好像树形,需要一个根节点来表达这一系列的对象。

4.1 如何发现聚合

那么如何来发现一个聚合呢?通过下面的一个小例子,我们来说明一下。

比如我们的场景是一个电子商务网站,需要定义一个商品类,商品肯定会有参数,图片,配送地域这些附属信息。我们一般会定义下面的类结构

public class Product
   {
       public Guid Id { get; set; }
       public string Name { get; set; }
       public List<Parameter> Parameters { get; set; }
       public List<Delivery> Deliverys { get; set; }
       public List<Image> Images { get; set; }
   }

   public class Parameter
   {
   }
   public class Delivery
   { }
   public class Image
   { }

其实这时候Product,Parameter,Delivery,Image就是一个聚合,Product就是这个聚合的根。因为Parameter,Delivery,Image这些概念脱离了Product是没有意义的,他们都是一个商品的附属信息,单独的谈论一张图片和一个参数没有任何意义。应该是从一个Product出发,然后引出来这个Product的参数,配送,图片,这样才比较合理。所以他们几个概念是一个聚合。

结束

今天我们就理解到这里,明后天我们再继续!!!

Technorati 标签: DDD,Aggregate
分享到:
评论

相关推荐

    2-DDD的庖丁解牛之道(V1.5)——王立.pdf

    DDD通过引入统一语言(Ubiquitous Language),确保团队成员在同一个认知层面上沟通,从而避免歧义。统一语言是指在团队内部使用的,能够精确表达领域模型概念和业务规则的语言。这种语言能够被所有相关人员理解和...

    领域驱动设计中国峰会DDD-China2019

    希望为国内的领域驱动设计(DDD) 实践者们提供了一个互相交流、分享自己团队的成功经验的机会的平台,使得领域驱动设计 (DDD)的架构思想能够在国内被更多人所认知,从而形成更大的规模效应。 ➜ DDD China ...

    ddd.rar_MFC 毕业设计_ddd359.com_ddd875.com_mfc的毕业设计_read brain

    《基于MFC的毕业设计——人脑信号手机系统解析》 在信息技术日益发达的今天,MFC(Microsoft Foundation Classes)作为微软...同时,该项目也为我们提供了一种创新的方式,用技术手段来探索人脑的反应能力和认知训练。

    DDD系统设计的精髓概述.pdf

    统一语言可以降低认知成本,提高团队的沟通效率。统一语言包括命名规范、事件命名和领域词汇表。 应用架构-COLA 基于DDD的应用架构可以分为两部分:领域划分和领域建模。领域划分是将大的业务域分割成小的子域,每...

    laravel-ddd-scaffold:Laravel DDD开发脚手架

    由于对DDD实践和认知较浅,可能理解并不到位欢迎交流指正,希望大家可以一起完善和探索DDD 。除了接口内容外,后续会抽出一部分公司允许对外开放的代码开源一个小程序可用的基础脚手架。最后希望不在被老板按着头...

    DDD 领域驱动设计-软件开发中的挑战和问题

    - **建立清晰的业务模型**:强调提取和表达业务知识,建立一个明确的、统一的领域模型,促进团队成员之间对业务概念和规则的理解一致。 - **提高可维护性**:倡导使用清晰的领域模型来构建软件系统,有助于提高...

    ddd-starter-modelling-process:如果您是DDD的新手,并且不确定从哪里开始,则此过程将逐步指导您

    此过程为您提供了逐步的指南,以学习和实际应用域驱动设计(DDD)的各个方面-从围绕组织的业务模型定位到对域模型进行编码。 使用此过程将指导您完成设计具有DDD思维方式的软件系统的每个基本步骤,因此您可以专注于...

    domain-driven-design:Go中(人为)电子商务业务的DDD实施

    - **领域模型(Domain Model)**:DDD的核心是领域模型,它反映了业务专家对业务领域的认知。在Go中,领域模型通常由结构体和它们的方法组成。 - **聚合(Aggregate)**:聚合是业务规则的边界,确保数据的一致性...

    一次领域建模的实战之旅.docx

    DDD强调将业务逻辑和软件结构紧密结合,而领域建模则是这一理念的具体实践。 在一次领域建模的实战活动中,参与者通常会遇到不同的建模方法和理解。由于每个人的经验、知识、认知角度以及美学观念的差异,即使面对...

    抱歉!二十三年前我们没看懂《人月神话》幻灯片-共127页

    #### 一、软件工程与项目管理的重要性 《人月神话》作为软件工程领域的重要著作,自出版以来便备受关注。它深入剖析了软件项目的管理和执行过程中存在的问题,并提出了诸多解决方案。本书强调了在软件开发中,团队...

    域模型价值领域驱动设计

    数据模型是针对特定解决方案的描述,而域模型则侧重于描绘问题域,旨在统一团队对业务的认知。混淆两者可能导致设计的局限性和误解,因此正确区分问题域模型和解决方案域模型是至关重要的。 领域驱动设计(DDD)中...

    领域驱动设计中的敏捷实验

    在IT行业,特别是软件开发领域,**领域驱动设计**(Domain-Driven Design, DDD)与**敏捷方法**(Agile Methodology)的结合日益受到重视。本文通过一个具体的案例——SVN权限管理问题,探讨如何在领域驱动设计中应用...

    hackerda:现在老国王已经死了

    领域驱动设计这个概念对我影响非常深,这个项目的设计思想也是基于领域驱动的(DDD),用于缩短时间对领域驱动设计认知的实践。同时该项目目前同时为黑科大的同学提供在线的服务。 项目结构 该项目主要分为两部分,...

    Head First Jquery(中文版),完整扫描版

    通过使用认知科学和学习理论的最新研究成果,你将享受一种多感官学习体验,《Head First jQuery(中文版)》采用了一种专门为你的大脑而设的丰富格式娓娓道来,而不是长篇累牍地说教,让你昏昏欲睡。

    系统架构师设计教程 软考 参考

    #### 一、系统架构师角色认知与职责 - **角色定位**:系统架构师是软件开发项目中的关键角色之一,主要负责设计整个系统的架构,确保系统能够满足业务需求和技术要求。 - **职责范围**: - 定义系统的技术框架和...

    大写的英语字母怎么写.docx

    掌握这些基础知识对于学习英语至关重要,特别是对初学者而言,良好的书写习惯和准确的字母认知将为今后的英语学习打下坚实基础。在日常练习中,可以结合上述方法加强记忆,提高书写效率和准确性。

    2015年高中语文优秀作文拼音记忆素材

    例如,针对“b”和“d”易混淆的问题,可以创作一句儿歌:“右圆像杯bbb,左圆耳旁ddd”,通过这样的方式,孩子们在愉快的歌唱中自然就能记住拼音的正确形状和发音。 在实际教学中,教师应当灵活运用这些策略,将...

    glagol-dsl:利用领域驱动设计的领域特定语言

    在IT行业中,领域驱动设计(Domain-Driven Design,简称DDD)是一种先进的软件开发方法论,旨在通过深入理解业务领域,以领域模型为核心来指导软件的设计和开发。Glagol DSL是基于这一理念构建的一种领域特定语言...

Global site tag (gtag.js) - Google Analytics