モデルとは何か

「Model View Controller」や「モデル駆動」など、ごく当たり前に使用されるようになった「モデル」という言葉をDDDに準拠しながら再考する。

導入

オブジェクト指向」「モデル駆動」「ドメイン駆動」という表現はすっかり日本語として定着しており、ある一定の共通認識も出来上がってきているように感じます。しかし、「オブジェクト」「モデル」「ドメイン」という概念が本当にきちんと日本語としての文脈の中に位置づけられているのかというと、結構怪しいことも多いのではないでしょうか。このあいまいさの原因ははっきりしていて、向こうの国で膨大な文脈の中に位置づけられている単語を日本語にすることなく、なんとなくカタカナで表現してしまっていることでしょう。もっとも、この悪い癖は今に始まったことではなく、「エラン・ヴィタール」や「ルサンチマン」に見られるように、それなりの歴史があるのかもしれませんが。


さて、皮肉はこれくらいにして、今回のエントリではこのよく分からない「モデル」という言葉を取りあげ、古典であるDDDでの議論を追いながら、それなりに明快に定義することを試みることにします。

Domain-Driven Design: Tackling Complexity in the Heart of Software

Domain-Driven Design: Tackling Complexity in the Heart of Software

考察

エバンスはDDDの中で、モデルについて次のように説明しています。

Maps are models, and every model represents some aspect of reality or an idea that is of interest. A model is a simplification. It is an interpretation of reality that abstracts the aspects relevant to solving the problem at hand and ignores extraneous detail.


地図はどれもモデルであって、つまり、どんなモデルも現実のある側面や興味対象の観念を表しているのです。モデルというものは「単純化」です。現実を解釈することによって、目の前の問題を解決する上で重要となる側面を抽象化し、その他の本質的ではない細かいことを切り捨てることができるのです。
Evans, E., 2004, Domain-Driven DESIGN, Addison Wesley, p.2

つまり、モデルとは「特定の視点から現実を切り取ったもの」である、と、まずは言うことができると思います。ここで言われている「現実」を理解する上で重要な概念が「ドメイン」です。

Yet the most significant complexity of many applications is not technical. It is in the domain itself, the activity or business of the user. When this domain complexity is not handled in the design, it won't matter that the infrastructural technology is well conceived. A successful design must systematically deal with this central aspect of the software.


しかし多くのアプリケーションにおいて、もっとも重要となる複雑なものとは技術的なものではありません。そうではなくて、ドメインそれ自体なのです。ドメインとはつまりユーザの活動ないし業務のことです。このドメインの複雑さが設計で対処されなければ、基盤技術がどれほどうまいこと描かれていようとあまり関係ありません。デザインを成功させようとするならば、このソフトウェアにおける中心的な側面を体系的に扱わなければならないのです。
Evans, DDD, p.xxi

ドメインもなかなかすっきりとした日本語訳がありませんが、抽象的にとらえるなら「圏」という漢字が適切かもしれません。他にもドメインに関しては、後半の用語集で「知識、影響、活動の領域」と定義されています。ここで着目するべきことは、知識や活動といったものに対して明確に範囲が意識されていることでしょう。日本語で「知識」というと、比較的広範囲にわたる「知っていること」というニュアンスであるのに対し、カタカナで「ナレッジ」と言った場合にはもう少し範囲が特定された領域における体系的な問題解決技法を指しているような気がする、ということとも関係しているかもしれません。いずれにしてもここで重要なのは、モデルが「ドメインのモデルである」ということです。


それでも相変わらず適切な日本語が見当たりません。モデルが特定の問題領域を抽象化したものであるというのであれば、「模型」「雛形」「青写真」といった単語がそれなりに当てはまりそうなものですが、いずれもどうもしっくり来ません。この違和感の原因を探るためにモデルの中身に目を向けてみます。

The domain model is a set of concepts. The "domain layer" is the manifestation of that model and all directly related design elements. The design and implementation of business logic constitute the domain layer. In a MODEL-DRIVEN DESIGN, the software constructs of the domain layer mirror the model concepts.


ドメインモデルとは諸概念の集合体です。ここでいう「ドメインレイヤ」とは、モデルと、設計要素に直接関係づけられたあらゆるものを明示したものなのです。この設計とビジネスロジックの実装がドメインレイヤを形成します。「モデル駆動デザイン」において、ソフトウェアはモデルの諸概念を映し出すドメインレイヤから組み上げられているのです。
Evans, DDD, p.75

つまり、ドメインモデルは「概念が集まって構築されたもの」なんですね。「模型」や「雛形」というどちらかと言えば外側から見た形を意味する言葉がつかみきれていないのも、まさにこの部分であると言うことができると思います。


さて、ここまで考えてきた事を要約すると、「モデルとは、対象領域を表象する構築された諸概念の集合体である。」と定義することができるのではないでしょうか。


なお、エバンスにとって「オブジェクト指向」とはこのような性質のモデルを適切に実装するための非常に優れたパラダイムです。

Object-oriented programming is powerful because it is based on a modeling paradigm, and it provides implementations of the model constructs. As far as the programmer is concerned, objects really exist in memory, the have associations with other objects, they are organized into classes, and they provide behavior available by messaging.


オブジェクト指向プログラミングが強力なのは、モデリングパラダイムに根差し、モデルの構造に実装をもたらすことができるからです。プログラマにとっては、オブジェクトは実際にメモリ上に存在しており、他のオブジェクトと関連を持ち、クラスにまとめあげられ、メッセージングによって利用できる振る舞いを提供するのです。
Evans, DDD, p.51

所感

結局最後まで「モデル」を一言で表現できる日本語は見つかりませんでした*1。ある意味で「概念の構築」という考え方自体が西欧起源であるとは言えると思いますが、もちろん、このことを短絡的に「西洋人は理論的で日本人は情緒的」という暴力的な二元論に結びつけるつもりはありません。日本語には日本語なりに「大局観」や「そもそも論」(?)などと言った、何かしら通じ合う言葉があるはずです。ただ、大局観は時間軸の中での「優劣評価」を行う感性、そもそも論は根源をつきつめる「姿勢」を表しているといった具合に、現象の切り取り方が少し違うんですね。そのような「切り取り方の違い」を前提とした上で概念を輸入する時に重要なのは、とりあえず一対一に対応する日本語を割り当てて満足することではなく、その概念が置かれている文脈全体を自分たちの言葉でとらえ返すことなのではないでしょうか。


もっとも、エバンスにしてみれば、そういう風にとらえ返された構造がまさしく「モデル」なのであり、そうやって文脈全体をとらえる試みが「モデル駆動」なのかもしれませんね。

*1:強いて言えば、「概要」や「全体構造」といった言葉が表しているものが近いのかもしれません。