問題タブ [invariants]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
mysql - MySQL データベースで再帰的な不変条件を維持する方法は?
MySQL データベースでエッジとしてエンコードされたツリーがあります。
ツリーのリーフごとに、items.tot
誰かが設定します。内部ノードの場合、そのitems.tot
子の合計である必要があります。次のクエリを繰り返し実行すると、目的の結果が生成されます。
(これは実際には機能しないことに注意してくださいが、それは重要ではありません)
データベースが存在し、不変条件が既に満たされていると仮定します。
質問は:
この要件を維持しながら DB を更新する最も実用的な方法は何ですか? 更新により、ノードが移動したり、
tot
リーフ ノードの値が変更されたりする場合があります。葉ノードは葉ノードのままであり、内部ノードは内部ノードのままであり、全体は適切なツリーのままであると想定できます。
私が持っていたいくつかの考え:
- 完全な無効化、更新後、すべてを再計算します (ええと...いいえ)
- アイテム テーブルにトリガーを設定して、更新された行の親を更新します。
- これは再帰的です(更新は更新をトリガーし、更新をトリガーします...)
- 動作しません。MySQL はトリガーを開始したテーブルを更新できません
- 更新される任意の行の親の更新をスケジュールするようにトリガーを設定します
- これは反復的です(スケジュールからアイテムを取得し、それを処理してさらにアイテムをスケジュールします)
- 何がこれを開始しますか?クライアントコードを信頼して正しく取得しますか?
- 利点は、更新が正しく順序付けられている場合、計算する必要がある合計が少なくなることです。しかし、その順序はそれ自体が複雑です。
理想的な解決策は、他の「集約不変条件」に一般化されます
FWIW私はこれが「少しやり過ぎ」であることを知っていますが、私は楽しみのためにこれをやっています(楽しい:動詞、それを行うことによって不可能を見つける. :-)
language-agnostic - 不変量とは何ですか?
この言葉はさまざまな場面で使われているようです。私が理解できる最善のことは、変更できない変数を意味するということです。それが定数/最終的なものではありませんか(Javaのことを!)?
c# - オブジェクトの内部状態をどのように検証しますか?
操作中にオブジェクトの内部状態を検証するために使用している手法に興味があります。オブジェクト自体の観点からは、内部状態が悪いか不変の違反が原因でのみ失敗する可能性があります。
私の主な焦点はC++です。これは、C#では例外をスローすることが公式で一般的な方法であり、C ++ではこれを行う方法が1つだけではないためです(C#でも実際にはそうではありません)。
私は関数パラメーターの検証について話しているのではなく、クラス不変の整合性チェックについて話していることに注意してください。
たとえば、Printer
オブジェクトをQueue
印刷ジョブに非同期的に送信したいとします。のユーザーにとってPrinter
、非同期キューの結果は別の時間に到着するため、その操作は成功するだけです。したがって、発信者に伝える関連のエラーコードはありません。
しかし、Printer
オブジェクトにとって、内部状態が悪い場合、つまりクラス不変条件が壊れている場合、この操作は失敗する可能性があります。これは基本的にバグを意味します。Printer
この条件は、オブジェクトのユーザーにとって必ずしも重要ではありません。
個人的には、3つのスタイルの内部状態検証を組み合わせる傾向があり、どれが最良であるかを実際に判断することはできません。どれが絶対に最悪であるかだけです。これらについてのご意見をお聞かせください。また、この件に関するご自身の経験や考えを共有していただきたいと思います。
私が使用する最初のスタイル-破損したデータよりも制御可能な方法で失敗する方が良いです:
私が使用する2番目のスタイル-破損したデータよりも制御不能なクラッシュの方が優れています:
私が使用する3番目のスタイル-破損したデータよりも静かにそして防御的に救済する方が良い:
スタイルへの私のコメント:
- アクセス違反が実際にクラッシュを引き起こすという条件で、失敗が隠されていない2番目のスタイルを好むと思います。
- 不変条件に関係するNULLポインターでない場合、私は最初のスタイルに傾く傾向があります。
- 3番目のスタイルは多くのバグを隠すので本当に嫌いですが、クラッシュしない堅牢なソフトウェアのような錯覚を引き起こすため、本番コードでそれを好む人は知っています(機能は機能を停止するだけです)。壊れた
Printer
オブジェクトのキューイング)。
これらのいずれかを好みますか、それともこれを達成する他の方法がありますか?
jpa - JPA Entites の空のコンストラクターとセッター
JPAエンティティに少なくとも1つの空のコンストラクターとパブリックセッターを持たせるという要件は好きではありません。EntityManager 側の問題は理解していますが、これによりクラスの不変条件が無効になります。
誰かがこれに対する解決策を持っていますか(デザインパターンまたはイディオムレベル)?
ありがとう!
イゴール
.net-4.0 - オブジェクト不変条件のコードでどれだけ自由になれるでしょうか?
私は Code Contracts で不変条件を実証しようとしています。文字列の並べ替えられたリストの例を挙げたいと思いました。配列を内部的に維持し、追加などのための予備スペースを備えています-List<T>
基本的には と同じです。アイテムを追加する必要がある場合は、それを配列に挿入するなどします。3 つの不変条件があると考えました。
- カウントは適切である必要があります: 非負であり、最大でバッファ サイズと同じ大きさです。
- バッファの未使用部分はすべて null にする必要があります
- バッファの使用部分の各アイテムは、少なくともその前のアイテムと同じくらい「大きい」必要があります
今、私はこの方法でそれを実装しようとしました:
残念ながら、ccrewrite
ループを台無しにしています。
ユーザー ドキュメントによると、このメソッドは への一連の呼び出しである必要がありますContract.Invariant
。本当にこのようなコードを書き直す必要がありますか?
それは機能しますが、やや醜いです。(以前の試みよりもはるかに優れています。念のため。)
私の期待は不合理ですか?私の不変条件は不合理ですか?
(コード コントラクト フォーラムでも質問されています。関連する回答があれば、ここに追加します。)
design-by-contract - 契約による設計を行う場合、メンバー関数の不変条件に加えて、前提条件と事後条件が必要ですか?
DbCメソッドでは、関数に事前条件と事後条件がついていることがわかりました。
私が疑問に思っているのは、それがメンバー関数にも当てはまるかどうかです。
たとえば、各パブリック関数の最初と最後で不変条件を使用すると仮定すると、メンバー関数は次のようになります。
編集:(私の例をクリーンアップ)
グローバル/ジェネリック関数のみで事前条件と事後条件を使用し、クラス内で不変条件を使用しても問題ありませんか?
これはやり過ぎのように思えますが、私の例が悪いのかもしれません。
編集:
事後条件は、不変条件のサブセットをチェックしているだけではありませんか?
上記では、 http://www.digitalmars.com/ctg/contract.htmlの指示に従っています。「クラス コンストラクターが完了すると、クラス デストラクタの開始時、public の前に不変式がチェックされます。メンバーが実行され、パブリック関数が終了した後。」
ありがとう。
invariants - プログラミングするとき、不変式を使用しますか?
不変条件の使用を強調する中級プログラミング コースを受講しています。私は以前にそれらを使用したことがなく、作成に時間がかかるようです. ソフトウェア エンジニアリング業界は、不変条件の使用を強調していますか?
loops - ループ不変条件を決定する最良の方法は何ですか?
正式な側面を使用してコードを作成する場合、ループ不変条件を決定する一般的な方法はありますか、それとも問題によって完全に異なりますか?
c++ - ループ不変条件 (具体的には「Accelerated C++」の Ch.3)
私は現在「Accelerated C++」に取り組んでおり、第3章でこれに出くわしました:
著者はこれに続いて、不変式には特別な注意を払う必要があると説明しています。これは、入力が に読み込まれると成績x
が読み取られ、count + 1
不変式が真でなくなるためです。同様に、カウンターをインクリメントするsum
と、最後のカウント成績の合計ではなくなります (ご想像のとおり、これは学生の成績を計算するための従来のプログラムです)。
私が理解していないのは、なぜこれが重要なのかです。確かに、他のほぼすべてのループについて、同様のステートメントが当てはまりますか? たとえば、これは本の最初のwhile
ループです (出力は後で入力されます)。
r
出力の適切な行を書き込んだら、他の例と同様に、をインクリメントするまで、不変条件は確実に false になりますか?
この 2 つの条件の違いは何ですか?
編集:すべての返信に感謝します。わかったと思いますが、念のために「承認された回答」を選択する前に、もう少しそのままにしておきます。これまでのところ、すべての回答は基本的に同意しているため、公正とは思えませんが、やる価値はあると思います。
以下に要求された元の段落:
「このループの不変条件を理解するには、特別な注意が必要です。なぜなら、while の条件には副作用があるからです。これらの副作用は、不変条件の真実に影響を与えます: cin >> x を正常に実行すると、不変条件の最初の部分、つまり、 count grades-false を読みました. したがって、条件自体が不変式に与える影響を説明するために、分析を変更する必要があります。
条件を評価する前に不変式が真であったことがわかっているので、すでにカウント グレードを読み取っていることがわかります。cin >> x が成功した場合、count + 1 の成績を読み取ったことになります。カウントをインクリメントすることで、不変式のこの部分を再び真にすることができます。ただし、これを行うと、不変式の 2 番目の部分 (合計は最初のカウントの成績の合計であるという部分) が改ざんされます。成績を数えます。幸いなことに、sum += x; を実行することで、不変式の 2 番目の部分を真にすることができます。そのため、その間の後続の旅行では不変式全体が真になります。
条件が false の場合、入力の試行が失敗したため、それ以上データを取得できなかったため、不変条件は依然として true であることを意味します。その結果、while が終了した後の状態の副作用を考慮する必要はありません。」
oop - クラス不変条件を見つけるためのヒューリスティック
クラスの不変条件を見つけるためのヒューリスティックはありますか?
- ...に注意してください。
- ...に頼らないでください。
たぶん、一般的なアドバイスがあります。
実際の例を研究している紙上のリンクは大歓迎です。