主要观点:
- 函数式编程语言有不可变对象,如 Haskell、Erlang 等,讨论的是 100%不可变语言,其中突变被消除。
- 不可变对象创建后不可更改,创建复合值前需集齐相关组件。
- 可变语言无需此规则,容易出现未初始化或无效对象。
- 函数式程序员抱怨常规命令式语言中的 nil/null 值会导致程序崩溃,而在 Go 中长时间未遇到 nil 指针异常,推测是因为遵循了一次构建有效对象的原则。
- 区分 null 值的不是其无效性,而是无法从编程语言认为有效的值中删除。
- 不构建无效数据可避免程序中的无效数据,强类型函数式语言能很好地做到,命令式语言也有工具可用于此,但通常较弱。
关键信息:
- 不可变对象特点及创建要求。
- 可变语言与不可变语言在对象创建上的差异。
- Go 中 nil 指针异常情况及推测原因。
- 对 null 值的深入理解。
- 构建有效对象对程序的重要性及实践难度。
重要细节:
- 不可变对象创建后新对象可创建但旧对象不可更改,如创建复合值前需集齐所有相关组件。
- 可变语言易出现未初始化或不符合特定定义的对象,且易在不经意间进入代码。
- 在 Go 中虽长时间未遇 nil 指针异常,但仍需与常遇此问题的人对比研究原因。
- null 值的特殊之处在于无法从编程语言的有效值中删除。
- 实践中重构代码以避免半构建对象很困难,虽能理解其危害但难以解释,从新代码开始更好,重构现有代码有难度且可能是导致重构困难的主要因素之一。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。