函数响应式领域建模(一)
函数式编程
函数式编程是基于函数的组合:通过组合函数作为语言的头等产物来建立抽象,在函数式编程中不用再包含一个可变的状态,而是每次状态的改变都创建一个新的类来承载自己的状态,这样就没有共享的可变的状态了
函数化的思想就是接收一个输入然后生成一个输出,不再依赖或者影响可变状态(就是不再有可变的属性),也就是说一个固定的输入得到的永远是固定的输出,然而如果函数依赖于输入的东东的内部的某个可变的状态,或者与外界的系统进行交互,那么在并发或者别的情况下,一个固定的输入可能得到不同的输出,包括可能会产生异常,对于这样的函数我们往往称为副作用函数,并尽量少地让它们存在于领域代码中
正是由于上述函数的不变性,我们可以很方便的通过告诫函数如map foreach等来组合这样的不变函数,并对于领域逻辑进行数学上的推导
响应式建模
从一定角度上来看,响应式建模更多的是一些原则上的东西,它们是一些为了让用户尽快地得到响应而产生的最佳实践
响应式三大原则
- 弹性(积极响应失败情况,面向失败设计)
- 伸缩性(在不同负载的情况下保持良好的响应能力)
- 消息驱动(为确保弹性以及伸缩性,系统必须保证松耦合并通过使用异步消息将阻塞最小化)
函数式遇上响应式
响应式模型可以帮助代码良好地模块化,这样不同的事件处理者可以独立运行,并且用执行领域行为的方式工作。只有当事件之间没有或只有极少的共享状态时,才可以独立的运行处理。函数式编程从一开始就鼓励这种实践。用纯函数(没有副作用的函数)做设计,从纯逻辑中分离副作用。纯函数将扮演事件处理器,它们可以并发执行领域逻辑,使模型保持响应性和弹性
总结
- 在模型内避免共享可变的状态
- 建模应该聚焦在核心领域
- 对于响应式建模来说,纯函数是理想的候选人,可以在并行配置下对它们进行自由分布,而不用担心需要管理可变共享状态
- 针对失败进行设计,将失败管理作为独立的内容来思考,而不要将异常处理和业务逻辑代码混杂在一起
- 用基于事件的建模来补充函数式模型,事件是小型的消息(响应式),它指出我们想做的“是什么”,而事件处理者(函数式),描述的则是“如何做”