知识卡片
延迟计算与光标是处理无限结构的两种等价方式
内容
描述一个可能无限长的序列,有两种等价处理方式:函数式语言用延迟计算,只在真正需要某个元素时才计算它,天然支持无限结构,但容易在不知不觉间写出永远无法终止的计算,因为终止条件常隐含在使用方式里;面向对象方式用光标(cursor)这种抽象数据类型,通过start/forth/item逐个访问元素,只要不提供表示到头的命令,同一套接口就能覆盖无限序列,且何时停止由调用方显式决定,不易掉进无限循环。
参考来源
- 位置:《架构之美》第13章《软件架构:面向对象与面向函数》13.3.4节《函数式的优势》(源文件:程序之美系列套装(6册)团队之美、项目管理之美、架构之美、数据之美、测试之美、安全之美/_epub-src/OEBPS/Text/part0260.xhtml)
- 结论依据:原文对比了延迟计算的正确性风险("这种可能出现无限循环的程序虽然容易编写,但它掩盖了确保其不会永远无法终止的困难")与Eiffel光标方案("只要去除finish和after命令即可"就能移植到无限序列)。
- 原始内容:这种可能出现无限循环的程序虽然容易编写,但它掩盖了确保其不会永远无法终止的困难……我们很容易将这种方式移植到无限序列中:只要去除finish和after命令即可(当然还有计算项目总数的count)。