ドメインを純粋に保つ(6) ビジネス概念とダニ

「そんなに単純なクラス、わざわざドメイン層に隔離するほどのものですか?」
『ドメインを純粋に保つ』で説明したような設計・開発・保守の営みを推進しようとして、IssueStatusのようなビジネス概念を設計していると、この手の指摘を受けることがあります。中身はコンストラクタと数個のメソッドだけ。値もopened / working / doneの3つだけ。それをわざわざ専用のディレクトリに切り出し、専用のテストファイルまで用意する。「コントローラに数行書けば済む話では?」と言われると、ドメイン領域の重要な概念だから十分価値があると信じているとはいえ、コストが増えることは確実であるというのもあり、説明の説得力に自信がない自分がいました。
この記事では、その「うまく説明できなかったもの」に、思わぬところから輪郭を与えてくれた話を紹介したいと思います。
ダニの世界には、3つのことしかない
生物学者ヤーコプ・フォン・ユクスキュルが紹介した、マダニの話があります。(生物から見た世界 (岩波文庫 青 943-1))
マダニは目が見えず、耳も聞こえません。彼らが感知できるのは、次の3つだけだそうです。
- 哺乳類の皮膚から発せられる、ある種の匂い
- 37℃前後という温度
- 触覚
これだけです。色も、形も、音も、匂いの種類も、マダニにとっては存在しないのと同じです。匂いを感知したら木の枝から落下し、温かいものに触れたら、そこに口を刺す。これがマダニの世界のほぼすべてです。
生物学者ユクスキュルは、この「その生き物が感知し、反応する対象だけで構成された世界」を環世界(Umwelt)と呼びました。同じ森の中にいても、人間の環世界には木々の色や鳥の声が存在しますが、マダニの環世界には存在しません。逆にマダニの環世界にある「あの匂い」は、人間の環世界にはほとんど意識にのぼりません。同じ場所にいても、生き物ごとに違う世界を生きている、というのが環世界という考え方です。
最初にこの話を読み始めたとき、正直に言うと「感覚器官が少なく、できることが限られた、原始的な生き物だ」と理解しました。人間が感じている豊かな世界のほんの一部しか、マダニは感じられていないのだなと。
「削られた」のではなく「完結している」
しかしこの理解は少しずれているというか、「人間の環世界をベースにマダニの環世界を理解しようとする」という、多くの人が自然に犯しがちな間違った態度だったのです。
マダニの環世界は、人間の環世界から何かを差し引いた、劣化版・縮小版ではありません。むしろこの3つの知覚だけでできた環世界は、マダニという生き物にとって、過不足なく完結した世界です。
匂い・温度・触覚。この3つの組み合わせは、マダニが生き延び、子孫を残すために必要なことの一切合切をカバーしています。それ以上のもの(色や音)は、「本当は必要だが省略された」ものではなく、そもそもマダニの世界には最初から存在しないことが正しいのです。
大きさが小さいことと、重要度が低いことは、まったく別の話です。マダニの世界がたった3つの知覚でできているからといって、その3つを軽く扱ってよい理由には全くなりません。むしろこの3つは、マダニにとって生存競争を生き抜くために、これ以上削れないうえに十分な核だからこそ、専用の器官・専用の神経系がそのためだけに用意されているのです。
ビジネス概念IssueStatusに戻る
この話を知ってから、ビジネス概念のIssueStatusクラスをあらためて見直しました。
現実のIssueドメインには、担当者、優先度、コメント履歴、添付ファイルなど、無数の属性がありえます。しかしIssueStatusが扱うのは、状態というたった一つの知識を纏めたものであり機能も最小限です。
これは「本当はもっと複雑な概念を、簡略化して扱っている」という妥協ではありません。状態についての知識は、Issue管理というドメインの中で、それ自体で過不足なく完結した本質であると言えます。だからこそ、これだけを独立させて、他の何にも依存しない専用の場所に置く価値があります。
『ドメインを純粋に保つ』シリーズでは、こうして実装から抽出した対象を「ビジネス概念」と呼んでいました。この言葉も、環世界という考え方を借りると少し輪郭がはっきりします。ビジネス概念とは、いわばドメインという世界の中で、そのビジネス概念独自の環世界を構成する知覚と機能を持つ存在です。
「ビジネス概念を抽出する営み」と、「その生き物が感知し、反応する対象だけで構成された世界(環世界)を理解すること」との類似点が見えてこないでしょうか?
クラスの大きさと、隔離する価値は別の軸
ここであらためて、冒頭の指摘に戻ります。
「こんな単純なクラス、わざわざ隔離するほどのものか?」という問いは、無意識のうちに「クラスが小さい」ことと「隔離するコストに見合わない」ことを、同じ軸の上に並べています。しかしマダニの例が示しているのは、この2つはそもそも別の軸だということです。
問うべきなのは「このクラスは何行あるか」ではなく、「このビジネス概念は、このドメインの生存(つまり正しい業務ルールの遂行)にとって、どれだけ核心的か」です。IssueStatusが3行だろうと30行だろうと関係ありません。状態遷移のルールを間違えれば、業務そのものが破綻します。だからこそ、たとえ小さくても、専用の場所で守られる価値があります。
むしろ小ささは、それが不要である証拠ではなく、それだけ凝縮された核である証拠だと捉え直すこともできます。マダニが3つの知覚のためだけに専用の器官を持つように、状態のためだけに専用のクラスとテストを用意することも、同じ理屈で正当化できます。
「純粋に保つ」の意味を、あらためて
「ドメインを純粋に保つ」というスローガンを、この視点であらためて言い直すなら、こうなります。
「複雑なものを丁寧に単純化する」ということではなく、「そのドメインにとって過不足なく完結している概念を見きわめ、その大きさに関わらず、専用の場所で守り抜く」ということ。
小さいから後回しでいい、わざわざ隔離するまでもない、という判断は、実は隠れたところで「大きさ=重要度」という誤った前提に乗ってしまっています。
マダニに環世界があるように、私たちが向き合うドメインにも、それぞれの環世界を持つビジネス概念があります。「純粋に保つ」という作業は、その環世界を丁寧に見きわめ、コードという形で守り抜く作業なのだと思います。
おわりに
最近、哲学史についての解説をしているYouTube動画を観たり、『生物から見た世界 』 という本を読んだりして哲学的な思考に興味を持つようになりました。ユクスキュルの提示した「環世界」は、哲学者カントから影響を受けていて、ユクスキュルは生物学から哲学へ大きな影響を与えた人物としても知られているそうです。
YouTube動画で解説を聞いて、疑問や理解できないことがあれば、動画を止めて生成AIチャットで質問して理解度を上げてから、動画の続きを見るみたいなことをしてます。知らない分野のことを学ぶハードルが低くなって楽しいです。
「ドメインを純粋に保つ」はシリーズ化してますので、他記事もご覧ください。