在阅读DDD巨著《Patterns, Principles, and Practices of Domain-Driven Design》的过程当中,Scott在第5章提到了使用函数式编程语言配合贫血模型去实践DDD的一种思路,这激发了个人无限遐想。html
在软件开发领域,咱们已经拥有了许多的抽象方法论和大量的实现技术。但我我的认为,这一切归根结底,都是人类思惟在软件开发领域的具体表达方式。而人类在认识和分析软件所要解决的业务领域问题时,思考的内容不外乎由两个部分组成:『业务流程』与『业务规则』。前者,回答了业务活动中先作什么后作什么的问题;后者,则回答了遇到什么状况时应该怎么作的问题。二者结合后,获得咱们须要的业务结果,或者叫做“实现业务目标”。java
再想一想目前学习和掌握的面向对象的一系列方法,又是如何将上述思惟结果映射到软件中去的呢?我认为是这样的:git
而后,我认为,对于复杂业务规则的梳理,能够象数学概括法同样进行演绎:假设一个函数y=f(x)
,给定x的定义域,肯定y的值域。特别是在排列组合等方面的一些问题,也常常采用递归的方式来解决。因此,从这个角度讲,函数式编程更贴近人类思惟习惯,因此让我天然而然地把目光转向了它。github
在选择具体的函数式编程语言时,我首先想到的是它最好是同时能支持面向对象编程的。由于即使LISP做为函数式编程语言的先祖,诞生已长达半个世纪,但单纯的函数式编程语言与面向对象编程语言相比,在抽象领域概念、组合系统模块、实现信息隐蔽等方面存在必定的差距,因此一直没有成为软件开发的主流。正则表达式
信息隐蔽原理:在西安电子科大蔡希尧与陈平老师于1993年合做出版的《面向对象技术》一书中是这样描述的:把需求和求解的方法分离;把相关信息——数据结构和算法,集中在一个模块之中,和其余模块隔离,它们不能随便访问这个模块内部的信息。算法
其次,因为个人语言路线是从Pascal → C → C++ → C#,因此我但愿能选择一种风格近似于C、强类型的函数式编程语言。在比较了F#、R、ErLang等几种常见的函数式编程语言以后,我最终选择了Scala。编程
注:如下内容,节选翻译或参考自《Programming in Scala》第1章、第3章,《Programming Scala》第6章,不算完整意义上的我的心得。设计模式
y=f(x)
,给定x一定获得y,不会所以产生二义结果。所以不管对于代码测试仍是并发,因为给定输入一定获得预期输出,而不受其余因素干扰,因此能有效减小Bug产生。说了那么多,个人根本目的仍是要将Scala做为实现DDD的主要武器。那么试想一下,Scala在咱们实现DDD的过程当中能有哪些帮助呢?我暂且胡侃乱诌以下:数据结构
val
以及case class
表示,在语法层面就直观地代表是不可修改的。Unit
)对应CQRS里的Query,保证类的方法没有反作用;用Procedure(返回类型为Unit
)对应CQRS里的Command,明确代表这一类方法会产生修改状态等反作用。这一样从语法层面就能对两者进行明确区分。def sum_count(ints:Seq[Int) = (ints.sum, ints.size)
这样一个函数后,咱们能够这样调用,以获得一个1至6的整数序列的整数值合计,及该序列的尺寸: val(sum, count) = sum_count(List(1, 2, 3, 4, 5, 6))
。retire = (Age >= 60) || (ServiceLength >= 30)
。以往的方式是本身写一个语法解析器,把这条文本转换成相应的Specification对象,而后扔给聚合去使用。如今有了Scala的帮助,就使编写语法解析器这一环节的工做量大大减小。val circuit = new Circuit with Adders with Multiplexers with Flipflops with MultiCoreProcessors
这样就建立了一个带有加法器、乘法器、触发器和多核处理器的元件。implicit
为实现数据类型的方法扩展提供了便捷,成为Trait以外的另外一个功能扩展手段。如下是我目前主要的学习资料,并衷心欢迎各位留言补充。闭包
最近读的书不少也很杂,DDD、BDD、Scala、Cucumber以及Java基础等等都有涉及,真巴不得一口吃成个大胖子。因为时间和精力有限,因此如今知识消化很成问题,迟迟没有进入学以至用的环节,只能先这样纸上谈兵了,好歹先把本身在学习过程当中的一些思考、看到的好东西先记载下来,以备未来之需。