Menu

* キーワード [#p4ea1c05]
- コンストラクタ
- メソッド
-- 引数

* 何か [#be09cdb6]

 生まれながらにして完全体、ただ呼ぶだけ

コンストラクタの呼び出しだけでインスタンスの状態を完全にします。属性に対応するsetterを順次呼び出すことによってインスタンスの状態を組み立てるようなことをしません。また、(基本的に)メソッドの呼び出しに伴う引数もなしにします。

- Complete Constructor: 完全コンストラクタ

* なぜか [#m70c6e7d]

属性に対応するsetterを画一的に用意すればインスタンスの状態を常に変更することができます。しかし、インスタンスの状態が常に不安定であると言うこともできます。また、インスタンスを完全な状態にするための手順を画一的に用意されたsetterから読み取ることは困難です。属性によっては値や関連をもつことが必須であったりそうでなかったりします。

- 不安定: setterによってインスタンスの状態を常に変更できてしまう
- 不明確: インスタンスを完全な状態にするための手順を読み取れない

コンストラクタの呼び出しだけでインスタンスの状態を完全にしようとすれば、必要な属性(''事前条件'')はコンストラクタの引数として表現できます。また、不要なsetterをもたないことでインスタンスの状態がいつも安定であると保証することができます。さらに、必要な属性情報を生成時に備えることでメッセージのやり取りがシンプルになり、役割の分担が明確になります。メソッドに引数があると呼び出しの側に仕事の裁量が寄るからです。

- 役割の分担: 完全な状態のインスタンスだけで仕事をする

* どのように [#n455f114]

たとえば、Webアプリケーションにてパラメータを取り扱うケースを考えます。

パラメータを取得する場面でキー名を与えるのではなく、
 request.getParameter("password");

キー名をもったインスタンスを作成しておきます。
 RequestParameter password = new RequestParameter(request, "password");
 password.get();

こうすることで、パラメータに対するキー名は何かという問題をインスタンスに閉じることができます。

//* 関連 
//- 
//- 
* 関連 [#h8381195]
- [[設計パターン/ファクトリ]]

* 参考 [#h2caf564]
- [[いまさら聞けない「オブジェクト指向設計の3つのコツ」~オブジェクト指向設計問題解説 #objectoriented - CodeIQ Blog>http://codeiq.hatenablog.com/entry/2013/08/26/155959]]
- [[Complete Constructor(完全なコンストラクタ) - Strategic Choice>http://d.hatena.ne.jp/asakichy/20100119/1263861423]]