在近期的一次演讲中, 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 有时也难以决断到底应该使用哪种风格。
评论