71.scala编程思想笔记——按契约设计
欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/50458775
源码下载连接请见第一篇笔记。
按契约设计(Designby contract,DbC)思想提出可以归功于Eiffel编程语言的创造者Bertrand Meyer,Scala从汲取了按契约设计的精神。按契约编程关注设计错误,它会验证参数和返回值在运行时是否与设计过程中确定的规则相一致。
Scala包含用作按契约编程工具的类似方法require和assume.
Require或assume的失败表示存在编程错误,意味着没有任何希望继续执行了,可以决定以最佳方式报告该错误并退出程序。
例如:
importcom.atomicscala.AtomicTest._
importutil.Try
classContractual {
def f(i:Int, d:Double) = {
require(i > 5 && i < 100,
"i must be within 5 and 100")
val result = d * i
assume(result < 1000,
"result must be less than1000")
result
}
}
deftest(i:Int, d:Double) =
Try(new Contractual().f(i, d)).recover{
case e => e.toString
}.get
test(10,99) is 990.0
test(11,99) is
"java.lang.AssertionError:" +
"assumptionfailed: " +
"resultmust be less than 1000"
test(0, 0)is
"java.lang.IllegalArgumentException:" +
"requirementfailed: " +
"imust be within 5 and 100"
前置条件通常会查看方法参数,在执行该方法体的主要部分之前,先效验它们是否在有效的或可接受的值集范围内。
后置条件正确情况下会检查方法调用的结果,并且会用assume方法对其进行测试,如果测试失败将抛出AssertionError.