質問を繰り返します-副作用のみを行うメソッドを副作用のみを行う別のメソッドでオーバーライドするときに、事後条件が弱いまたは強いとはどういう意味ですか?
追伸副作用と戻り値の組み合わせはどうですか?
基本的にはX
を実行するだけでなく、_X this way
_も実行します。
タイプShape
を返す場合、より強力な事後条件は、Quadrilateral
から派生するタイプShape
を返すことです。
例外をスローする場合、強力な事後条件により、例外の種類が制限されるか、まったくスローされない場合さえあります。
副作用についても同様です。最初の合意が_Cooking it
_によって一部のオブジェクトBread
を更新することであった場合、より強力な事後条件は_Cooking it in a Bread Oven
_になります。以前の合意は、火炎放射器と溶岩の使用を同様に許可しています。
よりコンピュータ科学的な例はソートです。 void sort(data[])
の後置条件は、data
が_for i..datalength-2 -> data[i] <= data[i+1]
_に準拠することです。
void logsort(data[])
は、より強力な事後条件(安定したソート)があることを除いて、その合意を実装します。
安定ソートは、等しいと比較される要素がそこで相対的な順序を維持することも保証します。
_Given: [ d, c1, a, c2, b, e, c3]
where c1 == c2 == c3, and all the letters sort: a, b, c, d, e
A sort might give:
[ a, b, c3, c1, c2, d, e]
or [ a, b, c1, c3, c2, d, e]
or [ a, b, c2, c3, c1, d, e]
or ...
Log Sort would always give:
[ a, b, c1, c2, c3, d, e]
_
そのため、ログの並べ替えの方が投稿条件が強くなります。
Log-Sortが提供する事後条件はそれだけではありません。また、それがO(NlogN)
で完了することも保証します(かなりの係数と、バッファースペースの割り当てと要素の移動のためのオーバーヘッド)。
void quicksort(data[])
などの別のソートもソート保証を実装し、O(nlogn)
のデータを最悪の場合のW(N^2)
でソートすることにより、より強力な保証を提供します。
一般的に言えば、クイックソートは、ほとんどのソートされていないデータのログソートよりも高速ですが、同等の要素の相対的な順序を維持する必要はありません。つまり、両方の並べ替えがvoid sort(data[])
で必要とされるよりも強力な事後条件を提供する一方で、それらは必ずしもお互いよりも強いまたは弱いわけではありません。