C++による事前・事後契約
それでは、標準C++におけるDbCの実現手段をひととりチェックしてみましょう。事前条件を実現するには、assertを関数の先頭部で使うことが有効であると、誰もが考えるでしょう。それは正解ですし、正しいassertの使い方といえます。

事後条件はどのようにするべきでしょうか。事後条件は関数の動作の終了後、端的に言えばreturnの後で実行されることが望ましく、関数の先頭に書きたいため、関数の終端にassertを入れるだけではDbCの性質をうまく実現することはできません。昨日紹介したこのページは、この課題についてデストラクタが有効であると回答しています。

void foo()
{
    
struct Sentry
    
{   Sentry() { ...preconditions... }
    ~
Sentry() { ...postconditions... }
    }
sentry;
    ...
implementation...
}


デストラクタはインスタンスがスコープを抜けた際にコールされますから、事後条件を関数の終了後にチェックできます。
|