1

たとえば、次のコードがあります。

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?
  }
}

これらの用語が正確に何を意味するのか混乱していますか?上記のコードは私が考えているものですが、誰かが私の理論で正しい方向に向けることができますか?

4

5 に答える 5

4

不変条件は、事前条件と事後条件を組み合わせたものです。メソッドの呼び出しの前後で有効である必要があります。メソッドを実行する前に事前条件を満たし、後で事後条件を満たさなければなりません。

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 で例外を使用します。

于 2013-10-01T15:11:41.210 に答える
2
 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 つのintを取り、 abの合計であるint を返す関数です。

通常、main で calc 関数を次のように呼び出します。

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

これを行うと、 abのコピーがcalcに渡されますが、 Java ではパラメーターがで渡されるため、 abの元の値はcalc関数の影響を受けません。

于 2013-10-01T15:11:54.120 に答える
2

前提条件は、関数が受け取るパラメーターについて真でなければならないものです。したがって、変数が何であるかを言うだけでは十分ではありませんが、変数の性質について何かを言う必要があります。たとえば、a と b は整数でなければなりません。事後条件は、関数の完了後に真でなければならないことを示します。あなたの例では、関数が a と b の合計を生成する必要があるという事実です。事前条件と事後条件は、特に Java のような言語では、実際には 2 つのメソッドになる可能性があります。「2 つのパラメーターは数値でなければならない」という単純な前提条件があるとしたらどうなるでしょうか。次に、整数だけでなく浮動小数点も考慮する必要があります。

それが役立つことを願っています。

于 2013-10-01T15:12:29.790 に答える