热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

DDD领域驱动设计实战电商活动中心重构

现实的业务,非常复杂。即使同一事物,在多个业务下意义可能完全不同。比如【商品】:在商品详情页语境指【商品基本信息】在下单页语境指【购买项

现实的业务,非常复杂。即使同一事物,在多个业务下意义可能完全不同。比如【商品】:

  • 在商品详情页语境指【商品基本信息】
  • 在下单页语境指【购买项】
  • 在物流页面语境又是【被运送的货物】

DDD 核心思想就是让正确的领域模型发挥作用。DDD 指导开发将不同子业务单元划分为不同子领域,在各个子领域内部分别建模应对业务的复杂性。

1 背景

经典的MVC开发,因为初期业务也比较简单,为光速上线, 综合考虑成本和风险,经常创建一个大模型,各个模块都想着直接复用这同一模型。但随业务发展,各子领域的逻辑越来越复杂,对该大模型的修改就会变成一种灾难,有时明明是要改一个 A 子领域的逻辑,却莫名其妙影响到了 B 或者C 子领域的线上功能,这也是导致代码中出现一堆 ifelse 的一大源泉。

比如活动中心,主导商品的优惠活动管理、计算不同用户的优惠结果。【商品管理】和【活动管理】作为两个不同业务单元,在初期被设计为一个大的商品模型,由商品模块统一管理。

原设计之殇

但随业务发展,活动形式推陈出新,业务形态多样,需求也越来越个性化,导致如下问题日渐明显:

功能不够灵活

活动信息作为商品信息的一个属性在商品管理模块配置。
比如为了引导用户使用 App 需要设置 A 类型优惠,就在商品信息的编辑页面增加一个 A 类型活动配置项;如果某个商品的 A 类型优惠需要在 0:00 分生效,业务同学就必须在电脑前等到 0:00 更新商品信息来上线优惠活动。

如果想要创建针对所有商品都适用的优惠,按之前模式,所有商品都要设置一遍,这几乎不可接受。

不易扩展

活动信息存储在商品信息,活动信息通过商品管理模块的接口输出。
如果要新增一种活动类型,商品信息相关的表就要增加字段,商品的表会越来越大;如果要迭代一个优惠的逻辑,就有可能影响到商品管理模块的功能。

不利于迭代

由于活动信息仅作为商品的一个属性,没有自己的生命周期,所以很难去埋点统计某一次设置的活动的投入产出比,从而指导后续的功能优化。

重构目标


  • 系统层面
    把活动相关的业务逻辑独立出来,单独设计和实现
  • 应用层面
    活动中心会有自己的独立后台,负责管理活动;也会有独立的折扣计算接口,负责 C 端用户使用优惠时的计算。

落地过程

比如旅游业务售卖的商品和标品不同:

  • 有些优惠不考虑人群,比如使用优惠券,所有类型的库存都可以享受
  • 但如 N 人 N 折这类优惠,成人价可以享受,儿童价和单房价就不可以

基于此,对优惠中心的商品模型做了抽象,抽象出

  • 【是否可参与件数计算】
  • 【是否可以参与价格计算】

两个通用属性。既实现了基于业务逻辑建模,又不会陷入业务逻辑千差万别的表象中。

参考

  • https://segmentfault.com/a/1190000019743441

推荐阅读
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
  • WCF类型共享的最佳实践
    在使用WCF服务时,经常会遇到同一个实体类型在不同服务中被生成为不同版本的问题。本文将介绍几种有效的类型共享方法,以解决这一常见问题。 ... [详细]
  • 本文详细解析了ASP.NET 2.0中的Callback机制,不仅介绍了基本的使用方法,还深入探讨了其背后的实现原理。通过对比Atlas框架,帮助读者更好地理解和应用这一机制。 ... [详细]
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • 应用链时代,详解 Avalanche 与 Cosmos 的差异 ... [详细]
  • Visual Studio Code (VSCode) 是一款功能强大的源代码编辑器,支持多种编程语言,具备丰富的扩展生态。本文将详细介绍如何在 macOS 上安装、配置并使用 VSCode。 ... [详细]
  • Spring框架中枚举参数的正确使用方法与技巧
    本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 如何撰写适应变化的高效代码:策略与实践
    编写高质量且适应变化的代码是每位程序员的追求。优质代码的关键在于其可维护性和可扩展性。本文将从面向对象编程的角度出发,探讨实现这一目标的具体策略与实践方法,帮助开发者提升代码效率和灵活性。 ... [详细]
  • 在阅读论文时,经常遇到协方差矩阵这一概念,尤其是在图像处理领域。尽管网络上有许多公式,但其物理意义却往往令人困惑。本文将详细探讨协方差矩阵的性质和应用,帮助读者更好地理解这一重要的数学工具。 ... [详细]
  • 本文档提供了 TA-Lib 的安装指南、快速入门、高级应用及各类技术指标的详细介绍。 ... [详细]
  • 本文详细介绍了在天正CAD中如何调整和修改尺寸标注的方法,包括改变标注数字大小、修改文字样式、调整标注比例等实用技巧。 ... [详细]
  • 炫龙T50游戏本深度评测:值得入手吗?
    2017年初,随着英特尔第七代酷睿处理器和英伟达GTX 1050/1050 Ti新平台的推出,各大OEM厂商迅速更新了自家产品线。炫龙也不例外,推出了搭载最新硬件的T50游戏本。本文将对这款产品进行全面评测。 ... [详细]
  • Java高并发与多线程(二):线程的实现方式详解
    本文将深入探讨Java中线程的三种主要实现方式,包括继承Thread类、实现Runnable接口和实现Callable接口,并分析它们之间的异同及其应用场景。 ... [详细]
  • C# 实现可浮动工具栏功能
    本文介绍如何在 C# 中实现一个可浮动的工具栏,即工具栏可以从其初始位置拖出,并且可以重新拖回原位。通过创建一个新的窗口作为工具栏的容器,并利用 .NET Framework 提供的 ToolStrip 控件,可以轻松实现这一功能。 ... [详细]
author-avatar
和乐大同2011_999
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有