オブジェクト指向のあるべき姿?

 前回の続き。ちょっと釣りっぽいエントリです。

 たとえば、従業員クラスを作るとしましょう。名前とその読み仮名、住所、性別を持つとすると大抵は以下のようなクラスになります。

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 になること請け合いです!