知识卡片

强类型防止代价高昂的单位混淆

普通读书笔记卡 · 1457.d

内容

用普通数字表示时长、重量这类带单位的量,编译器完全看不出30这个数字到底是秒还是分钟,这类错误可能只是无害的小bug,也可能像1983年加拿大航空143号航班那样因磅和千克换算错误导致燃油不足迫降,或像1999年火星气候轨道器那样因英制单位和公制单位不统一,让1.25亿美元的探测器损毁。把”时长”“重量”这类概念包装成独立的强类型,只允许有意义的操作并内置单位换算,能在编译期而不是灾难发生后暴露这类错误。

参考来源

- 位置:《Google系统架构解密:构建安全可靠的系统》第12章《编写代码》12.5.2节使用强类型(源文件:`../OREILY动物书合辑 图灵新版/_epub-src/text/part0014_split_102.html`) - 结论依据:原文以加拿大航空143号航班因磅千克换算错误紧急迫降、火星气候轨道器因英制公制单位不统一导致探测任务失败为例说明计算单位混淆的严重后果,并给出解决办法是"使用强类型:它们可以封装成单元,并且只表示抽象概念,如时间戳、时间段或权重"。 - 原始内容:1983年7月23日,加拿大航空143号班机由于油量计算错误(使用磅而非千克作为计量单位),只携带了所需容量一半的燃油,不得不紧急迫降……1999年9月23日,价值1.25亿美元的火星气候轨道器出现故障,导致探测任务失败……上述问题的解决办法是使用强类型。