一般的なOOPの問題だと思っていても、特にJavaでこの問題によく遭遇します。つまり、例外を発生させると、設計上の問題が明らかになります。
String nameフィールドとフィールドを持つクラスがあるとしString surnameます。
次に、これらのフィールドを使用して個人の完全な名前を作成し、ある種のドキュメント(請求書など)に表示します。
public void String name;
public void String surname;
public String getCompleteName() {return name + " " + surname;}
public void displayCompleteNameOnInvoice() {
String completeName = getCompleteName();
//do something with it....
}
次にdisplayCompleteNameOnInvoice、名前が割り当てられる前にが呼び出された場合にエラーをスローして、クラスの動作を強化したいと思います。いい考えですね。
getCompleteNameメソッドに例外発生コードを追加できます。しかし、この方法では、クラスユーザーとの「暗黙の」契約に違反しています。一般に、値が設定されていない場合、ゲッターは例外をスローすることは想定されていません。わかりました。これは単一のフィールドを返さないため、これは標準のゲッターではありませんが、ユーザーの観点からは区別が微妙すぎて考えられない場合があります。
または、の内部から例外をスローできdisplayCompleteNameOnInvoiceます。しかし、そうするためには、直接nameまたはsurnameフィールドをテストする必要がありますgetCompleteName。そうすることで、で表される抽象化に違反することになります。完全な名前を確認して作成するのは、このメソッドの責任です。他のデータに基づいて、場合によっては十分であると判断することさえできsurnameます。
だから、唯一の可能性は、メソッドのセマンティックを変更するようだgetCompleteNameとcomposeCompleteName、それをより「アクティブ」の行動と、例外をスローする能力を示唆しています。
これはより良い設計ソリューションですか?私はいつもシンプルさと正確さの間で最高のバランスを探しています。この問題の設計参照はありますか?
displayCompleteNameOnInvoice場合だけ例外を投げることができるgetCompleteName戻りnull、それができないのですか?