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

ja.*_*ja. 4 haskell specifications asml code-contracts nmodel

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

代码合同?ASML?

我意识到这是主观的,可能是议论性的,所以如果可能的话,请用数据备份你的答案.:)或者也许是一个有用的例子,比如埃里克埃文斯货运系统?

如果我们考虑

单元测试是特定的和强定理,在特定的"有趣实例"上准静态检查,类型是一般但弱定理(通常是静态检查),并且是一般和强定理的契约,动态检查在发生期间发生的特定实例正常的程序操作.(来自B. Pierce的类型被认为是有害的),

这些其他工具在哪里适合?

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

Pau*_*son 5

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

话虽如此,语言肯定会产生重大影响.所有其他条件相同:

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

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