オブジェクト指向のあるべき姿?
前回の続き。ちょっと釣りっぽいエントリです。
たとえば、従業員クラスを作るとしましょう。名前とその読み仮名、住所、性別を持つとすると大抵は以下のようなクラスになります。
public class Employee { /** 名前 */ private String name; /** かな */ private String kana; /** 住所 */ private String address; /** 性別(0 = 男、1 = 女) */ private int sex; // 以下ゲッターとセッター // 略 }
でも、これだとそれぞれのフィールドにどんな値を持ち得るのかがわかりません。だからバリデータを書くんだけど、それに違和感を感じるってのが前回の話。だからこんな感じがいいんじゃね? って思うわけです。
public class Employee { /** 名前 */ private EmployeeName name; /** かな */ private EmployeeKana kana; /** 住所 */ private EmployeeAddress address; /** 性別(0 = 男、1 = 女) */ private EmployeeSex sex; // 以下ゲッターとセッター // 略 }
それで例えば EmployeeName は以下のようになるわけです。
public class EmployeeName { private String value; public void setValue(String value) { if (value == null || value.length() = 0) { // 例外をスロー } if (30 < value.length()) { // 例外をスロー } this.value = value; } public String getValue() { return value; } }
さらにこれにはこんな利点もあります! たとえば、従業員名を表示するメソッド、displayEmployeeName があったとします。これを従来(?)のやり方で書くと以下のようになりますね。
public void displayEmployeeName(String name) { // 表示処理 }
しかしこれだと、従業員名じゃない文字列も渡せちゃいます! こういうのって意外とバグの温床なんですよね! そこで、こんな風に書くわけですよ。
public void displayEmployeeName(EmployeeName name) { // 表示処理 }
エクセレント! これでバグ発生率も 256 分の 1 になること請け合いです!