【发布时间】:2013-02-05 05:33:23
【问题描述】:
在设计一段 null 安全代码时,更好的方法是什么?
F# 和 Scala 有封装 null 检查的 Options 类型,但我们也有静态代码分析工具,如代码协定、findbugs。
对我来说,静态分析似乎更干净一些,那么 Option/Maybe 的原因是什么?特别是在防止 NullPointerExceptions/NullReferenceExceptions 方面有什么更好的方法?
【问题讨论】:
-
嗯,首先,什么是选项类型?它如何与模式匹配和
for一起使用? (选项不是关于“发现错误”,而是关于以一致的方式正确对问题建模;null 是 an unfortunate side-effect of ALGO 和 Java/JVM 借用的不幸方面,因此是 Scala。)跨度> -
我不认为这是一个“坏”的问题,但我认为它设置了不恰当的二元性。使用 Option/Maybe 并不排除其他工具;就像不排除测试一样。
-
@pst null 也是一种非常有效的方式来声明指针类型在任何允许接近硬件层的语言(汇编程序、C、C++)中无效,可能还有更多)。如果每个原始数字类型也都有一个空值,那就太好了,比如 Double.NAN。
-
@ziggystar 我不同意。如何“null”在内部处理为没有公开它的语言(即语言only有可能代表像Haskell一样的“某事或无事”)是一个实现细节.例如,Java 实现使用 pointers,但 Java 中没有指针!没有理由必须“效率较低”。此外,案例 C# 显示,可以以最小的开销在原语上创建 Nullable 类型:但 .NET Nullable 类型不像 Option/Maybe 那样统一。
-
@ziggystar 在这一点上,每一个具有 null 的“现代高级语言”都是没有解决这个问题的基本思想的结果。这就是 ALGO 的工作方式。这就是 C 的工作方式。这就是 Java 的工作方式。这就是 C# 的工作方式。它不意味着这是最好的方法;它只是意味着它已经永久化了。
标签: scala f# null static-analysis code-contracts