当前位置: 首页 > news >正文

充血模型 :DDD中的领域对象里可以放什么方法?

DDD推崇充血模型,这个知识点很多人都知道。但充血到什么程度,每个人理解差异还蛮大的。

就我自己见过的,DDD的领域对象里的方法,反面案例有两种:

第一,只把聚合根写成纯数据容器,所有业务逻辑全扔Service里;

第二,而有人则反过来,把复杂的创建流程塞进聚合根,居然在里面调用rpc接口。

后来我这边在团队里定了一条规则:谁有数据,谁提供方法。

就是说判断一个方法该不该放在聚合根里就只看一件事:它需要的数据是不是全部在自己身上。

举个最常见的场景,很多项目里判断订单状态是否是待发货状态(假设枚举值是pending),是这么做的:从数据库查出订单对象,然后拿order.getStatus()跟pending这个固定的值做比较。

这样做当然没问题,但「pending代表待发货」这个业务知识散落在了各个调用方。哪个Service需要判断状态,就自己写一遍字符串比较。

正确的做法是让订单自己回答这个问题。status字段在订单身上,那么「是否待发货」这个判断就该由订单来提供。调用方不需要知道状态值具体是什么字符串,只需要问订单一句话,订单用自己的字段给出答案。isPending()执行时只用了this.status这一个字段,不需要查库,不需要调接口,数据完全自给自足。

就是说,你从数据库加载出订单对象后,直接调用isPending(),就知道该订单是否是待发货状态了。

简单,好用,又靠谱,且用起来还很爽。

这个模式在各种业务系统里到处都能用。做营销活动系统,活动表里有startTime和endTime两个字段。传统写法是在Service里到处用当前时间和这两个字段做比较,判断活动是否开始、是否结束。换成实体方法,isStarted()、isEnded()、isOngoing()这三个方法全部只依赖实体自身的startTime和endTime字段加上当前时间,不需要查数据库,不需要调外部接口。

这些方法可以有多复杂?想多复杂就多复杂。

哪怕判断逻辑涉及实体上十几个字段、几十行条件分支,只要不需要从外面拿数据,就属于实体的方法。方法的复杂度和它该不该放在实体里无关。

分界线始终只有一条:需不需要跟外部世界交互。聚合根是一个封闭的计算单元,给它足够的输入数据,它在内存里完成所有计算。需要从外部获取数据或者需要协调多个系统的操作,由Service层负责。

充血模型的判断标准不是方法有多复杂,而是数据是否自给自足。数据在自己身上,多复杂都该放进来;数据在别人身上,多简单都不该放。

http://www.jsqmd.com/news/1257950/

相关文章:

  • 私有化部署智能问答:OpenClaw与Ollama金融级实践
  • MySQL 8.0 安装配置全攻略:从下载到连接验证,避开新手常见坑
  • 基于LangChain与ReAct机制构建AI智能体:从原理到实战
  • 2026龙虾国产化定制替代方案有哪些?企业级OpenClaw私有化定制部署方案
  • HTTPS协议深度解析:从TLS握手到安全迁移实战指南
  • C语言逆向解析Wallpaper Engine资源包:从PKG文件格式到RePKG工具实现
  • 2026年中国到尼日利亚的签证代办旅行社口碑挑选指南 - 品牌优推
  • 2026 年现阶段乌鲁木齐诚信的防护网生产商有哪些,穿透性极强!这道屏障如何帮你省下万元?-玖龙盛邦护栏网 - 行业推荐官【官方】
  • AI工具如何提升学术写作效率:从选题到答辩的全流程优化
  • 2026 年更新:大连靠谱的下水道疏通服务团队电话,堵塞的瞬间,如何秒杀水管黑洞? - 企业推荐官【认证】
  • 工业电流采样实战:AMC1304隔离式Δ-Σ调制器原理、选型与PCB布局指南
  • 2026年汽车托运物流实力公司推荐几家 合规服务商选型参考 - 品牌优推
  • 阿里开源前端AI代理Page Agent:零后端依赖,用自然语言控制网页
  • Rust开发轻量级Markdown阅读器:多标签管理与源码编辑实践
  • Flutter动画插值全解析:从Tween到Curve的十五个常用缓动参数详解
  • 企业AI转型实战:从技术落地到业务融合
  • 提示词改写失效?92%的从业者踩中的4个隐形陷阱,及权威验证的3层语义重构模型
  • PLC与气动元件控制:从电磁阀驱动到多气缸协调编程实战
  • 动图魔方 HarmonyOS 设计(22):PixelMap 生命周期与内存释放
  • “十五五”规划对功率预测+AI交易决策的定调,意味着哪些市场机会?
  • 2026年广州轻质砖/加气砖采购指南,这几家不容错过! - 品牌排行榜
  • 2026年查询中国到加纳的签证代办旅行社电话实用指引 - 品牌优推
  • AMD MI400定制AI芯片解析:Meta合作、HBM3e内存与PyTorch优化
  • Docker与Kubernetes从零到一实战:容器化与集群编排保姆级教程
  • LSADCR00 275-2132 印刷电路板
  • 2026年数字展厅设计施工一体化源头厂家选择实用参考指南 - 品牌优推
  • AI解高考数学题为何频频宕机?技术原理与工程实践深度解析
  • AI Agent开发必备:20+核心术语解析与实战指南
  • AI一键成片系统:智能视频剪辑技术解析与应用
  • YOLO 11与Qwen3.5构建智能安防系统实战