これは確かに主観的なことですが、議論になることは避けたいと思います。人々がそれを適切に扱うならば、それは興味深い質問になるかもしれないと思います。
最近のいくつかのプロジェクトでは、長い委任チェーンが一般的なアーキテクチャを実装していました。
二重の委任チェーンは非常に頻繁に発生する可能性があります。
bool Exists = Env->FileSystem->FileExists( "foo.txt" );
そして、トリプル委任はまったく珍しいことではありません。
Env->Renderer->GetCanvas()->TextStr( ... );
高次の委任チェーンは存在しますが、実際には不足しています。
上記の例では、使用されるオブジェクトは常に存在し、プログラムの機能に不可欠であり、実行開始時に明示的に構築されるため、NULLランタイムチェックは実行されません。基本的に、私はこれらの場合に委任チェーンを分割するために使用しました:
1)委任チェーンを通じて取得したオブジェクトを再利用します。
{ // make C invisible to the parent scope
clCanvas* C = Env->Renderer->GetCanvas();
C->TextStr( ... );
C->TextStr( ... );
C->TextStr( ... );
}
2)委任チェーンの途中にある中間オブジェクトは、使用する前にNULLをチェックする必要があります。例えば。
clCanvas* C = Env->Renderer->GetCanvas();
if ( C ) C->TextStr( ... );
私は以前、プロキシオブジェクトを提供することでケース(2)と戦っていました。これにより、NULL以外のオブジェクトでメソッドを呼び出して、empty
結果を得ることができます。
私の質問は次のとおりです。
- ケース(1)または(2)のどちらかがパターンまたはアンチパターンですか?
- C ++で長い委任チェーンを処理するためのより良い方法はありますか?
これが私の選択をする際に私が考慮したいくつかの賛否両論です:
長所:
- それは非常に説明的です:オブジェクトがどこから来たのかは1行のコードから明らかです
- 長い委任チェーンは見栄えがします
短所:
- 委任チェーン内の複数の一時オブジェクトを検査するのは難しいため、インタラクティブなデバッグは面倒です。
長い委任チェーンの他の長所と短所を知りたいです。あなたの意見を提示し、あなたがそれにどれだけ同意するかではなく、どれほどよく議論された意見に基づいて投票してください。