コード契約の失敗した例Graph.Remove(EdgeE)
-
28-10-2019 - |
質問
これは、コード契約で装飾した簡単なグラフ操作方法です。
保証請求は証明されませんが、その理由がわかりません! remove()を呼び出した後、エッジがエッジリストにないか、結果がfalseであると主張していると思います。結果が真である場合、グラフの状態については何も主張しません。静的チェッカーはそれが好きではなく、私はペックスを手に入れていません(私はおそらくそれをどのように使用するかわからないだけです)。
この例ではロックは無関係ですが、万が一に備えて残します。また、OnremoveEdgeの代表者は保証はありませんが、今のところ、グラフコードに再入力されていないと暗黙的に想定します。その上、仮定はそれの後です。
public bool Remove(E edge)
{
Contract.Requires(edge != null);
Contract.Ensures(!Contract.Exists(edges, e => e == edge) || !Contract.Result<bool>());
lock (sync)
{
if (!OnBeforeRemoveEdge(edge)) return false;
if (!edges.Remove(edge)) return false;
}
OnRemoveEdge(edge);
Contract.Assume(!Contract.Exists(edges, e => e == edge));
return true;
}
更新:コードを変更して、イベントハンドラーのonRemoveEdge()を移動しました(ただし、デリゲート、onbeforeremoveEdgeではありません)。しかし、これは、スレッドに関連する契約の仮定に対して何をしますか?コード契約は単一の読み取りモデルを想定していますか?うーん。
解決
所属していません StackOverflow