什么是契约式设计

在编写一个方法时,我们常常会在方法的入口处增加许多判断,从某种意义上来说,这就是一种最朴素的契约式设计。契约式设计(DbC)核心就是“规范与检查”。其主要由以下三个方面构成:

  • 前置条件:调用方法之前需要满足的条件
  • 后置条件:方法顺利执行完成之后需要满足的条件
  • invariant:该类的实例调用任何方法时都必须为真的条件

简单的逻辑关系是:用户在调用方法之前,确保其参数满足一定的条件,类负责确保用户获得其想要的结果。此处参数需要满足的条件分两种情况:

  1. 创建一个类的实例。在此过程中,只需要确保前置条件满足;
  2. 调用一个已经存在的实例的方法。需要确保前置条件以及invariant同时满足。

DbC与继承的关系

DbC与断言的不同?

个人认为可以通过断言实现DbC,但是两者绝对不是等同的概念。DbC是可以继承的,而断言无法继承。

如果一个基类拥有前置条件p0,后置条件q0,那么其子类的前置条件以及后置条件应该满足什么样的性质?

  1. 继承之后的前置条件只能保持不变或者弱化;
  2. 继承之后的后置条件只能不变或者增强。