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 предпосылки и постусловие? Если это то, что статья на самом деле подразумевает, как это возможно?
благодаря
Я думал, что предварительные условия являются публичным контрактом между абонентом и методом. Другими словами, я думал, что любые требования, предъявляемые предварительными условиями, должны быть удовлетворены вызывающим абонентом в том смысле, что у вызывающего есть возможность манипулировать всеми функциями, указанными в предварительном условии. Но вы говорите, что вызывающий может даже не знать о некоторых функциях, заданных предварительными условиями (те, которые он не может/не должен манипулировать, например, значение частных переменных и т. Д.)? – EdvRusj
Забыл добавить: «Нет. Инварианты относятся к классу, который они определены только». Но разве мы не могли сказать, что пример в 3a) укрепит предварительное условие Foo, поскольку из-за инварианта класса, определенного в типе Input, допустимый диапазон параметра Server.Foo cmdIn.Length равен 2-19 вместо 1-20? – EdvRusj
@ EdvRusj: Предпосылки не связаны только с обязанностями вызывающего абонента. Они также предоставляют предположения, на которые позволено ссылаться. – Kevin