契约式编程

转载 2015年11月17日 16:15:45
契约是减少大型项目成本的突破性技术。契约由先验条件、后验条件、错误和不变量等概念组成。契约可以而加到 C++ 中而无需对语言加以改造,但是却十分笨拙且不一致。

在语言内部支持契约的目的是:

  1. 给契约一个一致的观感
  2. 提供工具支持
  3. 使编译器能够根据从契约中收集的信息生成更好的代码
  4. 易于管理并强制实行契约
  5. 处理契约继承
 契约的概念很简单——它只是必须为真的表达式。如若不然,契约就被违反,那么按照定义,程序中就一定有 bug 。契约构成了程序规格说明的一部分,只不过是从文档中挪到了代码中。就像每个程序员所知道的那样,文档通常是不完整的、过时的、错误的或者是不存在的。将契约挪到代码中就使得契约变得可对程序验证了。

断言契约

最基本的契约是断言。 断言在代码内插入一个可检查的表达式,这个表达式在正常情况下必须为真:
	assert(expression);
C 程序员会有似曾相识的感觉。但是与 C 不同的是,函数体内的 assert 会抛出 AssertException ,这个异常可以被捕获并处理。如果代码必须处理其他代码对其的误用,如果代码必须是失败可证的,捕获契约违规就很有用,它同样也是调试的有力工具。

契约先验条件和契约后验条件

契约先验条件指出语句执行的先验条件条件。最典型的用法可能要数验证函数参数的有效性了。契约后验条件验证语句的结果。最典型的用法要数验证函数返回值得合法性以及它的任何副作用。语法结构为:
	in
	{
	    ...契约先验条件...
	}
	out (result)
	{
	    ...契约后验条件...
	}
	body
	{
	    ...代码...
	}
按照定义,如果契约先验条件被违反,则过程体(body)将受到错误的参数。这将抛出一个 InException 异常。如果契约后验条件被违反,则意味着过程体中有一个 bug ,将抛出一个 OutException 异常。

 in 或 out 子句都可以被省略。如果过程体带有有 out 子句 ,变量 result 将被声明并被赋给函数的返回值。例如,我们实现一个求平方根的函数:

	long square_root(long x)
	    in
	    {
		assert(x >= 0);
	    }
	    out (result)
	    {
		assert((result * result) == x);
	    }
	    body
	    {
		return math.sqrt(x);
	    }
in 和 out 中的断言叫做 契约。其中可以出现任何 D 的语句或者表达式,但是必须要保证这些语句没有副作用,并且最终发行版中的代码不依赖于这些代码的作用。在构建发行版的程序时,这些代码将不会包括在其中。

如果函数返回 void,即没有结果,那么 out 字句中自然也没有 result 的声明。在这种情况下,使用:

	void func()
	   out
	   {
		...契约...
	   }
	   body
	   {
		...
	   }
在 out 语句中,result 被初始化并设为函数的返回值。

编译器可以设计为每个 in 和 inout 参数都在 in { } 中被引用,并且每个 out 和 inout 参数都在 out { } 中被引用。

in-out 语句也可以被用在函数内部,例如,可以用来检查循环的结果:

	in
	{
	    assert(j == 0);
	}
	out
	{
	    assert(j == 10);
	}
	body
	{
	    for (i = 0; i < 10; i++)
		j++;
	}
这个特性目前尚未实现。

In,Out和继承

如果派生类的函数重写了父类中的一个函数,那么它只须满足基类函数的一条 in 契约。重写函数 放松 了契约。

反过来,所有的 out 契约都必须满足,所以重写函数 收紧 了 out 契约。

类不变量

类的不变量用来指定类中总是为真(除了在执行成员函数时)的特性。它们在  中介绍。.

参考书目

契约推荐书目
让 Java 支持契约

WebService——通过契约优先开发webservice

一、基本概念 有代码优先和契约优先两种开发webService的方式,本例介绍契约优先的webService。 编写WSDL有三种方式:基于document的Wrapper方式,基于document的...
  • woshixuye
  • woshixuye
  • 2013年11月04日 07:18
  • 3251

WCF契约之---服务契约 、数据契约、 消息契约

服务契约 描述了暴露给外部的类型(接口或类)、服务所支持的操作、使用的消息交换模式和消息的格式。每个WCF服务必须实现至少一个服务契约。使用服务契约必须要引用命名空间System.ServiceMod...
  • Percy__Lee
  • Percy__Lee
  • 2015年09月17日 13:59
  • 1404

【分享】肉体契约書 汉化硬盘版+汉化1.1补丁,日语1.0和1.1补丁(带镜像版)

游戏名称:肉体契约书 开发商:FULLTIME 发售日期:2011-12-22 TAG:ADV 3D 调教 过激。 汉化硬盘版加上反和谐补丁和日语原版1.0和1.1补丁。. 游戏介绍 就业形势...
  • wangzi867258173
  • wangzi867258173
  • 2014年07月07日 18:35
  • 11599

PHP契约式编程

抽象类 当类中有一个方法为抽象方法,该类就应该定义为抽象类 例: name=$name;           $this->speed=$speed;      }           ...
  • lixinxin65535
  • lixinxin65535
  • 2014年05月16日 09:46
  • 488

wcf之二(接口契约式编程思想)

wcf接口契约式编程思想
  • jielizhao
  • jielizhao
  • 2015年01月26日 10:37
  • 737

.NET 4.0 中的契约式编程

契约式编程不是一门崭新的编程方法论。C/C++ 时代早已有之。Microsoft 在 .NET 4.0 中正式引入契约式编程库。博主以为契约式编程是一种相当不错的编程思想,每一个开发人员都应该掌握。它...
  • huyu107
  • huyu107
  • 2016年04月13日 16:53
  • 222

浅谈契约式编程1

浅谈契约式编程 契约式编程是编程的一种方法。那么什么是契约式编程呢?我想这个概念是从“合同”演变过来的。...
  • yunfeiyang62
  • yunfeiyang62
  • 2015年09月16日 10:42
  • 189

契约式编程

契约是减少大型项目成本的突破性技术。契约由先验条件、后验条件、错误和不变量等概念组成。契约可以而加到 C++ 中而无需对语言加以改造,但是却十分笨拙且不一致。 在语言内部支持契约的目的是: ...
  • cjsycyl
  • cjsycyl
  • 2011年04月05日 16:56
  • 333

关于契约式编程的一些事情

契约式编程是编程的一种方法。那么什么是契约式编程呢?我想这个概念是从“合同”演变过来的。 在人类的社会活动中,契约一般是用于两方,一方(供应者)为另一方(客户)完成一些任务。每一方都期待从契约中获得...
  • qq_27376871
  • qq_27376871
  • 2016年05月18日 17:50
  • 197

.NET4.0新特性之-契约式设计

  • 2009年12月26日 15:31
  • 8.96MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:契约式编程
举报原因:
原因补充:

(最多只允许输入30个字)