DDD贫血模型、充血模型

贫血模型

贫血模型是一种软件开发中的设计模式,它指的是将数据和业务逻辑分离的一种设计模式,其中数据和领域模型是独立于业务逻辑的。在贫血模型中,数据由数据对象存储,而业务逻辑由服务对象处理。这种设计模式的优点是使代码更加清晰和可维护,使得领域模型更具可重用性和扩展性。

优点:

  1. 可维护性:贫血模型能够更好地分离业务规则和数据操作,使得后续维护和修改更加方便。

  2. 可测试性:由于业务规则被抽象出来,更容易进行单元测试和集成测试。

  3. 灵活性:由于数据操作独立于业务规则,可以更加灵活地进行数据操作。

  4. 易于管理:贫血模型能够更好地支持模块化开发,使得项目管理和团队协作更加方便。

  5. 性能优化:由于数据操作和业务规则分离,可以更好地进行性能优化,例如通过缓存数据等手段来提高效率。

缺点:

  1. 数据处理过多:因为数据操作都集中在数据对象中,所以数据对象需要处理大量的业务逻辑,这会导致数据对象过于庞大,难以管理。

  2. 破坏了面向对象的封装原则:贫血模型中,数据对象暴露了很多属性和方法,导致了数据的封装性变得比较差。这样会使得代码难以维护和扩展。

  3. 领域对象失去行为:在贫血模型中,领域对象失去了自己的行为,所有的业务逻辑都由服务层处理。这使得代码耦合度高,难以进行单元测试和重构。

 贫血模型实现要求

public long Id { get; set; }
public DateTime UserDateTime { get; set; }
public string UserName { get; set; }
public int UserInt { get; set; }

充血模型

充血模型(Rich Domain Model)是面向对象软件设计中的一种模式,指的是将领域模型的知识和行为尽可能地包含在对象内部,将对象设计为拥有自身的属性和方法,而不是简单的数据结构。这种模式的核心思想是使软件系统更贴近实际领域,从而更加易于理解和维护。在充血模型中,对象不仅包含自身数据的状态信息,还包括了领域知识、业务逻辑、验证规则和操作方法等。

优点:

  1. 更加真实:充血模型直接将业务逻辑表示在对象中,更加贴近现实世界。

  2. 更容易测试:由于业务逻辑被封装在对象中,可以更加容易地对其进行单元测试和集成测试。

  3. 更容易扩展:充血模型的对象具有自主性,可以更加容易地进行扩展和修改,而不会对其他部分产生影响。

  4. 更加灵活:充血模型可以根据不同的业务需求进行灵活的调整和运用,使得系统更加适应变化和需求的变化。

缺点:

  1. 复杂性高:充血模型需要在业务逻辑中处理大量的业务规则和逻辑,导致代码复杂度高,难以维护。

  2. 依赖性强:充血模型中的业务规则和逻辑耦合在实体对象中,导致实体对象的重用性和可测试性较差。当业务规则发生变化时,需要修改实体对象的代码。

  3. 性能问题:充血模型需要加载整个实体对象,包括其所有关联数据,而且大量的业务逻辑会导致实体对象的状态频繁变化,对于复杂的业务场景,可能会影响系统性能。

  4. 对象状态管理困难:充血模型需要维护实体对象的状态,包括持久化、缓存、序列化和反序列化等,这些状态管理需要占用大量的内存和CPU资源。

什么时候使用充血模型

充血模型适用于需要处理大量业务规则和复杂业务逻辑的项目,比如金融、电商等领域。以下是使用充血模型的情景:

  1. 订单处理系统:订单处理涉及到多种业务逻辑,如库存管理、价格计算、优惠券使用等。采用充血模型可以将这些业务逻辑封装到订单对象中,使得代码更加清晰、可维护性更高。

  2. 购物车系统:购物车系统需要处理多种商品和促销活动的组合,需要考虑库存和价格等因素。

  3. 游戏开发:充血模型可以用于游戏中各种复杂的对象的建模,如玩家、怪物、游戏物品等。

充血模型实现要求

internal class User
{public long Id { get; init; }//设置为只读public DateTime UserDateTime { get; init; }//只能在初始化中赋值,后续不可更改public string UserName { get; private set; }//只能方法更改public int UserInt { get; set; }//可以外部修改public User(string myxm)//程序员用的{this.UserName = myxm;this.UserDateTime = DateTime.Now;this.UserInt = 0;}//如果有参的构造方法参数不能对应我们所创建的变量需要构造一个无参的构造方法private User()//给编辑器用的{}public void NewUserName(string ym){if (ym.Length > 10){Console.WriteLine("长度不能大于10");return;}this.UserName = ym;}
}

两者区别:

  1. 数据处理方式不同:充血模型中,领域对象包含了业务逻辑和数据相关操作,它们能够自己进行数据访问,也可以对其它对象进行操作,这种模型下数据对象相对较多;而贫血模型则是将数据抽象为对象,所有的业务逻辑都在服务端(或其它层)进行处理。

  2. 灵活性不同:充血模型中,由于对象自身拥有数据操作权,因此更能够适应需求变化,更具灵活性;而贫血模型则由于在客户端或服务端进行数据处理,因此更加安全稳定,但可扩展性稍次。

  3. 复杂度不同:充血模型下的对象较多,它们承担了较多的业务逻辑,因此模型相对来说更加复杂,编写、维护成本更高;而贫血模型下的对象较少,主要负责数据的存储和传输,因此模型相对来说简单。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/139746.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android修行手册 - 万字梳理JNI开发正确技巧和错误缺陷

JNI 简介 JNI,Java Native Interface,是 native code 的编程接口。JNI 使 Java 代码程序可以与 native code 交互——在 Java 程序中调用 native code;在 native code 中嵌入 Java 虚拟机调用 Java 的代码。 它支持将 Java 代码与使用其他…

二十三种设计模式全面解析-解密迭代器模式:探索遍历之道

在软件开发中,遍历数据集合是一个非常常见的需求。但是,如何以一种优雅、灵活的方式遍历集合,并且能够适应各种不同的数据结构和迭代方式,一直是开发者们面临的挑战。今天,我将带你深入探索迭代器模式(Iter…

vue3 开启 https

1、安装mkcert证书创建器 npm i mkcert -g 2、检验是否安装成功 mkcert --version 有版本好出现则成功 3、创建证书颁发机构 mkcert create-ca 会在当前目录生成,ca.crt 和 ca.key 两个文件 4、创建证书 mkcert create-cert 会在当前目录生成,…

如何使用 NFTScan NFT API 在 zkSync 网络上开发 Web3 应用

zkSync 是由 Matter Labs 创建的,是一个以用户为中心的 zk rollup 平台,它是以太坊的第 2 层扩展解决方案,使用 zk-rollups 作为扩展技术,与 optimistic rollups 一样,zk-rollups 将会汇总以太坊主网上的交易并将交易证…

力扣117双周赛

第 117 场双周赛 给小朋友们分糖果 I 同T2 给小朋友们分糖果 II 数学 class Solution { public:long long distributeCandies(int n, int limit) {long long ans 0;for (int i 0; i < min(n, limit); i) {if (n - i < limit) {ans n - i 1;} else if (n - i <…

刷题学习记录BUUCTF

[极客大挑战 2019]RCE ME1 进入环境直接就有代码 <?php error_reporting(0); if(isset($_GET[code])){$code$_GET[code];if(strlen($code)>40){die("This is too Long.");}if(preg_match("/[A-Za-z0-9]/",$code)){die("NO.");}eval($co…

JSP运行环境搭建

将安装JSP引擎的计算机称作一个支持JSP的Web服务器。这个服务器负责运行JSP&#xff0c;并将运行结果返回给用户。 JSP的核心内容之一就是编写JSP页面,JSP页面是Web应用程序的重要组成部分之一。一个简单Web应用程序可能只有一个JSP页面,而一个复杂的Web应用程序可能由许多JSP…

Ubuntu18.04.6安装qt5.7.1(超级详细教程)

目录 1、下载对应Linux版本的qt 2、安装完qt&#xff0c;可能也要安装下对应的编译工具 1、下载对应Linux版本的qt &#xff08;1&#xff09;准备安装的是qt5.7.1&#xff1a;qt-opensource-linux-x64-5.7.1.run &#xff08;2&#xff09;在虚拟机进入存放qt安装包的目录…

100天精通风控建模(原理+Python实现)——第5天:风控建模中数据标准化是什么?

风控模型已在各大银行和公司都实际运用于业务,用于营销和风险控制等。    之前已经阐述了100天精通风控建模(原理+Python实现)——第1天:什么是风控建模?    100天精通风控建模(原理+Python实现)——第2天:风控建模有什么目的?    100天精通风控建模(原理+Python实现…

C语言--求一个 3 X 3 的整型矩阵对角线元素之和

一.题目描述 求一个 3 X 3 的整型矩阵对角线元素之和 二.代码实现 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() {int arr[3][3] { 0 };for (int i 0;i < 3;i){for (int j 0;j < 3;j){ printf("请输入数字&#xff1a;");scanf(&…

Redis之与SSM集成Spring注解式缓存

目录 一.整合 1.1.整合应用 1.1.1.pom配置 1.1.2.所需配置 二.注解式开发及应用场景 2.1. Cacheable 2.2. CachePut 2.3. CacheEvict 2.4.总结 三.redis的击穿穿透雪崩 好啦今天就到这里了哦&#xff01;&#xff01;希望能帮到你哦&#xff01;&#xff01; 一.整合…

科技云报道:数智化升级,如何跨越数字世界与实体产业的鸿沟?

科技云报道原创。 数智化是当下商业环境下最大的确定性。 2022年&#xff0c;中国数字经济规模达50.2万亿元&#xff0c;占国内生产总值比重提升至41.5%&#xff0c;数字经济成为推动经济发展的重要引擎。从小型创业公司到跨国巨头&#xff0c;数字化转型在企业发展历程中彰显…

分治构造:P9384

https://www.luogu.com.cn/problem/P9384 分治构造是很常见的一种构造 不能有三元环和五元环&#xff0c;考虑推广出去&#xff0c;也就是不能有奇环 那如果我们让每种颜色都为二分图&#xff0c;那么必然满足 考虑 0-9 总共10个数字&#xff0c;数据范围1000&#xff0c;考…

洛谷 NOIP 2023 模拟赛 P9837 汪了个汪

洛谷 NOIP 2023 模拟赛 P9837 汪了个汪 文章目录 洛谷 NOIP 2023 模拟赛 P9837 汪了个汪题目大意思路code 题目大意 构造一个高为 n n n 的棋盘&#xff0c;第 i i i 行有 i i i 个格子。 每个格子里的数是 [ 1 , n ] [1 , n] [1,n] 并且每一行中的每个数各不相同&#…

100天精通风控建模(原理+Python实现)——第4天:风控建模中如何处理异常值?

风控模型已在各大银行和公司都实际运用于业务,用于营销和风险控制等。    之前已经阐述了100天精通风控建模(原理+Python实现)——第1天:什么是风控建模?    100天精通风控建模(原理+Python实现)——第2天:风控建模有什么目的?    100天精通风控建模(原理+Python实现…

网康NS-ASG安全网关任意文件读取

此文件没有对身份进行校验即可下载任意文件 构造payload访问漏洞url&#xff1a; ​​/admin/cert_download.php?filegjxbstxdt.txt&certfile../../../../../../../../etc/passwd漏洞证明&#xff1a; 文笔生疏&#xff0c;措辞浅薄&#xff0c;望各位大佬不吝赐教&…

HDMI之编码篇

概述 HDMI 2.0b(含)以下版本,采用3个Channel方式输出。传输又分为3三种周期,视频数据,数据岛以及控制周期。视频传输采用8/10编码。数据岛采用4/10编码(TERC4)。控制周期采用2/10。编码都拓展成了10bits。 上图中,Pixel component(e.g.B)->D[7:0]表示视频数据周期…

Maven各方面配置好了却无法显示版本

今天配置了maven环境&#xff0c;各方面都配置好了命令行却一直没办法显示maven的版本&#xff0c;原因 竟是两个JDK导致maven无法选择&#xff0c;因为maven依赖于JDK&#xff0c;导致在选择JDK的时候差生了二义 性&#xff0c;在环境变量里面删除不常用的JDK&#xff0c;只…

Fliki AI:让视频创作更简单、更高效

在当今的数字时代&#xff0c;视频已经成为人们获取信息和娱乐的重要方式。无论是企业宣传、教育培训还是个人创作&#xff0c;视频都发挥着越来越重要的作用。然而&#xff0c;视频制作是一项复杂的工作&#xff0c;需要掌握一定的技能和经验。这对于初学者或没有专业视频制作…

【KingbaseES】R6 Liunx下使用命令行部署数据库集群

【KingbaseES】R6命令行部署数据库集群 A.数据库安装包下载软件下载页面授权下载页面 B.数据库集群部署软件安装第一步&#xff1a;创建Kingbase用户第二步&#xff1a;上传安装包1.创建Kingbase用户和准备安装目录2.使用FTP工具上传安装包镜像和授权文件到install目录下并授权…