web-dev-qa-db-ja.com

戻り値がない場合に、オーバーライドされたメソッドの事後条件が弱いか強いかを判断するにはどうすればよいですか?

質問を繰り返します-副作用のみを行うメソッドを副作用のみを行う別のメソッドでオーバーライドするときに、事後条件が弱いまたは強いとはどういう意味ですか?

追伸副作用と戻り値の組み合わせはどうですか?

2
todoroff

より強力な事後条件->より多くの保証

基本的には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[])で必要とされるよりも強力な事後条件を提供する一方で、それらは必ずしもお互いよりも強いまたは弱いわけではありません。

2
Kain0_0