阶级不变量如何加强前后条件?

时间:2013-05-02 17:20:27

标签: domain-driven-design design-by-contract invariants preconditions post-conditions

Link

  

您可以将类不变量视为健康标准,必须这样做   由操作之间的所有对象来完成。作为前提条件   因此,可以假设该类的每个公共操作   类不变量持有。另外,它可以假设为a   班级不变的每个公共操作的后置条件   成立。从这个意义上讲,阶级不变量就是一般的   加强前提条件和后提条件   班上的公共运作。有效的前提条件是   与类不变量一起制定前置条件。   同样,有效的后置条件是制定的   后置条件与类不变量一起使用。

public class Server
{
     // other code ommited
    public Output Foo(Input cmdIn)
    {
        ...
        return cmdOut;
    }
}


public class Caller
{  
    // other code ommited

    /* calls Server.Foo */
    public void Call()
    {...}
}

public class Input
{
    // other code ommited

    public int Length
    {...}
}

public class Output
{
    // other code ommited

    public int Length
    {...}
}

1。如果在Server类上定义类不变

a)前提条件通常根据被调用操作的形式参数来表示,那么类不变如何加强方法(Foo先决条件

b)后置条件是根据被调用方法的返回值制定的,那么类不变如何加强方法(Foo 's)后置条件

2。 Caller课程中定义的类不变式可以加强Foo前置条件或者后置

3。如果在Foo的{​​{1}}参数中定义类不变

a)如果cmdIn上的前置条件表明FoocmdIn.Length范围内,但类不变量中的一个定义在<{1}}上1-20指出Input应该在Input.Length范围内,然后2-19前置条件确实会加强?

b) a)中的逻辑是否有点缺陷,因为如果 class invariant 已经声明Foo应该在范围{{1}内那么Input.Length定义前置条件并不总是2-19Foo无法保存值{{}} {1}}或true

c)但如果cmdIn.Length上定义的类不变量表明1应该在20范围内,那么Input先决条件没有加强?

d)Input.Length上定义的类不变量能否以某种方式加强0-100后置条件

4。如果在<{1>}的返回值

上定义类不变

a)如果Foo上的后置条件指出cmdInFoo范围内,但类不变量中的一个定义了Foo指出Foo应该在cmdOut.Length范围内,然后1-20后置条件确实会加强?

b)但如果在Output上定义的不变量表明Output.Length应该在2-19范围内,则Foo后置条件不是'加强?

c)Output上定义的类不变量能否以某种方式加强Output.Length前置条件

5。但我得到的印象是引用的文章意味着仅仅通过拥有类不变(即使这个不变不以任何方式(直接或间接)操作0-100的参数和/或返回值,它仍会加强Foo前提条件后置条件?如果那是文章实际意味着什么,那怎么可能?

感谢

1 个答案:

答案 0 :(得分:2)

  

a)先决条件通常根据形式来制定   被调用的操作的参数,所以类如何不变   加强方法(Foo)的先决条件?

我怀疑这是你误解的关键。前提条件可能包括正式参数 - 但不限于此。他们可以 - 通常也 - 也可以引用类功能(属性/操作)。通常,不变量和前置条件的组合定义了一组约束,在操作被强制满足其后置条件时必须满足这些约束。类似地,操作必须保证在完成时满足其post条件和任何不变量。以有界缓冲区为例:

Class BoundedBuffer<T> {
   public int max    // max #items the buffer can hold
   public int count  // how many items currently in the buffer

   void push(T item) {...}
   T    pop() {...}
}

push()的前提条件是缓冲区尚未达到其最大大小:

 pre: count < max

所以这里的前置条件甚至没有提到操作的形式参数。我们还可以为缓冲区声明一个不变量:

inv: count >=0  //can't have -ve number of elements in the buffer

它强化了前提条件,因为它在push()操作必须满足其后置条件之前,它必须是真实的。这两个条款在逻辑上是一致的。所以有效的前提条件是count >=0 AND count < max。这比单独的前置条件更强(更具限制性)约束。

注意,概念不限于前置条件引用类特征的情况。让我们添加一个约束,即添加到缓冲区的任何单个项目的大小必须小于某个上限:

pre: count < max AND item.size() <= MAX_ITEM_SIZE

添加不变量仍然可以增强有效的前提条件:

pre: count < max AND item.size() <= MAX_ITEM_SIZE AND count >=0

总结:在调用操作之前和操作完成之后,不变量必须保持不变。因此他们加强了两者。

  
      
  1. 可以以任何方式在Caller类上定义的类不变量加强Foo的前置条件或后置条件吗?
  2.   

没有。不变量仅适用于它们定义的类。

从上面逻辑上回答你剩下的问题。

第h