主要观点:全局变量不好,函数式编程能提供看待全局变量不好的视角,纯函数式编程完全消除突变不切实际,需将突变视为程序中的流动并在架构层面考虑,通过构建“突变围栏”(如“actor”)来控制突变。
关键信息:
- 全局变量会增加函数参数和复杂度,使程序难以理解和维护,如 Go 代码中全局变量对函数的影响。
- 函数式编程可将全局变量视为函数调用的额外参数,如在 Haskell 中常量值不算全局变量,真正工作的程序由更简单的组件组成。
- 突变并非瞬间摧毁程序,一开始成本较低,当过多突变状态集中时会出现问题,需通过构建围栏控制突变,如在邮件处理项目中用可插拔模块系统和限制突变的系统。
- 编程语言在微观层面(如突变控制)差异大,但宏观层面(如微服务架构)影响会减弱,良好设计的常规语言程序和函数式语言程序在高层突变流上可能相似。
重要细节:
- 学术上希望将编程语言函数转化为数学函数,只依赖输入和输出,如将
Greet
函数转化为接受消息和前计数并返回新计数和IOOperation
的函数。 - 纯函数式编程中,函数接收和输出的值明确,不会因外部可变值而改变,如
Haskell
中的increment
函数。 - 突变围栏如“actor”可限制突变,通过明确的消息交互防止复杂性爆炸,如在邮件处理项目中对邮件的处理。
- 编程时要考虑值突变的流动,不仅是“谁与谁通信”,还有“什么被突变、何时、为何”,如 Brooks 的观点。
- 不同语言在微观突变控制上有差异,如 Rust 控制突变,Erlang 需在 actor 间保持 immutability 等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。