2013-10-01 2 views
0

Например, у меня есть следующий код:Предварительное условие против пост-состояния в java?

public class Calc(){ 
    final int PI = 3.14; //is this an invariant? 

    private int calc(int a, int b){ 
     return a + b; 
     //would the parameters be pre-conditions and the return value be a post-condition? 
    } 
} 

Я просто запутался, что именно означают эти термины? Код выше - это то, что я думаю, но может ли кто-нибудь указать мне правильное направление с моей теорией?

+2

funny int PI = 3.14, нет проблем с компилятором? – fmgp

ответ

1

Только слово предупреждения, отличное от числа с плавающей запятой (3.14) до int собирается оставить вас с трудом. Вы можете бросить его на поплавок:

final float PI = 3.14f; 

final означает, что переменная больше не может быть изменен.

и b - это только параметры, которые вы передаете в calc(). Раньше их можно назвать тем, кем вы хотите, но внутри calc() вы можете называть их a и b.

Таким образом, вы можете иметь это:

int foo = 5; 
int bar = 7; 
int sum = calc(foo, bar); //12 
2

Предварительные условия являются вещи, которые должны быть истинными, прежде чем метод называется. Метод говорит клиентам «это то, чего я от вас жду».

Пост-условия - это то, что должно быть истинным после завершения метода. Метод говорит клиентам «это то, что я обещаю сделать для вас».

Инварианты - это то, что всегда верно и не изменится. Метод говорит клиентам: «Если это было правдой, прежде чем вы позвонили мне, я обещаю, что все будет так, когда я закончу».

ответ цитировал stackoverflow question

+2

Вместо цитаты из другого Q/A и добавления ничего лишнего, поставьте этот вопрос как дубликат. Когда у вас есть 3k rep или более, проголосуйте за него, чтобы закрыть его как дубликат. Действительно, нет необходимости зарабатывать бесплатно, просто копируя/вставляя из другого ответа = \ –

2

Ваш код находится в контракте с другими битами и кусками кода. Предварительное условие - это то, что должно быть выполнено первоначально, чтобы ваш код гарантировал, что он будет делать то, что он должен делать.

Например, двоичный поиск будет иметь предварительное условие, согласно которому предмет, который вы просматриваете, должен быть отсортирован.

С другой стороны, пост-условие - это то, что код гарантирует, если выполняется предварительное условие. Например, в ситуации бинарного поиска нам гарантировано найти место нахождения того, что мы искали, или вернуть -1 в случае, когда мы ничего не находим.

Предварительное условие почти похоже на другую вещь поверх ваших параметров. Они обычно не влияют на код напрямую, но это полезно, когда другие люди используют ваш код, поэтому они правильно его используют.

3

Инвариант является комбинированным предварительным условием и постусловием. Он должен быть действительным до и после вызова метода. Предварительное условие должно быть заполнено до того, как метод может быть запущен, и послесловие впоследствии.

В Java нет механизмов для проверки условий, но, вот небольшой пример.

public class Calc { 
    private int value = 0; 

    private boolean isValid() { 
     return value >= 0; 
    } 

    // this method has the validity as invariant. It's true before and after a successful call. 
    public void add(int val) { 
     // precondition 
     if(!isValid()) { 
      throw new IllegalStateException(); 
     } 

     // actual "logic" 
     value += val; 

     // postcondition 
     if(!isValid()) { 
      throw new IllegalStateException(); 
     } 
    } 
} 

Как видите, условия могут быть нарушены. В этом случае вы (обычно) используете исключения на Java.

1
private int calc(int a, int b){ 
     return a + b; 
     //would the parameters be pre-conditions and the return value be a post-condition? 
    } 

Есть функция, которая принимает два Int и возвращает Int, который является суммирование и б.

Вы обычно вызов функции известково в основной, как

public static void main(String[] args) 
{ 
    int a = 3, b = 4; 
    int sum = calc(a, b); 
} 

, когда вы сделаете это, копия и б передается известково, но исходные значения и b не зависят от функции в качестве параметров: передано по значению в Java.

+0

Все верно, но что это связано с вопросом OP о терминах «предварительное условие» и «постусловие»? –

+0

Предполагаю, что он задал неправильный вопрос. В его коде нет if/else, поэтому нет никаких условий. – Andromeda

+0

условия pre/post и инварианты - это отдельные вещи, которые не имеют логической связи с наличием тестов if/else в коде. Они более тесно связаны с утверждениями 'assert'. –

1

Предварительное условие - это то, что должно быть верно в отношении параметров, которые выполняет функция. Поэтому недостаточно сказать, что такое переменные, но вам нужно сказать что-то о своей природе. Например, a и b должны быть целыми числами. Условие сообщения утверждает, что должно быть истинным после завершения функции. В вашем примере это будет тот факт, что ваша функция должна производить сумму a и b. Предварительное условие и состояние сообщения могут фактически приводить к двум методам, особенно на языке, таком как Java. Что, если у вас есть предварительное условие, в котором говорится просто «Два параметра должны быть численными». Тогда вам придется учитывать не только целые числа, но и плавающие точки.

Надеюсь, что помогает.

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