[プログラミング用語]ドメインとはなにか(ドメイン駆動設計編)

プログラミング

どうも。つじけ(tsujikenzo)です。このシリーズでは「ドメインとはなにか」について全3回でお送りします。今日は3回目です。

前回のおさらい

前回は、「ドメインとはなにか(データベース編)」 をお送りしました。

今回は、最終回で、「ドメインとはなにか(ドメイン駆動設計編)」 をお送りします。

今回のアジェンダ

  • ドメインとドメインエキスパート
  • プログラミングにおけるドメイン
  • ドメインに含まれるもの
  • ドメインモデル

ドメインとドメインエキスパート

書籍「エリック・エヴァンスのドメイン駆動設計」では、ドメインを知識、影響、または活動の領域と定義しています。

また、ドメインエキスパートは、アプリケーションのドメインの担当者。その対象に関する深い知識を持っているとしています。

単に、ドメインを「業務領域」や「活動範囲」と定義すると、ドメインエキスパートは「勤続年数20年の経理のベテランAさん」というイメージがわくでしょう。

しかし、ドメインを「知識、影響」にまで広げると、「テレビアニメの視聴率に詳しい人」、「石油会社と交渉して、仕入燃料代を決める権限を持つ人」などもドメインエキスパートになっていくでしょう。

いまのところ、そこまで深く考える必要はなく、ドメインとは 「業務の範囲のこと」 なのかな。ドメインエキスパートとは 「業務に詳しい人」 なのかな。という感じでも問題ないと思います。

プログラミングにおけるドメイン

業務アプリケーションを作成するときは、対象となる課題があるはずです。

そして、その課題には対象があり、対象を取り巻くドメイン(業務の範囲)があるはずです。

たとえば、「注文された商品を発送するさいに、配送業者に1件1件集荷依頼をするのが大変」、という課題があります。

もし、それを解決する業務アプリケーションを作成したなら、アプリの利用者がいるはずです。

利用者は、商品の梱包作業をしているパートさんかもしれませんし、最終検品作業をする社員かもしれません。

そのパートさんや社員は、恐らく「製造部」か「配送センター」に所属しているでしょう。

つまり、プログラミングにおけるドメインとは、業務アプリケーションを実際に利用する利用者が所属している部、とイメージすると近いかもしれません。

「商品を発送する」という業務は、製造部や、配送センターの最終的な業務でしょう。

決して「人事部」や「出向先の情報システム部」に所属するメンバーの活動ではないと思います。

ドメインに含まれるもの

ただし、大切なのは、ドメインとは「製造部」のことね、というふうに業務の範囲を決めることではありません。

製造部には、どんなモノがふくまれており、どんな活動をして、配送業者に集荷依頼をするのかを考える必要があります。

また、ドメインには、「商品」や「送り状」という現実世界のモノだけにかぎらず、「送り状No」や「季節によって最終の集荷時刻は変わる」というデータやルールも含まれています。

プログラミングとドメインの接点は、ドメインにふくまれるモノやデータやルールを、オブジェクトとして整理していく ドメインオブジェクト にあります。

「送料」オブジェクトや、「注文」オブジェクトを作っていく、と考えるとイメージしやすいかもしれません。

ドメインモデル

そして、業務アプリケーションの対象領域(ドメイン)を、オブジェクトのモデルとして整理したものをドメインモデルと呼びます。  引用元:現場で役立つシステム設計の原則 増田亨

ドメインモデルは、ドメインで抱えている課題を解決するために、業務を抽象化して、整理したものです。

抽象化とは、「日本郵便札幌支店の集荷センターに電話する」という具体的な業務を、「配送業者に連絡する」とか「集荷依頼」のように抽象的に表現することです。

抽象化は、これといった正解がなく、初心者にはむずかしいかもしれません。(わたしも知識がありません)

これは、実際にドメインモデルを作っていく中で、たくさん経験していければなと思います。

まとめ

以上で、ドメインとはなにか(ドメイン駆動設計編)をお届けしました。

最後は、ドメイン駆動設計の入口になる、ドメインオブジェクトや、ドメインモデルについても少し触れました。

さて、いよいよ、ドメイン駆動設計とはなにか、というシリーズが始まります。

ドメイン駆動設計を理解するには、3~5年ぐらいかかるのかなぁという覚悟もあります。笑

実務に落とし込みながら、楽しんでいきたいと思います。

おたのしみに。

参考資料

このシリーズの目次

  1. [プログラミング用語]ドメインとはなにか(インターネット編)
  2. [プログラミング用語]ドメインとはなにか(データベース編)
  3. [プログラミング用語]ドメインとはなにか(ドメイン駆動設計編)
タイトルとURLをコピーしました