契约式设计可以理解为正则编程的一种实践:

如果用我的三脚猫能力将这种实践方法形式化的话,大致如下(如有不正确处,请不吝指正):

1、对于方法Method的precondition & postcondition:

  Function(RegularMthod) =

    ^ RegularFunction

    ^ General-Class-Method

    ^ Assert(precondition)

    ^ Assert(postcondition);

  => f1( f2 ) { f1, f2 : RegularMethod }

    |-> Assert(f2.precondition) => Assert( f1.postcondition )

  当所有方法都满足上述条件的时候,那就意味着该程序的输入如果满足assert(precondition),那么它的输出也满足assert(postcondition),从而在逻辑上保证程序的正确性。这是针对方法调用或者函数调用上讲的,这个倒是可以在有函数或者过程的语言里面都可以实现。我个人理解为operation组合上的正则性(regularity)。

2、类Class的不变式Invariant:

  Class(InvariantClass) =

    ^ General-Class

    ^ Invariant : assert(invariant) when any method called.

  一个类的所有直接或者间接的子类都要满足它的不变式Invariant,从而保证该类及其衍生类在数据上保证正确性,个人理解为data组合的正则性。

综合上述两点,在operation 以及 data的组合上均实现了正则性,即面向对象上的正则性,从而在理论上保证了对象的正则性以及以对象构造出来的程序的正确

3、适当的DbC

  过犹不及。如果我们将每一个类都很详细地进行DbC,那也是一件很耗时、痛苦的没有必要的事情,正如你预防着小偷固然好,但是将除了自己之外的其他人都像防贼一样来防着也不合适一样。我们应该是适当地DbC。

  DbC更是一种思想,一种思维模式,为如何构造出高质量的软件指出一个道道来,它告诉我们,依如是法,达高质量的彼岸。如果在实践中运用则应当根据具体情况而定。

05-11 17:21