haskell - 对于可靠的代码、NModel、Spec Explorer、F# 或其他?

标签 haskell specifications code-contracts nmodel asml

我有一个 C# 商业应用程序,带有单元测试。我可以通过使用 NModel 或 Spec Explorer 来提高可靠性并减少我的测试时间和费用吗?或者,如果我用 F#(甚至 Haskell)重写它,我会看到哪种(如果有)可靠性增加?

代码契约?阿斯麦?

我意识到这是主观的,并且可能是有争议的,所以如果可能的话,请用数据支持你的答案。 :) 或者也许是一个有效的例子,例如 Eric Evans Cargo Shipping System?

如果我们考虑

Unit tests to be specific and strong theorems, checked quasi-statically on particular “interesting instances” and Types to be general but weak theorems (usually checked statically), and contracts to be general and strong theorems, checked dynamically for particular instances that occur during regular program operation. (from B. Pierce's Types Considered Harmful),



这些其他工具适用于何处?

我们可以使用 Java PathFinder、Scala 等为 Java 提出类似的问题。

最佳答案

可靠性是几个变量的函数,包括软件的总体架构、程序员的能力、需求的质量以及配置管理和一般 QA 流程的成熟度。所有这些都会影响重写的可靠性。

话虽如此,语言肯定会产生重大影响。在所有其他条件相同的情况下:

  • 缺陷大致与 SLOC 计数成正比。更简洁的语言看到更少的编码错误。 Haskell 似乎需要 C++ 所需 SLOC 的 10% 左右,Erlang 大约 14%,Java 大约 50%。我想 C# 可能在这种规模上与 Java 并驾齐驱。
  • 类型系统不是平等的。具有类型推断功能的语言(例如 Haskell 和在较小程度上的 O'Caml)将具有较少的缺陷。特别是 Haskell 将允许您在类型系统中对不变量进行编码,以便程序仅在它们被证明为真时才能编译。这样做需要额外的工作,因此请根据具体情况考虑权衡。
  • 管理状态是许多缺陷的根源。函数式语言,尤其是纯函数式语言,避免了这个问题。
  • QuickCheck 及其相关产品允许您编写单元和系统测试来验证一般属性而不是单个测试用例。这可以大大减少测试代码所需的工作,特别是如果您的目标是高测试覆盖率指标。一组 QuickCheck 属性类似于正式的规范,这个概念非常适合测试驱动开发(首先编写测试,当代码通过它们时就完成了)。

  • 把所有这些东西放在一起,你应该有一个强大的工具包来在整个开发生命周期中提高质量。不幸的是,我不知道有任何有力的研究可以证明这一点。我在开始时列出的所有因素都会混淆任何真正的研究,并且在一个明确的模式出现之前你需要大量的数据。

    关于haskell - 对于可靠的代码、NModel、Spec Explorer、F# 或其他?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2767295/

    相关文章:

    css - 如何在我的 Haddock 文档中获得 "Style"菜单?

    .net-4.0 - 代码契约(Contract) - 假设与要求

    c# - 在引发事件的方法上编写代码契约

    c# - 使用 CodeContracts 强制正确实现 INotifyPropertyChanged - "requires unproven"

    java - Java .class 文件的最大大小是多少?

    haskell - 在 Haskell 中使用随机数显示整数算术时出现问题

    Haskell/GHC : Matching multiple unary constructors with the same pattern

    haskell - 我无法理解维基百科对 "applicative functor"的定义

    javascript - ECMAScript 中的 "positive"和 "negative"是什么意思? +0 和 -0

    javascript - 为什么 false++ 在 Firefox 中产生 SyntaxError 而在 Chrome 中产生 ReferenceError?