この言葉はさまざまな場面で使われているようです。私が理解できる最善のことは、変更できない変数を意味するということです。それが定数/最終的なものではありませんか(Javaのことを!)?
13 に答える
不変式は、変数よりも「概念的」です。一般に、これは常に true であるプログラム状態のプロパティです。不変条件が保持されることを保証する関数またはメソッドは、不変条件を維持すると言われます。
たとえば、二分探索木には、すべてのノードについて、ノードの左側の子のキーがノード自体のキーよりも小さいという不変条件がある場合があります。このツリーに対して正しく記述された挿入関数は、その不変条件を維持します。
おわかりのように、それは変数に格納できるようなものではありません。それはプログラムに関するステートメントです。プログラムが維持すべき不変条件の種類を把握し、コードを見直してそれらの不変条件が実際に維持されていることを確認することで、コード内の論理エラーを回避できます。
これは、ロジックの特定の場所で常に真であることがわかっている条件であり、デバッグ時にチェックして何が問題なのかを突き止めることができます。
ウィキペディアの魔法:不変 (コンピューター サイエンス)
コンピューター サイエンスでは、真の場合、特定の操作シーケンス全体で真のままである述語は、そのシーケンスに対して不変 (an) と呼ばれます。
私は通常、それらをアルゴリズムまたは構造の観点からより多く見ています。
たとえば、アサートできるループ不変条件 (各反復の開始時または終了時に常に true) を持つことができます。つまり、ループが 1 つのスタックから別のスタックへのオブジェクトのコレクションを処理することになっている場合、ループの上部または下部で |stack1|+|stack2|=c と言えます。
不変チェックが失敗した場合は、何か問題が発生したことを示します。この例では、処理された要素を最終的なスタックにプッシュするのを忘れていた可能性があります。
コードのブロック内で変更されないもの
それが何であるかに続いて、不変条件はきれいなコードを書くのに非常に役立ちます。なぜなら、コードにどの不変条件が存在すべきかを概念的に知ることで、それらの目的を達成するためにコードを編成する方法を簡単に決定できるからです。前述のように、不変式が維持されているかどうかを確認することは、実行しようとしている操作が実際に意図したとおりに実行されているかどうかを確認する良い方法であるため、デバッグにも役立ちます。
Class Invariant
関連する関数を呼び出す前後に常に真でなければならない条件です
たとえば、バランスの取れたツリーにInvariant
は と呼ばれる がありisBalanced
ます。いくつかのメソッド (addNode、removeNode など) を使用してツリーを変更する場合、ツリーisBalanced
の変更の前後で常に true にする必要があります。