dorivenの日記

気がついたら社会人。気になる技術的なことについて少しずつ書いていけたらと思っております。

【書評】現場で役立つシステム設計の原則~変更を楽で安全にするオブジェクト指向の実践技法

この本を手にとった理由

DDDの具体的な実装部分の理解を深めたいと思い、手に取った次第。
DDDを学ぶ以前から気になっていた本ではあったのだが、amazonのレビューを見ると手放しでは賛同できないような意見もあるらしく、そういった箇所を自分で判断して無視できるくらいまで手はつけられないなーと思い放置していた。
DDD本やIDDD本(半分くらい読んでどちらも積んでいるけど…)、もちこちゃんのドメイン駆動設計本やDDDに関する記事を読みすすめるうちにもっと体系的にまとまりつつも、そこまで小難しくなくコードも含めた具体的な例が載っている本が欲しくなった。
かとじゅん@オーバークロック @j5ik2oさんがDDDの知識として有用と言及していたのも押して手を付けてみることにした。

書評

実装とアーキテクチャに関する広い知識が著者が重要と思った範囲でスポイルされ、著者の言葉になってまとめられた本だなと感じた。
取り扱っているのはDDDのドメインオブジェクト・ドメインモデル(以降、ドメイン層と呼称)に関係することが多い。
ざっくり以下のような要素を取り扱っていた。

それぞれが著者の言葉でまとめられており、DDDやIDDD本に出てくる小難しい言葉(e.g. 境界づけられたコンテキスト、サブドメインなど)はほとんど出てくることは読んでて理解に苦しむことは少なかった。
一方で著者が述べている近しいアプローチには一般的な名前が既につけられていることが多く(おそらく分かっててあえてそういう呼び方をしていない)、後からそれらの知識(e.g. CQRS、イベントストーミング)を深掘っていくぶんには調べる足がかりがなく、コンテキストの共有も辛い部分もありそうだとは感じた。
もちろん言及されている場合もあるので、全てが全て調べ辛いということはなさそうだが。

自身は概ね著者が述べている意見には賛成の部分も多く、本書で取り上げられるようなオブジェクト指向の著名な本は読んだことがなかった(読んだとしてもGoFとかくらい)ので、普段何となく思っていたことが整理できたのは良かった。
またどのようにドメインオブジェクトやモデルを見い出せばいいのか、というのも一つ知りたいポイントではあったのでそれが知れたことは良かった。
一方でDDDに出てくるAggregatorやSpec、 DomainServiceなどのパターンの詳細な実装方法や事例が出てくることを期待していたがそういった情報をなかった。
DDDの技法を紹介はしているものの、そこまで深ぼっている訳ではないので、そういった知識を求めるなら別な本に求める必要がありそう。

個人的に受け入れられなかった部分

この本の中でドメインモデルとビューを連携させる話が出てくる。
その中で以下のような文面に目を疑った。

情報の文字列表現そのものは、むしろ積極的にドメインオブジェクトが持つべきです。

つまり、ドメイン層にビューの情報を含めさせることを著者は推奨していた。
著者としては 画面がユーザの関心事そのものでありドメインで管理するべきものである という説を唱えている。

個人的にはビューはあくまでビューで変更頻度が高いものなので、それをドメイン層で管理することに反対だ。
個人的にはドメインロジックの結果だけをビューに引き渡し、その結果を受けてどのような文字を出すのか、出し分けるのかはビュー(テンプレートエンジン)側でやればいいことだと思っている。
本の中の例のようにコレクションオブジェクトの件数を見るまでは良いとして、「○件見つかりました or 見つかりませんでした」というところまでドメイン層に持たせる必要はないと考える。

つまり、本のコードを変更するなら以下みたいな感じになると個人的には思う。

before

class Items {
    List<Item> items;

    String found() {
        if (items.count() == 0) return "見つかりませんでした";
        return String.format("%s件見つかりました", items.count());
    }
}

// 増田 亨. 現場で役立つシステム設計の原則 〜変更を楽で安全にするオブジェクト指向の実践技法 (Japanese Edition) (Kindle の位置No.3237-3240). Kindle 版. 
// から引用

after

// これ自体もpackageはドメインではなくビュー側において良いと考える
class Items {
    List<Item> items;

    // これを使ってビュー側で文章の出し分けをする
    String isFound() {
        return items.count() > 0;
    }

    // ○件見つかりましたのデータ用に使う
    Integer count() {
        return items.count();
    }
}

また画面とドメインオブジェクトのプロパティの順番やデータを一致させる、というのも個人的にはやりすぎに感じた。 ビュー表示用のメッセージングオブジェクトの順番ならまだ分かるが、ドメイン層にまでビューの変更の影響が伝搬するのは境界が曖昧になっていると思うからだ。

これらの情報はCHAPTER7で出てくるので、これから読む人は自身の経験や知識と照らし合わせて本の中に書いてあることを取り込むべきかはしっかりと判断したほうが良さそうだ。

おすすめの対象読者

オブジェクト指向やDDDに関する様々な知識が手広く書かれているので以下のような人におすすめできそうと感じた

  • 以下のことは出来るもののもっと変更容易性があるコードを書きたい人
    • 仕事で求められた機能の実装は出来る
    • ドメインモデリングは上手くできていないもののクラスを使った実装が出来る
  • データベースのテーブルを雰囲気で作っている人
    • 一度もデータベースモデリング系の本を読んだことがない人
  • DDDが気になって学び始めた人
    • もちこちゃんの大冒険を読んだくらい
    • ネットの記事でDDD周りの情報を追っている

一方でこんな人にはおすすめできない

  • MVCパターンを触れたことがない人
  • DDDやIDDDに出てくるパターン(e.g. Aggregator、Spec、etc)についてのより理解を深めたい人
  • DDD以外にも触れられているマイクロサービスやデータベースモデリング、CQRS、イベントソーシング、イベントストーミングなどの知識を深掘って理解したい人

中級者向けな本なので、初心者やDeepDiveしたいような上級者?には向かない。
ただし、参考文献を見ても分かるがDDD以外の知識にも触れられるので上級者の人でも著者の言葉で書かれている内容なので一通り目を通してみても何か役立つことや新しい発見はあるだろうとは思う。

おわりに

書評をまとめることでもう一度ざっくり全体をさらって見たので復習の効果や記憶の定着化が狙えるのでこれからも本を読んだら書評を書くことを続けていきたいと思う。 (色々と途中で読んで止まっている本があるのでそれも読んで書かないとなー)