私は、クライアントが設計上の契約の最後に留まっていることを保証する目的で、入力を検証するためのランタイムチェックを行うかどうかという質問に対する確かな答えを見つけたいと思っていました。たとえば、単純なクラスコンストラクターを考えます。
class Foo
{
public:
Foo( BarHandle bar )
{
FooHandle handle = GetFooHandle( bar );
if( handle == NULL ) {
throw std::exception( "invalid FooHandle" );
}
}
};
この場合、ユーザーはFoo
有効ななしでを作成しようとするべきではないと主張しますBarHandle
。がコンストラクタのbar
内部で有効であることを確認するのは適切ではないようですFoo
。そのFoo
コンストラクタに有効な が必要なことを単純に文書化した場合BarHandle
、それで十分ではありませんか?これは、契約による設計の前提条件を強制する適切な方法ですか?
これまでのところ、私が読んだことはすべて、これについてさまざまな意見があります。50%の人がそれbar
が有効であることを確認すると言うようですが、他の50%は私がそれをすべきではないと言っています。たとえば、ユーザーBarHandle
が正しいことを確認したが、2番目の(そして不要な)チェックを行う場合を考えてください。もFoo
コンストラクタの内部で行われています。