首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >代码合同福利

代码合同福利
EN

Stack Overflow用户
提问于 2014-04-23 07:09:12
回答 2查看 4K关注 0票数 17

为什么我要使用代码契约,比如

代码语言:javascript
复制
Contract.Requires<ArgumentNullException>( x != null, "x" );

而不是美好的旧

代码语言:javascript
复制
if (x!=null){}
else throw...

除了简洁,还有其他好处吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-23 07:11:39

根据MSDN

代码合同的好处包括:

  • 改进的测试:代码契约提供静态契约验证、运行时检查和文档生成。
  • 自动测试工具:您可以使用代码契约来生成更有意义的单元测试,方法是筛选出不满足先决条件的无意义的测试参数。
  • 静态验证:静态检查程序可以在不运行程序的情况下决定是否有违反合同的行为。它检查隐式契约,例如空退出和数组边界,以及显式契约。
  • 参考文档:文档生成器使用合同信息增强现有的XML文档文件。还有一些样式表可以与Sand城堡一起使用,这样生成的文档页面就有契约部分。

你的里程可能会不同,其中哪些点重要,哪些不重要。我发现第三和第四(静态验证和文档)特别有趣。

换句话说,它是更结构化的描述契约的方式(而不是像if (x!=null){}这样的构造),这是其他工具能够理解的。

票数 15
EN

Stack Overflow用户

发布于 2014-04-23 08:26:53

除了语法糖,代码契约是微软的“按合同设计”范式的工具。合同

在设计类和操作时,它基本上是一种不同的思维方式。从经验来看,DbC在测试驱动开发中工作得非常好,在编写任何业务逻辑之前,您基本上定义了契约并编写了测试。

在幕后,契约契约在编译时生成类似于好的旧代码的代码,因此IL代码包含所有检查。

例如,类

代码语言:javascript
复制
public class Scheduler
{
    public bool ScheduleTask(string taskname, DateTime startTime, DateTime endTime)
    {
        Contract.Requires(!string.IsNullOrWhiteSpace(taskname));
        Contract.Requires(startTime != null);
        Contract.Requires(endTime != null);
        return true;
    }
}

会导致这样的结果

代码语言:javascript
复制
public bool ScheduleTask(string taskname, DateTime startTime, DateTime endTime)
{
    __ContractsRuntime.Requires(!string.IsNullOrWhiteSpace(taskname), null, "!string.IsNullOrWhiteSpace(taskname)");
    __ContractsRuntime.Requires(true, null, "startTime != null");
    __ContractsRuntime.Requires(true, null, "endTime != null");
    return true;
}

其中_ContractsRuntime.Requests看起来如下所示

代码语言:javascript
复制
internal static void Requires(bool condition, string msg, string conditionTxt)
{
    if (!condition)
    {
        __ContractsRuntime.ReportFailure(ContractFailureKind.Precondition, msg, conditionTxt, null);
    }
}
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23237267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档