yidabu 2007-4-26 16:02
21 D语言 契约式编程 Contract Programming
21 D语言 契约式编程 Contract Programming知识若不分享 实在没有意义 http://www.d-programming-language-china.org 20070425点击下面网址查看原文:http://www.d-programming-language-china.org by: uFramer D语言论坛 http://www.d-programming-language-china.org from: http://www.digitalmars.com/d/dbc.html version: 基于D 1.013 (Apr 19, 2007) 契约是减少大型项目成本的突破性技术。契约由先验条件、后验条件、错误和不变量等概念组成。契约可以而加到 C++ 中而无需对语言加以改造,但是却十分笨拙且不一致。 在语言内部支持契约的目的是: 给契约一个一致的观感 提供工具支持 使编译器能够根据从契约中收集的信息生成更好的代码 易于管理并强制实行契约 处理契约继承 契约的概念很简单——它只是必须为真的表达式。如若不然,契约就被违反,那么按照定义,程序中就一定有 bug 。契约构成了程序规格说明的一部分,只不过是从文档中挪到了代码中。就像每个程序员所知道的那样,文档通常是不完整的、过时的、错误的或者是不存在的。将契约挪到代码中就使得契约变得可对程序验证了。Assert Contract断言契约 最基本的契约是断言。 断言在代码内插入一个可检查的表达式,这个表达式在正常情况下必须为真: [Copy to clipboard] [ - ]CODE: assert(expression); C 程序员会有似曾相识的感觉。但是与 C 不同的是,函数体内的 assert 会抛出 AssertException ,这个异常可以被捕获并处理。如果代码必须处理其他代码对其的误用,如果代码必须是失败可证的,捕获契约违规就很有用,它同样也是调试的有力工具。Pre and Post Contracts契约先验条件和契约后验条件 契约先验条件指出语句执行的先验条件。最典型的用法可能要数验证函数参数的有效性了。契约后验条件验证语句的结果。最典型的用法要数验证函数返回值得合法性以及它的任何副作用。语法结构为: [Copy to clipboard] [ - ]CODE: in { ...契约先验条件... } out (result) { ...契约后验条件... } body { ...代码... } 按照定义,如果契约先验条件被违反,则过程体(body)将受到错误的参数。这将抛出一个 AssertError 异常。如果契约后验条件被违反,则意味着过程体中有一个 bug ,将抛出一个 AssertError 异常。( 本文出处: http://www.d-programming-language-china.org ) in 或 out 子句都可以被省略。如果过程体带有有 out 子句 ,变量 result 将被声明并被赋给函数的返回值。例如,我们实现一个求平方根的函数: [Copy to clipboard] [ - ]CODE: long square_root(long x) in { assert(x >= 0); } out (result) { assert((result * result) <= x && (result+1) * (result+1) >= x); } body { return cast(long)std.math.sqrt(cast(real)x); } in 和 out 中的断言叫做 契约。其中可以出现任何 D 的语句或者表达式,但是必须要保证这些语句没有副作用,并且最终发行版中的代码不依赖于这些代码的作用。在构建发行版的程序时,这些代码将不会包括在其中。 如果函数返回 void,即没有结果,那么 out 子句中自然也没有 result 的声明。在这种情况下,使用:( 本文出处: http://www.d-programming-language-china.org ) [Copy to clipboard] [ - ]CODE: out { ...contracts... } body { ... } void func() 在 out 语句中,result 被初始化并设为函数的返回值。In, Out and Inheritance 如果派生类的函数重写了父类中的一个函数,那么它只须满足基类函数的一条 in 契约。重写函数 放松 了契约。 A function without an in contract means that any values of the function parameters are allowed. This implies that if any function in an inheritance hierarchy has no in contract, then in contracts on functions overriding it have no useful effect. 反过来,所有的 out 契约都必须满足,所以重写函数 收紧 了 out 契约。( 本文出处: http://www.d-programming-language-china.org )Class Invariants类不变量 类的不变量用来指定类中总是为真(除了在执行成员函数时)的特性。它们在 类 中介绍。References引用 Contracts Reading List http://people.cs.uchicago.edu/~robby/contract-reading-list/ Adding Contracts to Java http://pandonia.canberra.edu.au/java/contracts/paper-long.html( lastupdate:20070426 最新文章请访问http://www.d-programming-language-china.org )关于一大步成功社区:yidabu提倡在交流中学习,在分享中提高收集感兴趣的知识,写下心得,通过网络与别人一起分享理解一点就实践一步,收获什么就分享什么,成功就是这样一点点一步步累积起来的网络只是一个工具,只有自己身心提高才是实实在在的。d-programming-language-china.org为大家提供一个学习交流各种知识的平台