はじめに
本記事は、『ドメイン駆動設計(DDD)』について少し勉強し始めた筆者が学ぶ中で「わからん!」→「なるほど!」と思ったことを書いたものです。
間違っていたらそっと教えていただけると幸いです。
なんで言語の話になるんだ
最初にDDDについて、かる~く学んだ時に、よくわからなかったんですよね。
「エンティティとか値オブジェクトとかは、ドメインの要素って感じで、まあなんとなくわかる(あまりわかっていない)。
だけど、ユビキタス言語って何? わたしは設計について学んでるはずなのに、なんで言語の話になるの?」
というわけで、ちょっと調べ直してみました。
知識の範囲が違う人たちとの、共通のコミュニケーション手段
人間なので、話し相手と認識がずれている、ということはありますよね。
例えば、わたしの住んでいるところの方言では、机を運ぶことを「机をつる」といいます。
この方言を、全然別の地域の人相手に使ったとしましょう。絶対に伝わりません。
わたしの話を聞いている人の頭の中にはきっと、わたしが一生懸命釣り竿で机を釣り上げようとしている姿が浮かんでいることでしょう。
別の例を挙げます。
最近話題のChatGPTを使いたいという非エンジニアの家族。「普通に『ChatGPT』で検索してアクセスすれば使えるよー」と教えました。
しかし「使えない! 検索してもどれかわからない!」と言います。
そこでスマホの画面を見せてもらったところ、表示されていたのはGoogleではなくAppStore。
家族は、そもそもChatGPTがWebサービスだと気付いていなかったのです(一応今はアプリがリリースされています。この会話をした当時はまだでした)。
家族はChatGPTをスマートフォンアプリだと思っていたので、「普通に『ChatGPT』で検索してアクセスすれば使えるよー」という言葉を聞いて、アプリのストアを開き、スマートフォンアプリを『検索』していたのです。
知識を持っている範囲が違うと、同じ言葉であっても思い浮かべていることが違ってしまうことは起こり得ます。
さて、システムの開発者も利用者もすべて全く同じITのドメインの知識を持っている人なのであれば、もしかすると認識のずれは少ないかもしれませんが、実際にはそんなことはありません。
全然違う業種の業務効率化を狙うシステムを開発するときには、知識のドメインが全然違うお客様(=ドメインエキスパート)と開発者との間でなんとか頑張って会話を成り立たせて、システムを作り上げなければならないのです。
そのとき、ドメインエキスパートと開発者の間で、共通のコミュニケーション手段として使用するのがユビキタス言語です。
例
本を販売するECサイトを例とします。
まず、「本を販売するサイト」なので、販売するアイテムの名前は『本』です。それをドメインエキスパートと開発者の間で合意、共有します。これにより、このECサイトで販売するアイテムの名前は『本』と呼ばれるようになります。
「本でも、書籍でも別に変わらなくない?」と思うかもしれませんが、『本』です。
我々開発者は『本』=『書籍』と思っているかもしれません。しかし、本のことにとても詳しいドメインエキスパートは、『書籍』=『雑誌ではない本』と認識しているかもしれないのです。
開発者側が販売するアイテムのことを『本』のつもりで『書籍』と表現してしまえば、その時点でドメインエキスパートの認識との間に差異が生じます。私たちが『すべての本』の話をしている間に、ドメインエキスパートは『雑誌ではないすべての本』のことを思い浮かべている可能性があるのです。
他にも、サイトに登録した人を『ユーザー』と呼ぶ、本の在庫が全ての店舗でなくなったことを『在庫切れ』と表現する、など、本に詳しいドメインエキスパートとシステム開発に詳しい開発者が、ドメインに関する用語を定義、共有することで、ドメインに関する正確な知識を得てコミュニケーションを取りやすくし、システムの要件がズレてしまうことを防ぐのです。
さいごに
DDD触りたての頃は何のためにあるものなのか全然わかっていなかったのですが(なんで共通の言語を取り決める必要があるの?ということが理解できず……)、開発経験を積んだり、DDDの本を読んだりしていくうちに何となく重要性が分かるようになっていったように思います。
とはいえ、今回の記事、特に自信がないです。全然違う点があればそっとご指摘ください。