みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
「ノンプログラマーのためのスキルアップ研究会」は、ノンプログラマーがプログラミングをはじめとするITスキルを学び合うコミュニティです。
さて、先日の定例会「ノンプログラマーのためのドメイン駆動設計超入門」のレポートをシリーズでお送りしております。
前回の記事はこちら。
ドメイン駆動設計との出会いと、ノンプログラマーにとても向いていて、いくつかの大きめの課題を解決してくれるのではないか!?という考察を繰り広げております。
さて、こうしてドメイン駆動設計を学び始めました。
ということで今回は、ドメイン駆動設計についてとその目的をノンプログラマー向けにわかりやすく解説します。
ちなみに当日の様子は以下、Togetterのツイートまとめもご覧くださいませ。
では、行ってみましょう!
前回のおさらい
まずは、前回のおさらいから。
ドメイン駆動設計はノンプログラマー向き!?
「現場で役立つシステム設計の原則」によると、ドメイン駆動設計とは以下のような方針のことです。
- 業務をオブジェクト指向で整理する
- 業務の表現と命名を一致させる(顧客、商品、注文、納期など)
- 開発者は業務知識と言葉を獲得すべき
- 分析と設計を同一人物が担当する
この方針での開発は、業務とその言葉の深い理解があり、要件から開発まですべてを担当することが多いノンプログラマーにはたいへん向いていると感じました。
ノンプログラマーのもやもやを解決してくれる
ノンプログラマーの開発の場合以下のような悩みがありました。
- 設計とは何をするものか、なぜ必要なのかがわかりづらい
- オブジェクト指向を使うメリット、活用場所がわかりづらい
しかし、ドメイン駆動設計は、その両方の課題に答えを出してくれるという強い期待感がありました。
ドメイン駆動設計の原典: エリック・エヴァンスのドメイン駆動設計
さて、これらを踏まえてより深くドメイン駆動設計を学ぶ必要があります。
そこで、ドメイン駆動設計の「原典」と呼ばれている以下書籍を手に取りました。
「エリック・エヴァンスのドメイン駆動設計」です。
576ページというなかなかのボリュームでかつ内容もなかなかなので、手に取るときは若干の覚悟が必要です。
以下、本書から学んだことのほんの一部ですが紹介します。
ドメイン駆動設計の前提
本書によると、ドメイン駆動設計の前提として以下があります。
- オブジェクト指向
- エクストリーム・プログラミング
オブジェクト指向については、以下の記事を参考いただければ。
エクストリーム・プログラミングというのは、アジャイル開発の一種で、コミュニケーション・フィードバック・シンプルさ・勇気という4つの価値を重視するというものです。
ドメイン駆動設計とは
ドメインとは
ドメイン駆動設計を知るには「ドメイン」とは何かを知る必要があります。
ソフトウェアにはそれぞれ配車管理、倉庫管理、会計管理など目的があります。
そのソフトウェアの対象となるビジネス領域のことをドメインといいます。
ドメイン駆動設計が成し遂げること
エリック・エヴァンスのドメイン駆動設計では、そのドメインに関連して以下のように伝えています。
- ソフトウェアの焦点はドメインに合わせるべき
- ただし、ドメインはそもそもめちゃくちゃ複雑である
- ドメイン駆動設計は、その複雑さに立ち向かうアプローチ
- そのためには、ドメインの深い知識が必要
- そして、複雑性との格闘は刺激的
本書の副題でも「ソフトウェアの核心にある複雑さに立ち向かう」とあるとおり、ソフトウェアを開発・運用する際の複雑さに立ち向かうための考え方であるということです。
繰り返しになりますが、要約すると以下のとおりです。
ソフトウェアが難しいのは、そもそもドメインが難しいからである、しかし、その複雑さには立ち向かう術があり、それがドメイン駆動設計だということです。
どのように複雑性に立ち向かうのか
しかし、どのようにその複雑性に立ち向かうのかという疑問があります。
ドメイン駆動設計では、ソフトウェアの複雑さをスポイルするために、「ドメインをオブジェクト指向的に整理する」という手順があり、ここがとても重要視されています。
ドメインモデルとは
この「ドメインをオブジェクト指向的に整理する」という手順を経て、できあがるのがドメインモデルです。
ドメインモデルとは、ドメインから本質的な部分のみを選び抜いたもの(これを抽象化といいます)です。
ドメインをそのままソフトウェアに持ち込むと複雑になります。
ですから、その中から重要な部分のみを抽出し、余計な部分を捨てます。
さらに、その本質性を高める方向で、できる限りその複雑性をスポイルするような構造にします。
この手順については、具体的には以下のように説明されています。
- ドメインモデルとは、ドメインの要素(ドメインオブジェクト)とその関係である→オブジェクト指向で表現しやすい
- 共通言語(ユビキタス言語)を使用する→ドメインとコードの言葉が統一される
- ドメインモデルの詳細はコードに表現される→モデルとコードが一致する
ドメイン駆動設計における設計とは
つまり、ドメイン駆動設計における設計とは、以下のような作業であるといえます。
- 複雑なドメインから本質を捉える
- 複雑さをなくして実装に落とし込む
ドメインモデルはドメインの本質を表現するはずですが、もし改善点が見つかれば、積極的にドメインモデルを直します。
コードはドメインモデルを反映しており、かつその複雑性はスポイルされていますから、変更が容易です。
ですから、アジャイル的にソフトウェアを改善していくことができます。
このようにして、ドメインモデルをうまく作り、ベストのものにしていくことが、ドメイン駆動設計におけるもっとも重要な活動となります。
まとめ
以上、ドメイン駆動設計についてとその目的をノンプログラマー向けにわかりやすく解説しました。
さて、実際にコードを書き始める前に、実はもうひとつノンプログラマーが学ぶべき理由についての発見がありました。
次回は、その点についてお伝えしていきます。
どうぞお楽しみに!