3

LinkКак класс инвариант усиливает pre и post-conditions?

Вы можете думать о классе инварианта в качестве критерия здоровья, которые должны быть выполнены всеми объектами между операциями. В качестве предварительного условия каждой публичной операции класса, можно предположить, что инвариант класса имеет место. Кроме того, это можно считать постулатом каждой публичной операции, которую придерживается класс-инвариант . В этом смысле классовый инвариант служит общим основанием для усиления как предпосылки, так и постусловия публичных операций в классе . Эффективным предварительным условием является сформулированное предварительное условие в сочетании с инвариантом класса. Аналогичным образом, эффективным постусловием является сформулированное условие в сочетании с инвариантом класса.

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 класса:

а) Предпосылками обычно формулируется в терминах формальных параметров вызываемой операции, так как может класс инвариант усиление метода (Foo) Предпосылки?

б) Постусловия формулируется в терминах возвращаемого значения вызываемого метода, так как может инвариант класса укрепление методы (Foo iS) Постусловия?

2. Может инвариант класса определен на Caller класса в любом случае усилить Foo «s предпосылки или постусловий?

3. Если инвариант класса определяется на Foo «s cmdIn параметра:

а) Если Предпосылкой на Foo состояний, cmdIn.Length находится в пределах диапазона 1-20, но один из класса инвариантов определены на Input говорится, что Input.Length должен находиться в пределах диапазона 2-19, затем Fooпредварительное условие действительно был прочным?

б) не логика в а) немного некорректной, так как если инвариант класса уже утверждает, что Input.Length должны находиться в пределах диапазона 2-19, это не то ошибка для Foo определить предпосылку который не всегда может быть true (cmdIn.Length не может содержать значения 1 или 20)

с) Но если инвариант класса определен на Input утверждает, что Input.Length сек может быть в пределах диапазона 0-100, затем Foo's предварительное условие не усилено?

d) Может класса инварианты определены на cmdIn также каким-то образом усилить Foo «s Постусловие?

4. Если инвариант класса определяется по значению возврата Foo «s

а) Если Постусловие на Foo утверждает, что cmdOut.Length находится в диапазоне 1-20, но один из класса инвариантов определенный в Output, гласит, что Output.Length должен находиться в пределах диапазона 2-19, затем Foo's постусловие действительно укреплялось?

б) Но если инвариант определен на Output утверждает, что Output.Length должны находиться в пределах диапазона 0-100, то Foo «s Постусловие не укрепить?

с) Может класса инварианты определены на Output также каким-то образом усилить Foo «s Предпосылкой?

5. Но я получаю впечатление, что цитирует статью хотел сказать, что просто имея инвариант класса (и даже если это инвариант не каким-либо образом управлять (прямо или косвенно) на Foo «s параметры и/или возвращаемого значения, было бы еще усилить Foo» s предпосылки и постусловие? Если это то, что статья на самом деле подразумевает, как это возможно?

благодаря

ответ

2

а) Предпосылки, как правило, формулируется в терминах формальных параметров вызываемой операции, так как можно инвариант класс укрепления() предпосылок Foo метода используется в?

Я подозреваю, что это ключ к вашему недоразумению. Предварительные условия могут включать формальные параметры, но не ограничиваются ими. Они могут - и часто - также ссылаются на функции класса (атрибуты/операции). В общем случае комбинация инвариантов и предварительное условие определяет набор ограничений, которые должны быть выполнены до того, как операция будет обязана выполнять свое пост-условие при вызове. Точно так же операция должна гарантировать, что как ее состояние сообщения, так и любые инварианты будут выполнены, когда они завершатся. Возьмем пример ограниченного буфера:

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 

Это усиливает предварительное условие, потому что entends, что должно быть правдой перед операцией 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. Может инвариант класса определен на классе вызывающего абонента в любом случае усилить предпосылки или постусловий Foo в?

№ Инварианты относятся к классу, который они определены только.

Ответы на оставшиеся вопросы вытекают логически сверху.

hth.

+0

Я думал, что предварительные условия являются публичным контрактом между абонентом и методом. Другими словами, я думал, что любые требования, предъявляемые предварительными условиями, должны быть удовлетворены вызывающим абонентом в том смысле, что у вызывающего есть возможность манипулировать всеми функциями, указанными в предварительном условии. Но вы говорите, что вызывающий может даже не знать о некоторых функциях, заданных предварительными условиями (те, которые он не может/не должен манипулировать, например, значение частных переменных и т. Д.)? – EdvRusj

+0

Забыл добавить: «Нет. Инварианты относятся к классу, который они определены только». Но разве мы не могли сказать, что пример в 3a) укрепит предварительное условие Foo, поскольку из-за инварианта класса, определенного в типе Input, допустимый диапазон параметра Server.Foo cmdIn.Length равен 2-19 вместо 1-20? – EdvRusj

+0

@ EdvRusj: Предпосылки не связаны только с обязанностями вызывающего абонента. Они также предоставляют предположения, на которые позволено ссылаться. – Kevin

 Смежные вопросы

  • Нет связанных вопросов^_^