【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

领域驱动设计中的函数模式

  • 2014-07-08
  • 本文字数:955 字

    阅读完需:约 3 分钟

领域驱动设计(DDD)为了鼓励开发人员创建领域模型和通用语言(ubiquitous language )做了大量工作,但是尝试运用面向对象原则里面的状态和行为的概念来实现DDD 思想最终得到的常常只是一套混乱易变的模型, Debasish Ghosh 在一篇文章中阐述了领域驱动设计中的函数模式

Debasish 是 ACM 资深会员和《 DSLs in Action 》一书的作者,他认为,从某种意义上讲,当把与某个特定的领域抽象相关的所有概念都放在一个类里面时,这个模型的信息可能就会非常丰富;但是由于这种方式只关注于局部而忽略了全局性的诉求,也就使得这个类变得更加脆弱。因此,当将领域内的所有抽象概念进行组合的时候,它可能就会被中间代码污染而不能解决类边界之间的阻抗失配(impedance mismatch)问题(译者注:“阻抗失配”这一词组通常用来描述面向对象应用向传统的关系数据库存放数据时所遇到的数据表述不一致问题)。

在他的主张中,他提到了 Dean Wampler ,最近 Dean Wampler主张函数式编程原则可以帮助改进领域驱动设计。Dean 声称“模型应该是贫血的”,并鼓励领域对象只拥有状态而将行为移到单独的函数中。

Debaish 所反对的另一种说法就是将状态和行为打包到一个类中来加强封闭性。他反而认为按照 DDD 的原则,将领域行为作为单独的函数来进行构造会更好地促进模块化和实现领域模型。在这种方式下,所有的领域行为都被作为模块中的函数来进行建模,而这个模块就代表了这些函数的组合体。

作为例子,在之前发布的博客文章中,他运用函数式编程原则在 DDD 中实现了规范(Specification)和聚合(Aggregate)模式,他在这篇文章中采用函数模式和函数来像搭积木一样构建行为,而这些行为建立了该领域的通用语言的模型。Debaish 声称 DDD 的一个原则就是将领域模型的词汇表上升到你的实现的高度,这样在整个系统生命周期里,这些功能就会变得更加明显。

Dean Wampler 在四月份的 React conference 上还做了一个主题类似的关于响应式设计(reactive design)和语言范式( language paradigms)的报告演讲。

查看英文原文: http://www.infoq.com/news/2014/05/functional-patterns-ddd


感谢杨赛对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2014-07-08 06:502109

评论

发布
暂无评论
发现更多内容

龙蜥开发者说:我眼里的龙蜥社区:一个包容的大家庭 | 第 10 期

OpenAnolis小助手

Linux 开源 操作系统 龙蜥开发者说 参与贡献

7 天能找到 Go 工作吗?学学 Go 数组和指针试试

梦想橡皮擦

Python 爬虫 8月月更

Meta项目功能测试 | 开启PrestoDB和Aria扫描优化

Alluxio

hive presto Alluxio 大数据 开源 8月月更

开源一夏 | 在 STM32L051 上使用 RT-Thread (三、无线温湿度传感器 之 I2C通讯)

矜辰所致

开源 RT-Thread 8月月更 STM32L051

【8.12-8.19】写作社区精彩技术博文回顾

InfoQ写作社区官方

优质创作周报

云图说丨初识可信分布式身份服务

华为云开发者联盟

云计算 安全 后端

字节一面:HTTPS 一定安全可靠吗?

程序员小毕

Java 程序员 面试 https 校招

数字知识库-知识图谱管理系统

金陵老街

Java 数字化 知识图谱 企事业系统

修筑产学研用一体化的通衢,从一场比赛背后瞭望苏州园区人才培养新范式

脑极体

一文带你认知定时消息发布RocketMQ

华为云开发者联盟

云计算 后端

九章云极DataCanvas公司与中国信通院完成可信AI基础软件战略合作

九章云极DataCanvas

人工智能 数据智能 数智化 可信AI

如何避免数据湖变成数据沼泽

Kyligence

数据湖 数据管理 智能多维数据库

打了15天,如何做到在容器权限上不失一分?

青藤云安全

容器安全 攻防演练

5分钟,带你看完24岁60W年薪架构师的简历,上面竟然写着精通JVM

收到请回复

Java JVM java面试 简历模板 金九银十

数据中台逼近炒作顶峰之际,Gartner给想建数据中台的一些建议

雨果

数据中台 Gartner

高效完成需求计划的四个关键 | 敏捷开发

LigaAI

Scrum 敏捷开发 Sprint LigaAI spring event

OpenHarmony有氧拳击之设备端开发

OpenHarmony开发者

OpenHarmony

什么是企业知识库?有什么作用?如何搭建?@附源码

金陵老街

Java、 企业数字化转型 spring-boot

基于RPC接口的业务侧流量回放

转转技术团队

测试工具 流量回放 测试方案

Web3.0 DAPP项目智能合约系统开发技术详情

开发微hkkf5566

开源一夏 | 在 STM32L051 上使用 RT-Thread (四、无线温湿度传感器 之 串口通讯)

矜辰所致

开源 RT-Thread 8月月更 STM32L051

前半个月的行动中,整个圈子都在疯传的“内网King”到底是个啥?

青藤云安全

网络安全 主机安全 攻防演练

SAP ABAP 和 Java 里的弱引用(WeakReference)和软引用(SoftReference)

Jerry Wang

Java 引用 SAP abap 8月月更

马拉车算法 (最长回文串 例题 密码截获)

Five

算法 8月月更

Python图像处理丨基于OpenCV和像素处理的图像灰度化处理

华为云开发者联盟

Python 人工智能 图像

优雅,永不过时!SpringBoot中这样编写Controller层代码,那叫一个完美

Java永远的神

Java 程序员 面试 程序人生 springboot

四个层次管好设备,为生产保驾护航

PreMaint

预测性维护 设备管理 设备预测性维护

ABAP 一组关键字 IS BOUND, IS NOT INITIAL 和 IS ASSIGNED 的用法辨析

Jerry Wang

指针 应用 SAP abap 8月月更

前端监控系列3 | 如何衡量一个站点的性能好坏

字节跳动终端技术

字节跳动 前端 性能监控 火山引擎 站点性能

博睿数据入选《2022爱分析· 银行数字化厂商全景报告》

博睿数据

银行 智能运维 博睿数据

一文搞懂EMAS Serverless小程序开发|电子书免费下载

hum建应用专家

Serverless emas

领域驱动设计中的函数模式_后端_Jan Stenberg_InfoQ精选文章