首页 > 其他分享 >DDD 概念和面向对象

DDD 概念和面向对象

时间:2023-11-16 14:24:24浏览次数:32  
标签:Java 概念 对象 模型 业务 领域 面向对象 DDD

最近了解了一些 DDD 的概念,有些解惑。

类起名和分层

首先,代码是要分类或者叫分层,放在不同的文件夹下面,一个文件夹代表一个功能。

其次,类命名和分层这件事,因为有人起名非常的随意和莫名其妙,为了规范,才有有各种理念,统一一下思想和规范。

举例,以前用户类叫 UserModel,放在 model 文件夹下,现在普遍把文件夹改成了 domain,类名换成了 User,或者UserEntity,或者UserVO。

Hibernate 流行的时候叫 UserRepository,MyBatis 流行的时候叫 UserMapper。

接口 UserService 和 实现类 UserServiceImpl 命名一直没变。

领域驱动设计

当谈论领域驱动设计(Domain-Driven Design,简称 DDD)时,这是一种软件开发方法论,旨在通过深入理解领域知识来构建复杂系统。

DDD 强调将软件开发过程与领域专家密切结合,以确保开发出更贴近实际业务需求的系统。

以下是一些关于 DDD 的关键概念:

  1. 领域(Domain):指的是软件系统要解决的问题领域,通常是业务活动所涉及的概念、规则和过程。
  2. 领域模型(Domain Model):是对领域内概念、实体、关系和规则的抽象描述。领域模型是 DDD 的核心,它有助于开发团队更好地理解问题领域,从而更好地构建系统。
  3. 限界上下文(Bounded Context):DDD 强调在大型系统中划分出多个限界上下文,每个上下文内有自己的领域模型和语言。这有助于解决不同上下文之间的概念模糊问题。
  4. 实体(Entity):领域中有生命周期并具有唯一标识的对象。实体是领域模型的核心组成部分。
  5. 值对象(Value Object):在领域中没有唯一标识的对象,它们的价值在于它们的属性。值对象通常是不可变的。
  6. 聚合(Aggregate):一组相关联的实体和值对象,构成一个边界。聚合根是聚合中负责维护一致性和边界完整性的主要对象。
  7. 仓储(Repository):提供从持久化存储中检索和存储领域对象的机制,隐藏了数据访问细节。
  8. 服务(Service):在领域内无法明确归属于某个实体或值对象的操作可以作为服务存在。服务用于跨多个领域对象的操作。
  9. 领域事件(Domain Event):领域中发生的重要事件,可以用于通知其他部分系统。
  10. 领域驱动设计的层次结构:DDD 通常分为用户界面层、应用层、领域层和基础设施层。不同层次负责不同的职责,有助于保持代码的清晰和可维护性。

总之,DDD 是一种强调在软件开发过程中理解和反映实际业务领域的方法,通过建立清晰的领域模型、划分限界上下文等方式,帮助开发团队更好地应对复杂性并构建出高质量的软件系统。

领域驱动了,领域对象模型比较重要了。

用户领域对象,该有的属性方法和事件一个都不能少,用户还要自己能改状态。

充血模型

充血模型(Fat Model)和贫血模型(Anemic Model)是软件开发中两种不同的设计思路。

充血模型是一种面向对象的设计模式,强调将业务逻辑和数据操作封装在领域模型(Domain Model)中。这意味着领域模型包含了业务规则、数据状态和操作等,它是一个功能丰富的对象,可以直接执行业务逻辑。

DDD 的历史

DDD 的基本思想是在90年代中期提出的。

它强调将领域的概念与代码紧密结合,将业务逻辑和领域模型置于核心位置。

在 DDD 中,对类的模型的关注更强调领域的本质。

有用吗

虽然 DDD 提供了一套丰富的术语和概念来表达业务领域,但在实际应用中,确实可能会造成一些与传统 Java 命名和设计方式的冲突。

这种冲突可能导致代码变得繁琐、难以理解,甚至在某些情况下增加类型转换等问题。

问题是增加了复杂性,但是并没有带来收益啊,多写了很多类型转换,强调各种难以理解的 BO DO,代码的可读性严重降低,包结构的变得杂乱。

在使用领域驱动设计(DDD)时,确保数据存储层与领域模型解耦是一个重要的原则。

在实际应用中,随时更换数据库类型确实是一项复杂的任务,基本不太可能。

感觉是在把各种业务强套 DDD,实际是业务经常变,所谓领域专家提出的模型也经常增加字段,也就是 DDD 这套逻辑似乎是用过时的概念来包装一下来套今天的业务,严重水土不服。

开发人员使用 DDD 引入了复杂性,而业务专家(也就是常说的产品)压根就不会尝试了解 DDD。

产品直接提需求,实现是开发的事情。

对比面向对象

怎么感觉 DDD 是面向对象编程的一种模块划分方式呢。

领域和 Java 中的业务对象(BO)很相似。
领域模型就是常见的 Model 类,比如用户类。
界限上下文,很像一个模块或者一个微服务,或者 k8s 中的命名空间。
实体非常像 Java 的 PO。
聚合很像网关,或者接口。
仓储很像 DAO。
服务很像 Service。
领域事件类比 Java 中的事件。
领域驱动设计的层次结构,就像 Java 编码中的常见分层。

看来看去还是 Java 编程那一套。

旧瓶装新酒

DDD 火起来主要还是微服务

综上,给类起名和分类这件事,看公司要求,或者按照常见的标准来。

因为写代码的机会可能没有看代码的机会多,看到别人起名和分层很随意,会很不爽。。

标签:Java,概念,对象,模型,业务,领域,面向对象,DDD
From: https://www.cnblogs.com/ioufev/p/17836118.html

相关文章

  • 「软件设计」权威领域驱动设计(DDD)简介
    「软件设计」权威领域驱动设计(DDD)简介今天的企业应用程序无疑是复杂的,并依赖一些专门技术(持久性,AJAX,Web服务等)来完成它们的工作。作为开发人员,我们倾向于关注这些技术细节是可以理解的。但事实是,一个不能解决业务需求的系统对任何人都没有用,无论它看起来多么漂亮或者如何很好地构......
  • js是一门基于对象的语言,js不是面向对象的语言,但是可以模拟面向对象的思想,具体说面向
    下列关于JavaScript的说法中正确的是()A所有变量在使用之前必须做声明BJavaScript是面向对象的程序设计语言CJavaScript是解释性语言DJavaScript前身是Oak语言正确答案:C选C。解释性语言是相对于编译型语言存在的,源代码不是直接翻译成机器语言,而是先翻译成中间代码,再由......
  • 深度解剖Linux权限的概念
    Linux权限系统是其安全性的基石,它允许系统管理员和用户对文件和目录进行精细的控制。在深度解剖Linux权限的概念时,我们需要涵盖以下主题:1.**文件系统基础**  -文件系统结构:Linux文件系统以树状结构组织,包括根目录、子目录和文件。  -文件属性:每个文件都有一组属......
  • java 面向对象进阶 static
    1.工具类packagenet.elaina.a02staticdemo2;publicclassArrayUtil{//私有化构造方法//目的:为了不让外界创建他的对象privateArrayUtil(){}//需要定义为静态的,方便调用publicstaticStringprintArr(int[]arr){StringB......
  • 【交换机、路由器、双码流、分布式、VKM的基本概念学习】
    分布式节点:分布式就是把传统的音视频设备矩阵切换器、拼接处理器、录播系统、KVM切换器、中央控制系统等这些设备的功能打包成一个等于X功能的节点,然后每个信号输入输出的区域,布置一个这样的X节点,在通过一条网线接到交换机,实现上述的各种功能。可视化:可视化是利用图像传输和处......
  • rust程序设计(3)结构体相关概念和疑问
    结构体//如何定义结构体structUser{active:bool,username:String,email:String,sign_in_count:u64,}//如何使用结构体letuser=User{ active:true,username:String::from("someusername123"),email:String::from("someone@exampl......
  • 学习随笔(设计模式:面向对象原则)
    内容今天学习了面向对象的几种设计思想原则,之前一直是C开发,所以面向过程的思想比较严重。面向对象的四个好处:可维护好、可拓展性好、可复用性好、灵活性好。收获1.单一职责原则:封装一个类,职责应该单一,仅有一个以其它变换的原因,所以要做好类的职责分离。2.开放-封闭原则:软件实......
  • 从混乱到优雅:基于DDD的六边形架构的代码翻新指南
    前言趁着双十一备战封板,终于又有一些时间可以梳理一下最近的心得。最近这半年跟同事讨论比较多的是分层架构,然后就会遇到两个触及灵魂的问题,一个是如何做好分层架构,二是DDD在架构层面该如何落地。为了说好分层,我们需要了解架构的意义。良好的架构是为了保证一下两点:治理应用......
  • 分布式和集群概念
    分布式和集群概念-------------------------------------分布式:每台机器上部署不同组件集群:每台机器上部署相同组件大数据分布式存储、分布式计算linux-------------------------------------桌面操作系统:macos、windows、linux嵌入式操作系统:μlinux、wince、RTOS服务器操作系......
  • nlp期末概念复习
    概率模型隐马尔科夫,viterbi贝叶斯平滑技术:处理数据矩阵稀疏问题,事件可能在样本库中未出现拉普拉斯平滑Good-Turing平滑词性标注词性标注:给定一个词序列,确定每个词的词性信息来源:词本身,上下文马尔科夫词性标注器,一阶马尔科夫链基于转换的词性标注:让计算机学习修正......