use*_*590 2 null f# static-analysis scala code-contracts
在设计零安全代码时,更好的方法是什么?
F#和Scala具有封装null检查的Options类型,但我们也有代码契约,findbugs等静态代码分析工具.
对我来说,静态分析看起来有点清晰,那么Option/Maybe的原因是什么?特别是,什么使它更好地防止NullPointerExceptions/NullReferenceExceptions?
pad*_*pad 15
Option用于模拟计算可能返回值的事实.仅仅为了封装空检查不存在; 许多函数式编程语言,如SML,Haskell都没有,null但Option/Maybe作为建模问题的有用工具.
对我来说,静态分析看起来有点清晰,那么Option/Maybe的原因是什么?
在函数式编程的上下文中,使用静态分析来检查缺少值是否过度.静态类型检查可以做得很好(有Option).类型系统可以保证绝对正确,而静态分析工具可能有误报.
静态分析工具的另一个问题是成本高.构建它们需要花费很多(我不知道任何适用于F#和Scala的静态分析工具)并使用它们(软件购买,开发人员培训).不可否认,它们很强大,应该用于捕获更微妙的错误(静态类型检查器无法捕获),例如索引越界,整数溢出等.
Ran*_*ulz 11
Option是monadic.主要好处是透明地集成到monadic计算链中,通常使用for理解语法.
此外,我怀疑静态分析甚至可以在原则上消除了对一个值(的存在或不存在测试Some/ None区别).反正我的直觉是它等同于停止问题.
首先,静态分析只有在API被注释或完整源/字节码可用时才能工作.
如果你有一个API,但实现它的实际库将在运行时决定,静态分析是无能为力的.
另一方面,静态分析本质上是有限的.图灵完整性的局限性适用,这意味着它无法在所有情况下决定某些东西是否为空.
因此,这些都是静态分析的所有限制,不是由选项类型共享,但选项类型还有一个额外的优点:它们是monad.这意味着您可以使用它们进行计算,而如果仅限于检查可空性,则必须重复自己.
最后的陈述可能不清楚,但这是事情的本质:如果你了解如何使用monad,你不需要进一步的解释; 如果你不这样做,那么解释对你没有多大帮助.学习monad用法的最好方法是使用它 - 就像编程中的其他东西一样.
| 归档时间: |
|
| 查看次数: |
451 次 |
| 最近记录: |