私は、多くの場合、オブジェクト設計のためにこれらの2つの方法の間で決定する必要があります。OOPの初期化戦略
- 完全に初期化し、その構築後に使用する準備ができているオブジェクト。コンストラクタは複雑なパラメータリストを必要とすることが多いため、オブジェクトの初期化は重要ではありません。それをメンバ変数として持つすべてのオブジェクトには、他に類のないコンストラクタも必要です。これは、オブジェクトコンストラクタに複雑さが集中しているコードにつながり、コードを追従しにくくすることがあります。
- デフォルトのコンストラクタを持つオブジェクトです。オブジェクト変数は
setter methods
によって個別に設定されます。このアプローチは、ほとんどのメソッドがオブジェクトが完全に初期化されているかどうかをチェックする必要があり、コードが複雑になるという欠点があります。
あなたの個人的な好みは何ですか?また、どちらを使用するかはどのように決定しますか?
-1あなたのctorを2つの部分(ctor自体と 'Init')に分割するための-1。 IMHOこれは、コンストラクタが意味するものとは逆です:オブジェクトを有効な状態にする。確かに、ctorはあまり多くの作業を行うべきではないので、 'age'の値を簡単に決めることができない場合は、' functor 'オブジェクトをctorに渡します。後で呼び出されると 'age' 。おそらく、このような方法に賛成して「年齢」を完全に削除することさえできます。しかし、もう一つの義務的な 'Init'メソッドを導入してはいません。これは実際にはctorの単なる継続です。 (そして、 "魔法"の戻り値の代わりに例外を使用してください。) – stakx
(例えば、 'functionThatReturnsTheAgeFromSomeDB'を、オブジェクトメソッドに渡されたファクトリメソッドに置き換えることの追加ボーナスは、あなたがいくつかのDBの隠された依存関係を取り除くことです。より透過的でテストしやすくなります。) – stakx
JSF ++やMisraなどの多くの安全上重要なコーディング標準では、例外の使用を避けています。とにかく、 "Init"関数を使いたくない場合は、なぜ例外の使用法を提案していますか?コンストラクターの例外で彼は何をしますか?コンストラクターは例外を発生させることができないので、それは "init"関数を持つもう一つの理由です。 –