QCon 广州站2022已开启,三大关键词:数字化、国产化、云原生。戳此了解 了解详情
写点什么

使用函数式编程语言 F#编写 DDD 与 CQRS 应用

  • 2014 年 4 月 02 日
  • 本文字数:822 字

    阅读完需:约 3 分钟

在近期的一次演讲中, Lev Gorodinski 提出了一种观点,他认为对于领域驱动设计(DDD)来说,如果使用 F#这种函数式编程语言来代替 C#这种面向对象编程语言进行开发的话,能够带来两个额外的好处,这种方式不仅专注于行为,而且能够更多地使用声明方式来表现代码。讲座中使用的示例用到了包括事件溯源(Event Sourcing)和命令查询责任分离(CQRS)方面的技术。

Lev 在过去的一年中在 F#上投入了大量的精力,而在近 8 个月以来则完全专注于 F#。在讲座中,Lev 所介绍的示例是基于 Greg Young 最早提出 CQRS 时所编写的例子,这个修改后的示例展现了 F#的实现方式与 C#版本的不同,既体现出其优势也展现出难点所在。而如果转而使用传统的面向对象方式实现该示例的话会有一些问题,例如代码会显示非常冗长,并且领域实体会对事件溯源的实现方式产生依赖。

而使用 F#的方式,使用更少的代码反而能改进实现。去掉了许多样板代码之后,使整个代码实现不会显得那么冗长,而且能够更加显式地处理任务。F#代码更能够体现方法的实质,而且也没有隐藏的副作用。对 Lev 来说,使用 F#进行 DDD 开发的方式能够带来一些额外的好处,因为他能够专注于代码的行为,而不是将精力耗费在实现所必须的一些基础结构代码上,这同时也意味着抛弃了增删查改(CRUD)这种思考方式。F#方式使得代码表现得更为声明式,与其说是编写代码实现方法,不如说是定义了方法的规格,而由F#代码实现了这个规格。

Lev 也提到,这些额外的好处本质上是来源于 DDD 的天然优势,在 Eric Evans Vaughn Vernon 的两本关于 DDD 的书中分别都有列举。在 Lev 尝试 F#实现的过程中,他所遇到的一大挑战是对这种新编范式的应用。在开始阶段,他总是忍不住用 C#的风格去实现 F#代码。直到一段时间之后才克服了这种问题,并真正转换到函数式编程的风格。并且 F#本身既支持函数式编程也支持面向对象编程,这使 Lev 有时也难以决断到底应该使用哪种风格。

查看英文原文: DDD and CQRS Using the Functional Language F#

2014 年 4 月 02 日 01:491822
用户头像

发布了 428 篇内容, 共 159.4 次阅读, 收获喜欢 30 次。

关注

评论

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

吊打一切现有开源OCR项目:效果再升7%,速度提升220%

百度开发者中心

最佳实践 方法论 开源技术

我在 InfoQ 创作的思路规划

baiyutang

写作技巧 9月日更

【LeetCode】路径总和Java题解

HQ数字卡

算法 LeetCode 9月日更

OkHttp源码解读HTTP

Changing Lin

9月日更

IntelliJ IDEA 快速插入 for 循环

HoneyMoose

原来搭建淘客项目如此简单,app、web、小程序轻松搞定

Silently9527

Java uniapp 淘宝客开源

顶会CIKM'21论文解读:基于图神经网络的人类行为轨迹恢复模型

华为云开发者社区

图神经网络 华为云数据库 轨迹分析 CIKM PeriodicMove

贯穿全产业链做数字孪生产品,给你更好的选择

一只数据鲸鱼

数据可视化 工业4.0 制造业 数字孪生

腾讯云分布式数据库TDSQL再获认可,荣获“最佳保险数字化转型综合解决方案奖”

腾讯云数据库

数据库 tdsql

Java 8 及其后续版本的新遍历 forEach

HoneyMoose

Vue进阶(幺零幺):npm install -g 和 npm install --save-dev 的关系

No Silver Bullet

Vue 9月日更

Django 框架的神奇之处,几行代码就能自动入库,微型博客第 3 篇

梦想橡皮擦

9月日更

如何使用 GeoTrellis 和 React 构建地理处理应用程序

gisbook

GitHub spark Web GIS React

在智能运维中如何进行指标异常检测与分类?

云智慧AIOps社区

算法 场景应用落地 异常检测 智能运维 指标

华为云发布【云巢】智慧康养物联网加速器,加入立享多项扶持

华为云开发者社区

物联网 华为云 应用开发 云巢 智慧康养

多环境

程序员鱼皮

Java c++ Python 大前端 后端

测试金字塔,你在哪一层?

华为云开发者社区

软件测试 测试 软件质量 单元测试 华为云DevCloud

架构实战营 1 期模块 7 作业——业务异地多活架构

tt

架构实战营

如何修改 Discourse 的域名

HoneyMoose

基于 Apache APISIX,爱奇艺 API 网关的更新与落地实践

Apache APISIX 中国社区

Apache APISIX Meetup 爱奇艺 企业案例

【Flutter 专题】53 图解 BackdropFilter 高斯模糊

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 9月日更

腾讯安全李滨:腾讯云数据安全与隐私保护探索与实践

腾讯安全云鼎实验室

隐私保护 数据安全

架构实战营模块七-王者荣耀商城异地多活架构设计

hello

架构训练营

架构实战营模块七作业

maybe

腾讯云数据库TDSQL,新基建大潮下的弄潮儿

腾讯云数据库

数据库 tdsql

Redis集群docker部署

非晓为骁

redis Docker redis集群

在 Discourse 中如何使用输入对话框

HoneyMoose

使用 Jackson – 将字符串转换为 JsonNode 对象

HoneyMoose

手撸二叉树之二叉树的所有路径

HelloWorld杰少

9月日更

TLS协议分析 (八) 实现与开源项目

OpenIM

腾讯云为金融换“心“,TDSQL的发展历程和特性

腾讯云数据库

数据库 tdsql

使用函数式编程语言F#编写DDD与CQRS应用_函数式编程_Jan Stenberg_InfoQ精选文章