以前「上手なクラス分けをするために頑張ることをまとめてみた。」という記事を書いたのですが、まあまあな時間が経ってしまっていました。
その頃からDDDの本を読んでみたらいいかも〜、と先輩に薦められていたのですがなかなか後回しになってしまい、、、
やっと最近読み始めることができました。
それにしても抽象的すぎて難しい…
少しずつでも理解していきたいので自分の言葉でまとめていこうと思います。
ドメイン駆動設計ってなに?
そもそも、ドメインってなに?という疑問になりました。
「ドメインとは」で調べてみると、
ドメインはインターネット上の住所
Webサイトがどこにあるのかを判別する情報は、ドメインに紐づく「IPアドレス」というものにあり、数字だけでは覚えづらいため、ドメイン名に変換してWebサイトの場所を示す。
という内容で出てきました。
なんか違うっぽい。
技術書によると、ソフトウェア開発におけるドメインとは、
ドメインの知識に焦点をあてた設計手法です。
「プログラムを適用する対象となる領域」を指し、重要なのはドメインが何かではなく、ドメインに含まれるものが何か、です。
とのこと。
技術書に書いてある内容を頑張って噛み砕いて、考えてみます。
そして今現在の私のイメージを具体化していきます。
学校を例にイメージしてみる
学校を例に考えてみます。
学校には様々な人と、システムがあります。
生徒、生徒の親、教師、部活のコーチ、用務員、事務員…
クラス管理、成績管理、行事管理、時間割管理、部活管理…
学校に何があるかなということを上記のように思いついた事を書き出してみたのですが、「教科が教師情報と結びついて?全クラスに時間割があってその時間割に教師が結びついて???学校のシステム難しすぎ」
ということでもう少し絞り、「部活」に焦点をあててみます。
「部活に所属している全生徒の戦績を管理したい」という要望があったと想定し、「全校生徒の部活戦績管理システム」を開発することとなりました。
「全校生徒の部活戦績管理システム」という領域(ドメイン)の知識に焦点をあてた設計手法(ドメイン駆動設計)で設計で、です。
領域に関連する知識に焦点をあてるとは?
技術書より引用すると、
ソフトウェアの目的は利用者のドメインにおける何らかの問題の解決です。
彼らが直面している問題を解決するためには、利用者が何に困っていて何を解決したいのか、彼らの考え方や視点、取り巻く環境を真に理解する必要がある。
つまり、「全校生徒の部活戦績管理システム」を最新技術を使って効率よく実現できたとしても、問題点が解決していなかったらドメイン駆動設計はうまくいっていない、ということです。
これを防ぐために、「全校生徒の部活戦績管理システム」という領域(ドメイン)と向き合い、どういう知識が必要なのか、そしてその知識に焦点をあてて設計をする。→ドメイン駆動設計
ということです。
もう少し上の例で考えてみると、
○○中学校の生徒の部活戦績システムにおいて、
2000年度の中学1年生〜中学3年生の部活戦績しか確認できないシステムだとどうでしょう?
利用者は本当に2000年度に在籍している生徒のみ分かればいいのでしょうか。
毎年生徒は入学し、卒業していくのでもちろん生徒情報は毎年更新されるはずです。
あらかじめ利用者の問題点をきちんと洗い出し、実現させるためにはどういう知識が必要なのかを理解し、設計することが大事ということです。
こう書いてみると、あまり大したことは書いていない気がしています。
現状の理解度の確認ということで。