Specification: Programming for communication
specification
输入/输出的数据类型
功能和正确性
性能
只讲“能做什么”,不讲“怎么实现”
behavioral equivalence(行为等价性)
站在客户端角度看行为等价性
根据规约判断行为是否等价
两个函数符合这个规约,故它们等价
规约结构(前置条件、后置条件)
前置条件:对客户端的约束,在使用方法时必须满足的条件,使用关键字requires
后置条件:对开发者的约束,方法结束时必须满足的条件使用关键字effects
契约:如果前置条件满足了,后置条件必须满足
静态类型声明是一种规约,可据此进行静态类型检查static checking
方法前的注释也是一种规约,但需人工判定是否满足
@param,@return,@throws
Specifications for mutating methods
除非在后置条件里声明过,否则方法内部不应该改变输入参数
设计规约
分类规范
规约的确定性、陈述性、强度used to judge which specification is better
如果规范变强(前置条件变弱,后置条件变强),那么就可以替代之前的规范
Deterministic vs. underdetermined specs
确定的规约:给定一个满足precondition的输入,其输出是唯一的、明确的
欠定的规约:同一个输入可以有多个输出
非确定的规约:同一个输入,多次执行时得到的输出可能不同
声明式规约和操作式规约
操作式规约:例如伪代码
声明式规约:没有内部实现的描述,只有初末状态