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

阅读数:1049 2014 年 4 月 2 日

话题:函数式编程语言 & 开发架构

在近期的一次演讲中,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 EvansVaughn Vernon的两本关于 DDD 的书中分别都有列举。在 Lev 尝试 F# 实现的过程中,他所遇到的一大挑战是对这种新编范式的应用。在开始阶段,他总是忍不住用 C# 的风格去实现 F# 代码。直到一段时间之后才克服了这种问题,并真正转换到函数式编程的风格。并且 F# 本身既支持函数式编程也支持面向对象编程,这使 Lev 有时也难以决断到底应该使用哪种风格。

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