Предварительное условие против Постусловия в 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?
  }
}

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

6 ответов

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

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

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

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

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

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.

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

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

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

ответ процитирован из вопроса stackru

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

Надеюсь, это поможет.

 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 и возвращает целое число, которое является суммой значений a и b.

Обычно вы вызываете функцию calc в main как

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

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

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

final float PI = 3.14f;

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

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

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

int foo = 5;
int bar = 7;
int sum = calc(foo, bar); //12
Другие вопросы по тегам