DDD的函数式编程实现

news/2024/11/15 16:00:35/文章来源:https://www.cnblogs.com/JavaEdge/p/18372752

DDD是一种成熟的软件设计方法,旨在确保领域专家和开发人员能够有效合作,创造出高质量的软件。

本文介绍咋将FP(函数式编程)应用于DDD的实现,使其既优雅又简洁。C4模型中,软件架构图分为四个层次:“系统上下文”、“容器”、“组件”和“代码”。

“组件”是构成容器的基本单位,也是本文描述的层次。

1 代码组织结构

随应用程序复杂性增加,管理这种复杂性的一种方法是根据应用程序的职责或关注点将其拆分。分层架构是一种遵循这一原则的方法,它有助于保持不断增长的代码库的组织性,使开发人员能够轻松找到某个功能的实现位置。

在分层架构中,代码被水平拆分为不同的层次,每一层通过面向对象(OO)设计进行封装。请求从顶层进入,代码从上到下执行,输出从顶层产生。

这种设计的一个问题是,多个层次不仅分离了关注点,还将同一业务功能的上下文分离到不同的位置,这意味着在修改同一业务功能时,可能需要同时修改多个层次。

另一个问题是,表示层和应用层通常被设计为外观模式,这易导致上帝对象的出现,而上帝对象被认为是一种反模式。

FP本质是组合。FP更倾向于垂直组织代码,而不是水平拆分代码。多个函数通过Monad组合成一个函数流水线来实现一个业务功能(通常是一个API)。

基于函数式编程的垂直代码结构:

2 信任边界

现实世界中,问题域之间的边界是模糊的。限界上下文是计算机系统中对现实世界问题的人工投影:

  • 边界之外的世界不可信,因为它包括来自用户的各种输入
  • 边界之内的世界则是可信的、合法的、共享的领域模型

这要求我们在限界上下文的边界处引入验证和转换,从而防止外部输入并验证输出的合法性。

常见的验证和转换包括:

  • 将输入数据转换为领域模型
  • 验证输入数据的有效性,例如确保用户名和电子邮件不为空
  • 输出检查器,防止如用户密码等敏感信息被包含在输出数据中

在FP中,Applicative通常用于验证和转换输入数据为领域模型。一旦输入数据突破信任边界,你就无需担心用户名是否为空或电子邮件格式是否正确。你应专注于使用ADT进行领域建模,并通过纯函数处理业务规则。

3 使用状态机进行领域建模

业务模型可以通过不同状态的转换来建模。你总是可以通过联合类型(和类型)将领域建模为状态机。另一个好处是,在FP中,模式匹配迫使你处理联合类型的每个分支,以避免遗漏情况。

状态之间的转换

以用户注册为例:注册可以分为三个步骤:

  • 输入用户名和密码
  • 验证电子邮件
  • 支付会员费

这三个步骤可以通过联合类型记录为三个明确的状态。诸如注册、添加电子邮件、验证电子邮件等行为可以通过对这个领域模型进行模式匹配设计为函数。

4 保持领域纯粹

遵循依赖倒置原则的应用程序倾向于实现洋葱架构或整洁架构。其核心思想是将业务逻辑和领域模型置于应用程序的中心,而不是让业务逻辑依赖于数据访问或其他基础设施。依赖关系被倒置:基础设施和实现细节依赖于应用程序核心。

同样,在FP中,我们倾向于在每个API请求中将函数组合为流水线。与洋葱架构类似,我们尽可能将副作用置于领域之外,以保持领域的纯粹性。纯函数遵循持久性无知原则,它们专注于实现业务规则。

洋葱架构:

5 总结

通常,面向对象编程语言是实现DDD的首选,函数式编程则被认为适合数据科学的管道处理。实际上,DDD只是一个强调应专注于领域的思想,它并不依附于任何特定的编程范式。你可以利用FP的特性,如可组合性、Monad、Applicative和模式匹配,在“组件”架构层级上实现DDD。

关注我,紧跟本系列专栏文章,咱们下篇再续!

作者简介:魔都架构师,多家大厂后端一线研发经验,在分布式系统设计、数据平台架构和AI应用开发等领域都有丰富实践经验。

各大技术社区头部专家博主。具有丰富的引领团队经验,深厚业务架构和解决方案的积累。

负责:

  • 中央/分销预订系统性能优化
  • 活动&券等营销中台建设
  • 交易平台及数据中台等架构和开发设计
  • 车联网核心平台-物联网连接平台、大数据平台架构设计及优化
  • LLM Agent应用开发
  • 区块链应用开发
  • 大数据开发挖掘经验
  • 推荐系统项目

目前主攻市级软件项目设计、构建服务全社会的应用系统。

参考:

  • 编程严选网

本文由博客一文多发平台 OpenWrite 发布!

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

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

相关文章

使用FModel提取黑神话悟空的资产

介绍使用FModel提取黑神话悟空资产的方法目录前言设置效果展示闲聊可能遇到的问题没有相应的UE引擎版本选项 前言 黑神话悟空昨天上线了,解个包looklook。本文内容比较简洁,仅介绍解包黑神话所需的专项配置,关于FModel的基础使用流程,请见《使用FModel提取UE4/5游戏资产》 …

rust库-ouroboros中文文档

文档原文:https://docs.rs/ouroboros/latest/ouroboros/attr.self_referencing.html 属性宏ouroboros::self_referencing #[self_referencing]此宏用于将常规结构转换为自引用结构。举个例子: use ouroboros::self_referencing;#[self_referencing] struct MyStruct {int_dat…

mini-lsm通关笔记Week1Day4

项目地址:https://github.com/skyzh/mini-lsm 个人实现地址:https://gitee.com/cnyuyang/mini-lsmTask 1-SST Builder在此任务中,您需要修改: src/table/builder.rs src/table.rs SST由存储在磁盘上的数据块和索引块组成。通常,数据块都是懒加载的-直到用户发出请求,它们…

高效流程办公,相信自定义流程表单开发

对于自定义流程表单开发的优势特点,可以在本文中获得详细答案。如果要将企业内部的数据做好高效管理,需要借助更优质的软件平台。低代码技术平台够灵活、更高效、易维护、可视化操作等,可以满足日益扩大的业务需求,助力企业做好数据资源管理,共同为实现流程化办公和数字化…

041、Vue3+TypeScript基础,使用pinia库来储存数据

01、输入npm install pinia 02、main.js代码如下:// 引入createApp用于创建Vue实例 import {createApp} from vue // 引入App.vue根组件 import App from ./App.vue//第一步:引入pinia import {createPinia} from piniaconst app = createApp(App);//第二步:创建pinia实例 c…

三维几何生成:多段线、圆弧

一、三维空间多段线几何 1 应用背景 ​​  opengl常用glLineWidth命令设置线宽,此线宽在透视投影中不会随着相机远近变化而缩放。项目中高版本glLineWidth命令失效,需要考虑如何快速、方便、宽度不变的多段线几何。方案a:纯shader绘制曲线,绘制到一个二维平面上,然后将平…

本地快速安装运行史上最强开源LLaMa3大模型

https://liaoxuefeng.com/blogs/all/2024-05-06-llama3/史上最强开源AI大模型——Meta的LLaMa3一经发布,各项指标全面逼近GPT-4。它提供了8B和70B两个版本,8B版本最低仅需4G显存即可运行,可以说是迄今为止能在本地运行的最强LLM。 虽然LLaMa3对中文支持不算好,但HuggingFac…

第二章 redis环境安装与配置

redis环境安装 redis的官方只提供了linux版本的redis,window系统的redis是微软团队根据官方的linux版本高仿的。 官方原版: https://redis.io/ 中文官网:http://www.redis.cn 1、下载和安装 下载地址:https://github.com/tporadowski/redis/releases使用以下命令启动redis服务…

CVSS(Common Vulnerability Scoring System)打分规则解读

CVSS(Common Vulnerability Scoring System)提供了一种根据漏洞的主要特征进行打分,反映其严重性的方法。CVSS 已成为被广泛使用的标准。 下面是CVSS 3.1版本计算器的界面截图,本文对Base Score的打分标准做解读,并提供一些建议。同时会列出每个维度选项的翻译。 Attack V…

插入排序详细解读

插入排序详细解读 图解 第一轮:从第二位置的 6 开始比较,比前面 7 小,交换位置。第二轮:第三位置的 9 比前一位置的 7 大,无需交换位置。第三轮:第四位置的 3 比前一位置的 9 小交换位置,依次往前比较。第四轮:第五位置的 1 比前一位置的 9 小,交换位置,再依次往前比…

一张图看懂SAP主要流程

一张图看懂SAP主要流程

第一章 redis简单介绍

一、引言 在Web应用发展的初期,那时关系型数据库受到了较为广泛的关注和应用,原因是因为那时候Web站点基本上访问和并发不高、交互也较少。而在后来,随着访问量的提升,使用关系型数据库的Web站点多多少少都开始在性能上出现了一些瓶颈,而瓶颈的源头一般是在磁盘的I/O上。而…