int Result = Func();
assert( Result == 1 );
この状況は、リリース モードで、次のことが本当に必要であることを意味します。
Func();
ただしFunc
、非 void です。つまり、結果を返します。つまり、クエリです。
おそらく、結果を返すFunc
だけでなく、何かを変更します (そうでなければ、わざわざ呼び出してその結果を使用しないのはなぜでしょうか?)、つまり、それはcommandです。
コマンドとクエリの分離原則(1) により、Func
同時にコマンドとクエリであってはなりません。言い換えれば、クエリには副作用があってはならず、コマンドの「結果」は、オブジェクトの状態に関する利用可能なクエリによって表されるべきです。
Cloth c;
c.Wash(); // Wash is void
assert(c.IsClean());
よりも良い
Cloth c;
bool is_clean = c.Wash(); // Wash returns a bool
assert(is_clean);
前者はあなたの種類の警告を与えませんが、後者は与えます。
要するに、私の答えは次のとおりです:このようなコードを書かないでください:)
更新 (1): Command-Query Separation Principleに関する参照を求めました。ウィキペディアはかなり有益です。この設計手法については、Bertrand Meyer によるObject Oriented Software Construction, 2nd Editionで読みました。
更新 (2): j_random_hacker は、「OTOH、以前に値を返したすべての「コマンド」関数 f() は、何らかの変数 last_call_to_f_succeeded などを設定する必要がある」とコメントしています。これは、コントラクトで何も約束しない関数、つまり「成功する」かどうかの可能性のある関数、または同様の概念にのみ当てはまります。Design by Contractでは、関連する数の関数に事後条件があるため、"Empty()" の後のオブジェクトは "IsEmpty()" になり、"Encode()" の後のメッセージ文字列は "IsEncoded()" になります。チェックする必要はありません。同様に、また幾分対称的に、プロシージャー「X()」を呼び出すたびに、その前に特別な関数「IsXFeasible()」を呼び出さないでください。