はむ
エンジニアとして仕事をしていると、この機能って本当に必要なのかな?と思ってしまうことがあります。どのようにサービスを捉えてシステムに落とし込んでいけばいいのでしょうか?
まさに、エンジニアにとって本質的な悩みですよね。考え方の一つとして「ドメイン駆動設計」があります!
なぜドメイン駆動設計が必要なのか
長期的にサービスを運用するには変化に対応できる設計が必要だからです。
一昔前は、サービスを少しでも早くリリースすることが求められていました。エンジニアはサービス自体を理解せず、依頼者はソフトウェアを理解せずに制作が進められました。
その結果、初期開発速度は早いものの、不要な機能をつくったり、サービスを変化させようとしたときに柔軟に対応できずに、つぎはぎの修正を繰り返すことになってしまいました。
長期的な運用を考えたとき、サービス開発者、現場で働く人やエンジニアが「本当に必要な課題、解決策は何なのか」を考え尽くしてソフトウェアに落とし込むことが必要になります。
ドメイン駆動設計は、「ビジネス視点でソフトウェアを開発する手法」だと言えます。
ドメイン駆動設計とは何か
ドメイン駆動設計とは「サービス利用者の課題を見極め、改善を繰り返しながら実装に落とし込む設計手法」です。
詳しく見ていきましょう!
ドメイン
ドメイン駆動設計の「ドメイン(領域)」がまずわかりませんよね。
ドメインとは「プログラムを適用する対象となる領域」です。うーん。まだわかりにくい。。。
民泊サービスのAirbnbで考えて見ると、以下がドメインと言えそうです。
- 民家
- 所有者と利用者
民家の貸し出しをするために、価格を決める・日時を決める必要があります。所有者と利用者がマッチングして、やり取りをする必要もあります。
ドメインモデル
ドメインから必要な知識を抽出した結果をドメインモデルといいます。
ドメインを見定めたら、サービス利用者が抱えている課題に向き合い、必要な知識に焦点を当てます。ここでいう「必要な知識」とは何でしょうか?
サービスは「何か」に対する課題を解決するためにつくられます。例えば、民泊サービスのAirbnbは「空いている部屋がもったいない」「ホテルより安く泊まりたい」といった課題がありました。
民家というドメインに対して、「空いている部屋がもったいない」という課題がある。それなら「空いている部屋を貸し出せる仕組みがあるといい」という知識が抽出されます。
「空いている部屋を貸し出せる仕組み」を実現するために、「貸し出し者の情報、利用者の情報、部屋の情報、宿泊日、空室情報、金額」が必要だ!という具合に、ドメインから必要な知識を抽出してソフトウェアに反映させていきます。
ドメインオブジェクト
ドメインモデルとして抽出した知識をソフトウェアで動作するようにプログラムに落とし込んだものをドメインオブジェクトと言いいます。
ドメインオブジェクトを変更するときには、必ずドメインで変化が生じて、ドメインモデルに変化が起きています。
「安心して部屋を貸し借りしたい」という課題が発生した場合、「貸し出し者・利用者のレビューが見られるようにする、評価が高い貸し出し者にはスーパーホストの称号を与える」どいったドメインモデルができます。
その結果として、プログラムも変更されることになり、ドメインオブジェクトが変更されることになります。
まとめ
最後にまとめていきましょう!
ドメイン駆動設計
「サービス利用者の課題を見極め、改善を繰り返しながら実装に落とし込む設計手法」
ドメイン
「プログラムを適用する対象となる領域」
ドメインモデル
ドメインから必要な知識を抽出した結果
ドメインオブジェクト
ドメインモデルとして抽出した知識をソフトウェアで動作するようにプログラムに落とし込んだもの
今回参考とさせていただいたのは「ドメイン駆動設計入門 ボトムアップでわかる!ドメイン駆動設計の基本」です。
個人的な解釈やわかりやすく伝えるために正確性がない部分があります。もっと詳しく学びたい方はぜひ読んでみてください!
コメント