コンストラクター初期化
2006年2月7日
コンストラクター初期化は、オブジェクトの生成メソッドで、オブジェクトに必要なすべてのコラボレーターを渡すアプローチです。セッター初期化の代替方法です。
ファーストネーム、ラストネーム、お気に入りのバーのコレクションを持つ人物を作成するには、次のような方法があります。
# ruby mf = Person.new('martin', 'fowler', ['Turners Oyster Bar', 'Square and Compass'])
これにより、いつでも使用できる標準的な状態のオブジェクトがあることが確実になります。また、必要なオブジェクトを1行で取得できる便利なアプローチです。オブジェクトで1つのことだけを実行したい場合は、その単一行でオブジェクトを割り当てるか、そのメソッドを呼び出すこともできます。つまり、変数を維持する必要はありません。
コンストラクターに必要なコラボレーターをすべて宣言すると、どのコラボレーターが必要になるのかが明確になり、クラスを実行する方法がわかりやすくなります。必須のコラボレーターの有効な組み合わせごとに1つのコンストラクターメソッドが必要になります。一般的に使用されるオプションのコラボレーターを含むコンストラクターを提供するのは便利です。
このアプローチにより、不変属性と更新可能な属性の違いがわかりやすくなります。不変属性には設定メソッドがなく、コンストラクションメソッドでのみ初期化されます。
コンストラクター初期化は私の第一選択です。この方法で設定することが難しい場合があり、まれにセッター初期化を好む場合もありますが、ほとんどの場合、コンストラクター初期化が最善です。
一般的な問題
新しいオブジェクトにさまざまな合法的な組み合わせが存在するのはどうでしょうか? このアプローチを使用すると、コンストラクターメソッドが膨大になるのではないかと多くの人が心配します。ほとんどの場合、これは問題ではありません。いくつかしかありません。必須のコラボレーターのみが本当に必要であり、それらの組み合わせはほとんどありません。
コンストラクターで提供するコラボレーターが多いのはどうでしょうか? 大規模なコンストラクションパラメーターのリストは、大規模なパラメーターのリストと同様に、CodeSmellです。通常、これらを見ると、多くのパラメーターがDataClumpであり、独自のオブジェクトに置き換える必要があることがわかります。つまり、コンストラクターメソッドのパラメーターが他のメソッドよりも多いのは一般的ではありませんが、データの塊を見つけるのに適した場所です。
これはContextualValidationとどのように関係しますか? ここでは、オブジェクトの基本的な使用がコンテキストです。基本的に、最低限役立つ状態です。これはおそらく他のさまざまなアクティビティでは有効ではないでしょうが、役立つのに十分な有効性があるはずです。