現場で役立つシステム設計の原則

これ読んでる。

オブジェクト指向におけるよりよい設計について書いてある。 データモデル主導の設計ではなく、ドメインモデルを使用した設計によるメリットなど。

まだ途中だが、私にとっては実に勉強になる。というか面白い。 現在私が携わっているシステムは「データモデル」を元にした設計になっており、いろいろな箇所でコードの重複などが目立つ。 どうしたものかと考えていたところでこの本を手に取り、そもそも「データモデル」になっている時点で修正のしづらい・重複の出やすいものになっていることが判明。(泣)
今更どうすることもできないが、せめてドメインモデルの知識を身に着けようと読み進めることにする。

さて、そもそもデータモデルとドメインモデルって何が違うの?ってところで簡単にプログラムを書いてみる。 「人」を表すクラスを使用する場合に・・・
①データモデルの場合

   public Person() {
    }
    
    //よくあるセッター・ゲッター
    String name;
    int age;
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

ドメインモデルの場合

   String firstName;
    String familyName;
    int age;
    
    public Person2(String firstName, String familyName, int age) {
        this.firstName = firstName;
        this.familyName = familyName;
        this.age = age;
    }
    
    boolean isAdult() {
        return this.age > 19;
    }
    
    String getFullName() {
        return this.familyName + this.firstName;
    }

一目瞭然。ドメインモデルの場合はオブジェクト自身に処理を記述している。 で、これの何が嬉しいかって話になるんだが、まさに「プログラムの修正が必要になったとき」に大きな違いになってくる(らしい)。

データモデルの場合は「成人である」かの判定ロジックはこのように各機能ごとに書く必要がある。
(条件記述が必要になる)

    if(person.getAge() > 19) {
    ///なんかする
    }

ドメインモデルはこう。判定自体はオブジェクト内部で行っている。

    if(person.isAdult()) {
    ///なんかする
    }

で、何が問題になるかというと、例えば将来「成人年齢を18歳に引き下げ」みたいなことになった場合に・・ データモデルの場合は

if(person.getAge() > 19)

↑ここをすべて17に修正しないといけない。 Personを呼び出すことのできる機能すべて。

一方で、ドメインモデルの場合は、Personクラスのメソッドの個所のみを修正すればいい。

    //PersonクラスのisAdultメソッドの境界値のみを修正する
    boolean isAdult() {
        return this.age > 17;
    }

    //呼び出し側には何の修正もいらない
    if (person.isAdult()) {
    }

つまり、修正部分がドメインモデル(Person)内にとどまるということ。
データモデルでよくある(かもしれない)「あっちは直したけどこっちは直してませんでした」みたいなことも減る。

さらに言うと「Person」クラスそのものが業務アプリケーションにおける用語や処理対象としてそのまま 扱えるってことも大きなメリット。
例えば上記は成人であるか否かを表していただけだったが、「人」という役割を考えたときに何ができるかなどを そのままオブジェクトに持たせることができる。

//被選挙権
public boolean hasEligibilityForElection() {
    //選挙によってまちまち違うがこれにしとく
    return this.age > 24;
}

上記の例はドメインモデルにおけるメリットのほんの一部分にかもしれないけど、わたしにとってはすごく ためになった。 いや、たぶんオジェクト指向について詳しい人とか、ドメインモデル設計をしている人にしたら普通のことかもしれないけど、 私としては目からうろこだったわけです。

こういう設計をやってみたい。とはいえ今のシステムについていきなりドメインモデルに変えたいなんて無理だしなぁ。 というかStrutsとか使っている時点で難しいのかな。 こっそりDTOやらEntityやらにメソッドを書いてみたりしてみようか。(アカンか)

ただ正直ドメインモデル設計ができる気もしないんだけどな(笑)。難しそうだ。

何はともあれまだこの本も第4章の途中までしか読んでないし、まずは最後までしっかり読みますかね。 まだまだ面白いことを学べそう。