はじめに
本投稿より「ドメイン駆動設計入門」について週1~2本くらいの投稿ペースで読み進めていきます。適宜気になったポイントや大事だなと感じた点を記事に記載していく予定です。
※本のリンクはこちら
今日の内容
chapter1 : ドメイン駆動設計とは
ドメイン駆動設計とは何か
ドメイン駆動設計は、エリック・エヴァンズが提唱した、ユーザが従事する業務に合わせてソフトウェアを開発する手法。
知識は取捨選択される必要があります。そして、ユーザにとって役に立つソフトウェアを開発するためには、価値ある知識と無価値な知識を慎重に選り分けて、選び抜かれた知識をコードに落とし込む必要があります。
価値あるソフトウェアを構築するには、利用者の問題を見極め、解決するための最善手を常に考える必要があり、ドメイン駆動設計は、上記のような洞察を繰り返しながら設計し、ユーザとそのユーザを取り巻く環境を実装を結びつけることを目的としている。
ドメインモデルとは何か
モデルとは現実の事象あるいは概念を抽象化した概念である。現実をすべて忠実に再現できるわけではないため、必要に応じて取捨選択する必要がある。ex."ペン"という言葉の性質を抽出するとき、小説家にとっては「文字を書くもの」であり、文房具屋にとっては「商品」である
ドメイン駆動設計では、ドメインの概念をモデリングして得られたモデルをドメインモデルと呼ぶ。
※ドメインモデルはあくまでも概念を抽出化した知識に留まる。なにかしらの媒体で表現することで問題解決の力を得ることができる
ドメインモデルをソフトウェアで動作するモジュールとして表現したものがドメインオブジェクトです。
どのドメインモデルをドメインオブジェクトとして実装するかは重要な問題で、開発者は真に役立つモデルを取捨選択する必要があります。利用ユーザの問題解決に何ら関わりのないものを、ドメインオブジェクトとして実践するのは時間の無駄となってしまいます。
ドメイン駆動設計の実践を難しくするもの
ドメイン駆動設計はソフトウェア開発をテーマにしている。ソフトウェア開発の現場には、関係者が複数存在する。ドメイン駆動設計のトピックは実装だけにとどまらず、関係者とのコミュニケーションやチームビルディングと密接に関わるものが存在する。開発者個人だけでなく、多くの関係者を巻き込む必要があるといえる。
実際に上記で記載したドメインモデルを形作る作業を開発者だけで完結することは不可能です。ドメインの概念に対するとらえ方はドメインの実践者の視点が欠かせない。
またドメイン駆動設計にかかわらず、設計はある種の理想としての側面がある。重要なのは理想を無理やり現実に当て込むことではなく、現実に適合させるために、とるべき手段を考え選択すること。理想を掲げ、妥協しなくてはならないときに、どこを妥協するのか悩むのもまたソフトウェア開発の楽しみの一つである。
なぜいま、ドメイン駆動設計か
ソフトウェアは変化するもの。ごく最初期の局所的な開発速度を優先したソフトウェアは、柔軟性に乏しく、変化を吸収しきれない。
ドメイン駆動設計はドメインと向き合うことで分析から設計そして、かいはつまでが相互作用的に影響し合うよう努力を重ねることを求めており、
ソフトウェアの最初期よりも、変化に対応するときに真価があらわれる。プログラムは動かすだけなら簡単だが、動かし続けることは難しい代物であり、システムを長期的に運用したいならば、ドメイン駆動設計をいまこそ学ぶべきである。
本書以外の参考
・ドメイン駆動設計入門【DDDをわかりやすく解説】
https://rakusui.org/ddd/
・ドメイン駆動設計とは何なのか? ユーザーの業務知識をコードで表現する開発手法について
https://codezine.jp/article/detail/11968