ペンギン村 Tech Blog

技術をこよなく愛するエンジニア集団が在住するペンギン村から、世界へ役立つ(かもしれない)技術情報を発信する技術系ブログです。某アラレちゃんが済む村とは一切関係ありません。んちゃ!

『DDD物語』 〜つばさドメイン〜

あ=阿良々木くん、羽=羽川(元)委員長

これは僕が『DDD』について学びながら、自分なりにアウトプットした話でありフィクションであり、まぁつまるところどうでもよい独り言だ。

どちらでも良いし、どちらでも悪いかもしれない。

唯一、正しいのはこれを書いているのが僕の『意思』をもった記録であるということだけだろう。

つばさドメイン 其の壹

あ「なぁ羽川。DDDって知ってるか?」

羽「ん、星のカービィに出てくる環境破壊が楽しい人のこと?」

あ「違う。それはデデデ大王だ。しかもアニメ版限定の話だぞ」

羽「あぁ、ドメイン駆動設計(Domein-Driven Design)のことね」

あ「そうそう。お前は本当になんでも知ってるな」

羽「何でもは知らないわよ。知ってることだけ。それで、なんでいきなりDDDの話なんて始めたの?」

あ「あぁ、実はプログラミングスクールに最近通い出したんだけど、そこの課題で『DDDを使ってソフトを作れ』っていうのがあってさ」

羽「ははぁ、人間嫌いの阿良々木くんにしては意外なことを始めたものね」

あ「意外とは心外だな、僕も僕で僕なりに生き方を日々アップデートしてるんだぜ」

羽「それで課題は順調なの?」

あ「いやぁ、そいつがさっぱりでさ。というか僕にはDDDの概念自体もよくわからないんだよ。『Clean Architecture』とか『オニオンアーキテクチャ』ってのを設計に使うらしいのは分かったんだけど」

羽「うーん、10点」

あ「え?何がさ」

羽「何って、阿良々木くんのDDDの理解について」

あ「おいおい、冗談はよせよ羽川。たしかに僕はDDDについて初歩しか知らないけど『Clean Architecture』とかを使うのは当たり前の話だろ。某検索エンジンでググってもそういう情報ばっかり出てくるぜ」

羽「他人の情報に振り回されるなんて、阿良々木くんらしくないわね。DDDというのはねドメインに焦点をあてて、それをベース(駆動)にして、ソフトウェアを設計する手法のことなの。さっき阿良々木くんが言った『Clean Architecture』や『オニオンアーキテクチャ』は設計の1手段であってDDDの定義には含まれないわ」

あ「・・・」

羽「まぁ、もっともそれらのアーキテクチャと相性が良いのも事実ではあるわね。それらを使った設計やコードパターンにのみに注目して利用することを『軽量DDD』なんて呼んだりすることもあるらしいけれども」

あ「・・・」

羽「でも、それはドメインをベース(駆動)にしていない時点で、『DDD』という用語を使うのはふさわしくないと私は感じるわね。つまり、」

あ「すまん羽川。僕はお前が途中から日本語以外を喋りだしたんじゃないかと思うくらいにはDDDを分かってなかったかもしれない」

羽「ふむ、分かればよろしい。そしたらちょっと阿良々木くんにも分かるように『怪異』を例にして説明してみましょうか」

あ「お、そいつは助かる。頼むよ羽川」

つばさドメイン 其の貳

怪異・・・それは「蟹」であり「蝸牛」であり「猿」であり「蛇」でありそして・・・「猫」だった。

まぁ、これを読んでいる人は「化物語」シリーズを読んでいるだろうし、そのあたりの説明は不要だろう。

それに今だったらAmazon Primeで「傷物語」くらいまでは無料で観られんじゃないか?

羽「まずは『ドメイン』という言葉について説明しようかしら。阿良々木くんは『ドメイン』についてどれくらい知っている?」

あ「うーん、現実の物とか概念とかそういうものってイメージがあるな。例えば、『小説』で言えばラノベとかミステリとか『カテゴリ』があって『値段』を持っていて、みたいな」

羽「うん、イメージとしては間違っていないけど、少し具体的な說明に欠けるかもしれないわね」

あ「そうだな。実際『ドメイン』が何を意味しているのかはボンヤリとしか理解してないと思う」

羽「ところで阿良々木くんは、今まで様々な『怪異現象』を解決してきたじゃない」

あ「ん、まぁそうかもしれないな」

羽「阿良々木くん一人で解決したものもあるかもしれないけれど、殆どのケースでは忍野さんみたいな『専門家』の助けが必要だったと思うの」

あ「そうだな、実際僕一人の知識だけで解決できたものは殆どないと思う」

羽「そういう意味では『怪異現象』を解決するためには、『怪異現象』についての『専門知識』が必要と言えると思うの」

あ「うん」

羽「同じように『料理』をするなら『料理』についての『専門知識』が必要だし・・・他の多くのことも同じことが言えるわよね。そうした『特定の領域』のことを『ドメイン』、そこにおける知識をのことを『ドメイン知識』と呼ぶの」

あ「なるほど、でもそれは当たり前の話だし、それがどうやって『DDD』につながるんだ?」

羽「『怪異現象』を解決するためには『怪異現象』の専門知識が必要だったように。『ソフトウェア』である『問題』を解決するためには、その『問題』に対する『専門知識』が必要になるのよ」

あ「ふむ」

羽「専門知識をもって問題を解決するのは当然なんだけれど、問題は『コード』や『設計』と、その『専門知識』が対応しないことなの。『専門知識』をベースにして、それと『コード』や『設計』を対応させて分かりやすくさせようというのが『DDD』の基本的な考え方なの」

あ「なるほど、そういう意味だと『怪異現象』についての専門知識をもって、それに則った『対応』をするのと似てるのかもしれないな」

羽「さっきも話したけれど、そういう時は『専門家』のアドバイスが欲しくなると思うの。阿良々木くんが吸血鬼で不死身だからって、忍野さんみたいな専門家がいないと対処できないわけじゃない?」

あ「そうだな」

羽「そうした専門知識を持った人のことをDDDでは『ドメインエキスパート』と呼んだりするの。忍野さんであれば『怪異』というドメインにおいて、専門知識を持った『ドメインエキスパート』と言ったところね」

つばさドメイン 其の参

なるほど。『怪異現象』という『ドメイン』と、それの専門家である忍野のような『ドメインエキスパート』か。 そして、その『ドメイン知識』をソフトウェアの『設計』や『コード』に対応させる、と。 そこまで考えて僕は気づいた。いや、思い出したと言ったほうが正確かもしれない。

あ「なぁ、羽川。それって従来の『オブジェクト指向設計』と何が違うんだ?」

オブジェクト指向設計、OOP、Object Oriented Programming、それは現在もっとも主流となっているパラダイムだ。

オブジェクト指向の基本的な考え方は、現実世界にある『モノ』と似たような考えをコードに持ち込むというものだ。

これは『命令形プログラミング』に代わるものとして世間に受け入れられており、現在のプログラミング言語の殆どがそれをサポートしている。

継承とかポリモーフィズムについて触れるのはよしておこう。戦場ヶ原じゃないが『戦争』になるのは必死だ。

羽「ふふ、それはとっても良い質問だわ。阿良々木くん」

羽川は僕がその質問を発することをまるで知っていたかのように答えた。しかもどことなく嬉しそうだ。

まさか僕の通っているプログラミングスクールに一緒に通ってた、みたいなオチは無いだろうけど。

羽「確かに『オブジェクト指向設計』も現実の物や概念をモデリングして、それをコードで表現するという意味では似ているわね」

あ「だろ。僕には単に言葉を言い換えただけに感じるんだよ」

羽「ところで阿良々木くんは、オブジェクト指向を使ったらみんながみんな、同じようなコードを書くと思う?」

あ「それはないだろ。お題が与えられた作文だってみんな全然違うものになるのと一緒で」

羽「そう。『オブジェクト指向設計』と『DDD』は『モノ』に見立ててコードを書くという点では一緒かもしれない。でも、どうやって『モデリング』して、コードに落とし込むかについて、オブジェクト指向設計は何も言ってないのよ」

あ「?」

羽「結局、オブジェクト指向設計で開発するにしても、最終的にコードに至るまでの『経緯』というか『手段』については不足していたのよね。もちろんその手の考えが無いことは無かったけれど、決定打になるようなものはなかったのよ」

あ「なるほど、その決定打となるのが『DDD』ということか」

羽「まぁ、決定打と言い切るつもりは毛頭ないけれど、世の多くのプログラマに受け入れられているというのは事実かもしれないわね。みんなオブジェクト指向について理解はしつつ、具体的な『モデリング』や『コード』に落とし込む方法を模索していたわけよ」

あ「なるほど。『怪異』の倒し方は分かっているけど、そこに至るまでの具体的な『戦術』的なものが必要だったってわけか」

羽「『怪異現象』に無理やり当てはめるとしたらそんなところかしらね。まぁ、オブジェクト指向が唯一の正解ではないように、DDDもソフトウェア開発戦略のひとつと考えると分かりやすいかもしれないわね」

つばさドメイン 其の肆

なるほど、DDDは『ソフトウェア開発の方法のひとつ』で、言ってみれば『オブジェクト指向』の『実践方法』のようなものなのかもしれない。

いつになく僕の理解が早いのが気になるが、まぁ物語上の都合なのかもしれない。僕にとっては都合の良いことこの上ない。

あ「ところでついでに聞いておきたいんだけど、『モデリング』って一体何なんだ?プログラミングスクールの授業では『クラス図』とかのUMLが出てきた記憶があるんだけど」

羽「うーん、言葉で説明してもいいんだけど・・・そうね、ちょっと窓の外を見てみて阿良々木くん」

あ「ん?」

羽「校門の近くに女の子と、そのペットらしき『犬』がいるじゃない」

あ「ん、あぁ・・・いるな」

羽「試しにあの『犬』を疑似コードで表現してみてくれない?」

あぁ、オブジェクト指向の『例題』としてよく挙げられるやつか。

あ「おいおい羽川。僕だってプログラミングスクールに通ってるんだぜ。さすがにこれくらい僕だって分かるさ」

class Dog {
    private String name; // 名前
    private int age;     // 年齢
    public void walk() { ... } // 歩く
}

あ「こんなところだろ。さっきの話じゃないが、これこそ誰が書いたって同じコードになるぜ?」

羽「ふむ、Javaのコードね。アクセス修飾子もついてるし、阿良々木くんもしかして案外真面目に勉強してる?」

あ「案外とは心外だな」

羽「ところで」

スルーされた。

羽「なんで『体重』とか『品種』を入れなかったの?」

あ「ん、まぁ確かにそれもあっても良いかもしれないな」

僕はそう言いつつ2つの『フィールド』を追加した

羽「じゃぁ『毛の本数』とか『ノミの数は』?」

あ「おいおい羽川ちょっと待てよ!そんなの追加して誰が必要になるんだよ?」

羽「つまり、そういうことなのよ」

あ「え?」

つばさドメイン 其の伍

つまりね、と言いつつ羽川は說明を続けた。

羽「『モデリング』、まぁ『モデル化』とも言うけれども、ある事象から『都合のよいもの』のみを抜き取って『抽出化』することを言うのよ。今回で言うと、ソフトウェアを開発する上で『都合のよいもの』のみを抜き取って『抽象化』する、ということね」

あ「うーん、理屈は分かるけど、それってだいたいみんな同じ結果になるんじゃないか?オブジェクト指向は”現実の世界をそのままモデリングする”って話も聞いたし」

羽「ねぇ、阿良々木くん」

羽川は僕の話を半分さえぎるような形で言った。

羽「”現実の世界をそのままモデリングする”って本当にできると思う?」

あ「え?」

羽「例えば、阿良々木くんが今手にしてる『シャーペン』。それをそのままモデリングするってどういう意味だと思う?」

あ「それは・・・えぇと」

羽「ノックすれば芯が出る。シャーペンと聞いたらだいたいの人がそう思い浮かべるわよね。じゃぁ『色』や『材質』、あるいは『原材料』、もっと言ったら『分子』や『原子』の構成。いったい、どこまでを取り込んだら『そのまま』になるのかしら?」

僕は羽川の言わんとしていることが、だんだん分かってきた。

羽「”現実世界をそのまま表現する”というのはオブジェクト指向における『誤解』のひとつなのだけれど。誤解するまでもなく”そのままそっくり表現する”なんて、そもそも不可能なのよ」

そこまでの話を聞いて、僕は『八九寺真宵』のことを思い出していた。

羽「結局、自分たちがやりたいことにあった『データ』や『振る舞い』を抽出するしかないのよ。阿良々木くんはさっき『体重』と『品種』を追加したけれど、それは不要かもしれない。逆に『毛の本数』や『ノミの数』が重要になることもあるかもしれない。例えばそういう研究をしている人にとって、とかね」

そう、僕らは普段『自分の目で見えている』ものを『絶対的な真実』だと思いこんでしまう。僕は最初『八九寺』が怪異にあっていると思いこんでいたけれど、実はそうではなかったし。『僕』と『戦場ヶ原』は全く別の『事実』を見ていたこともあとから分かった。

羽「つまり、現実の世界から『ソフトウェアでやりたいこと』を実現する上で、『役立つ』要素だけを抽出することを『モデリング』というのよ」

あ「なるほどな。まだ理解がぼんやりしてるけれど、何が大切なのかは分かった気がするよ」

羽「うん、実際のところ『モデリング』はもっとも難しい部分と言えなくもないしね。私もこれだけの說明で十分だとは思っていないわ。ということで、今日はここまでね」

あ「え、これで『DDD』の說明は終わりってことか?」

羽「もう完全下校時刻の5分前よ、阿良々木くん。本当は『ユビキタス言語』の話もしたかったのだけれどね。また月曜日に会いましょう。バイバイ、阿良々木くん」

そう言って羽川は教室を素早く出ていった。全く相変わらず優等生だなと思う。 しかし、今回は羽川に感謝しなくちゃな。羽川は遠慮するだろうけど、今度ジュースの一本でもおごってやろうなんてことを考えつつ、同じように教室をあとにした。

(つづく?)

あとがき

これは僕がDDDを学びながら得られたと思ったことを連ツイした内容をブログとしてリライトしたものだ。それ以上でもそれ以下でもない(実際、添削もほぼしていない)。

僕はDDDを実践したことも無ければ、いわゆる『エヴァンス本』や『iDDD本』を読み終えているわけでもない。

しかし、『DDD』を面白く説明するコンテンツがあってもそれはそれでいいんじゃないかと僕は思うのだ。

written by @tobi462