ドメイン駆動設計入門をまとめてみる

ドメイン駆動設計入門を読んだのでざっくりですが記事にまとめます。
仕事でご一緒したオブジェクト指向設計好きのベテランエンジニアさんがわかりやすいと薦めていたので読んでみました。ドメイン駆動設計自体なにも知らなかったですが、読んでみて考えは理解できたかなと思っています。
f:id:fourthgrd:20200815233526j:plain:w100

ドメイン駆動設計とは

本では、ドメイン駆動設計=「ドメインの知識に焦点をあてた設計手法」と書いてあります。 まずドメインってなんやねんって話。自分的な解釈としては
ドメイン(領域):
作るシステムのターゲットとする世界。物流なら物流、小売なら小売の世界のこと。

なにかしらの課題解決のためにシステムを作るんだから、その対象の世界について勉強して知識を蓄えますよね。ドメイン駆動設計の思想は、課題解決のためにその対象の世界(ドメイン)について、解決に必要な知識をつけてコードに反映させていこうぜってこと。まぁ考えとしては当たり前ですよね。技術屋さんあるあるの技術に寄りすぎた開発をするなよってことですね。

ドメイン駆動設計のストーリー

もうちょっと詳しく、どういう流れで設計をするものなのかというとこんな感じです。

ドメイン内の世界をオブジェクトで表現する(ドメインオブジェクト)

対象の世界(ドメイン)をどうプログラム上で表現するかって話ですが、オブジェクト指向設計なのでもちろんオブジェクトで表現します。ドメイン内には人やら物やら考えやらが存在します。物流でいったら、倉庫や運搬する人や利用者などです。これらのドメイン内に登場するものをオブジェクトで表します。本ではこれをドメインオブジェクトと呼んでいます。

ドメインオブジェクトを使って課題解決

システムを作るってことはドメイン内になにか課題があるってことですよね。ドメインオブジェクトでドメイン内の世界が表現できたので、これらを使っていざ課題解決をしていきましょうって話です。

感覚的にはおままごとみたいな感じですかね。実世界の家とか人間とかをおもちゃという形で表現して、子供がその表現された世界で遊ぶ。ちょっと違うか笑

ドメイン駆動設計はなにがいいのか?

本の中ではドメインをしっかり分析して設計開発を行うので、ソフトウェアの変化に対応しやすく、拡張がしやすい的なことが記載されていました。仕事でドメイン駆動設計が意識されたコードを複数読んでいるので、本を読んで感じたことと合わせて個人的にいいと思ったところを記述します。
それぞれのクラスの責務が明確になっていてコードが読みやすいです。後述しますがドメインオブジェクトならドメインブジェクト、リポジトリならリポジトリと責務が明確です。なのでどこに何が書いてあるのかちゃんと読まなくてもおおよそわかります。まぁコーディングのあるべき当然の姿なのかもしませんが。最初はクラスが多くて読みづらいと感じましたが、慣れた今では読みやすいと感じます。

本で解説されているパターン

この本では「知識を表現するパターン」と「アプリケーションを実現するパターン」の大きく2つに分けられます。「知識を表現するパターン」では、ドメインオブジェクトをコード上どうやって表現するかについて解説しています。「アプリケーションを実現するパターン」はドメインオブジェクトを使って、どう課題を解決するコードを書いて行くかを解説しています。多すぎてまとめきれないので超ざっくり記載します。本では割と細かくコーディング方法や注意点が記載されているので知りたい方はぜひ買ってみてください!

知識を表現するパターン

ドメイン内の世界をどうやってオブジェクト化していくのかって話です。まぁオブジェクト化するので簡単に言うと、対象のものをクラスで表現してあげるってことですね。例えばユーザー名をオブジェクト化する場合は単純にUserNameというクラスを作るだけです。で、ユーザー名に関するルールや制約はそのクラスにロジックとして集約する感じ。(例えばユーザー名は3文字以上しか設定されないようにするなど。)
オブジェクトの表現パターンとして「値オブジェクト」「エンティティ」が紹介されています。

アプリケーションを実現するパターン

ドメインオブジェクトを使ってどうプログラムを組んでいくかって話です。紹介されているパターンをざっと記載します。
リポジトリ
オブジェクトのインスタンスを永続化するためにDBなどに接続するためのもの。ドメインオブジェクトと切り離してコーディングすることで、DBが変わるなどしてもここだけ直せばOKだよねって話。
・アプリケーションサービス
ドメインオブジェクトを操作するためのオブジェクト。操作とは主にCRUD(Create,Read,Update,Delete)処理などを指します。 ドメインオブジェクトの操作はこのオブジェクトに寄せようっていう話がされています。
・ファクトリ
複雑なオブジェクトの生成処理がある場合に、そのオブジェクトの生成処理を行うためのオブジェクト。オブジェクトの複雑な生成処理がある場合、コンストラクタに処理を記載すると思います。コンストラクタを複雑にするくらいなら、ファクトリという生成専門のオブジェクトを作って、生成されるオブジェクト自体のコンストラクタはきれいにしましょうって話。

感想

なんとなく頭で考えていたことをちゃんと体系立てて学べたなと感じました。これを読んで新しい考えがたくさん手に入るというよりは、頭の中を整理してもらえる感じ。プログラミング習いたての人が読んでも少し吸収するのは難しいかなといった印象です。何回かオブジェクト指向でプログラムを組んだことがあると、すんなり入ってくるかなと思います。個人的には設計云々の本は読んだことがなかったのでとても勉強になりました。ではまた!