Вы можете рассматривать инвариант класса как критерий работоспособности, который должен выполняться всеми объектами между операциями. Таким образом, в качестве предварительного условия каждой открытой операции класса можно предположить, что инвариант класса выполняется. Кроме того, это может считаться постусловием каждой публичной операции, которое выполняется инвариантом класса. В этом смысле инвариант класса служит общим усилением как предусловия, так и постусловия публичных операций в классе. Эффективное предусловие - это сформулированное предусловие в сочетании с инвариантом класса. Точно так же эффективное постусловие - это сформулированное постусловие в сочетании с инвариантом класса.
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
's)?
б) Постусловие сформулировано в терминах возвращаемого значения вызываемого метода, поэтому как инвариант класса может усилить постусловия метода (Foo
) em>?
2. Может ли инвариант класса, определенный для Caller
class, каким-либо образом усилить предварительные условия или постусловия Foo
?
3. Если инвариант класса определен в параметре Foo
cmdIn
:
a) Если предварительное условие в Foo
указывает, что cmdIn.Length
находится в пределах диапазона 1-20
, но один из инвариантов класса, определенных в Input
, утверждает, что Input.Length
должен находиться в пределах диапазона 2-19
, тогда Foo
предварительное условие действительно было усилено?
б) Разве логика в a) не ошибочна, поскольку, если инвариант класса уже заявляет, что Input.Length
должен находиться в диапазоне 2-19
, не является ли это ошибкой для Foo
для определения предусловия, которое не всегда true
(cmdIn.Length
не может содержать значения 1
или 20
)
c) Но если инвариант класса, определенный в Input
, указывает, что Input.Length
должен находиться в диапазоне 0-100
, тогда предусловие Foo
не усиливается?
d) Могут ли инварианты классов, определенные в cmdIn
, также каким-то образом усилить постусловие Foo
?
4. Если инвариант класса определен в возвращаемом значении Foo
a) Если постусловие на Foo
указывает, что cmdOut.Length
находится в пределах диапазона 1-20
, но один из инвариантов класса, определенных в Output
, утверждает, что Output.Length
должен находиться в пределах диапазона 2-19
, тогда Foo
постусловие действительно было усилено?
б) Но если инвариант, определенный в Output
, утверждает, что Output.Length
должен находиться в диапазоне 0-100
, тогда постусловие Foo
не усиливается?
c) Могут ли инварианты классов, определенные на Output
, также каким-то образом усилить предусловие Foo
?
5. Но у меня сложилось впечатление, что процитированная статья означает, что просто имея инвариант класса (и даже если этот инвариант не каким-либо образом оперировать (прямо или косвенно) с параметрами и / или возвращаемым значением Foo
, это все равно усилит предварительные условия и постусловие Foo
? Если это действительно подразумевается в статье, как это возможно?
Благодарность