私は Code Contracts で不変条件を実証しようとしています。文字列の並べ替えられたリストの例を挙げたいと思いました。配列を内部的に維持し、追加などのための予備スペースを備えています-List<T>
基本的には と同じです。アイテムを追加する必要がある場合は、それを配列に挿入するなどします。3 つの不変条件があると考えました。
- カウントは適切である必要があります: 非負であり、最大でバッファ サイズと同じ大きさです。
- バッファの未使用部分はすべて null にする必要があります
- バッファの使用部分の各アイテムは、少なくともその前のアイテムと同じくらい「大きい」必要があります
今、私はこの方法でそれを実装しようとしました:
[ContractInvariantMethod]
private void ObjectInvariant()
{
Contract.Invariant(count >= 0 && count <= buffer.Length);
for (int i = count; i < buffer.Length; i++)
{
Contract.Invariant(buffer[i] == null);
}
for (int i = 1; i < count; i++)
{
Contract.Invariant(string.Compare(buffer[i], buffer[i - 1]) >= 0);
}
}
残念ながら、ccrewrite
ループを台無しにしています。
ユーザー ドキュメントによると、このメソッドは への一連の呼び出しである必要がありますContract.Invariant
。本当にこのようなコードを書き直す必要がありますか?
Contract.Invariant(count >= 0 && count <= buffer.Length);
Contract.Invariant(Contract.ForAll
(count, buffer.Length, i => buffer[i] == null));
Contract.Invariant(Contract.ForAll
(1, count, i => string.Compare(buffer[i], buffer[i - 1]) >= 0));
それは機能しますが、やや醜いです。(以前の試みよりもはるかに優れています。念のため。)
私の期待は不合理ですか?私の不変条件は不合理ですか?
(コード コントラクト フォーラムでも質問されています。関連する回答があれば、ここに追加します。)