ドメインの本質

私は仕事でオブジェクト指向を使っていますが、オブジェクト指向の理論を学んでも、上手く実践に活かせず、つまずいてしまうことがよくあります。ここでは、どのようなことにつまずいたか、なぜつまずいたのかを書いていこうと思います。(もちろん、今でもオブジェクト指向に限らずソフトウェア開発全般でいろいろな四苦八苦しているんですが)

初めてオブジェクト指向開発について教わったとき、私がもっともつまずいたのは「ドメインの本質」という考え方でした。ドメインとはソフトウェアプログラムが解決すべき問題を専門分野ごとに分割したもので、たとえばインターネットのショッピングサイトであれば発注、在庫管理、顧客管理、配送などのドメインが考えられます。私の周りにはオブジェクト指向開発の熟練者がいて、彼らはドメインの本質について考えることがソフトウェアの再利用性の重要なキーであると指摘していました。これは、ドメインの本質、つまり普遍的な性質を捉えて、それをソフトウェア設計のベースすることで、再利用性の高いソフトウェアを構築できるという考え方です。

私にとってこの考え方はなんとなくわかるんだけどいまいちしっくりこないものでした。この「しっくりこなさ」には二つの理由があったと考えています。理由の一つは、ただ一つのドメインしか見ていなかったことです。
ある程度、複雑なソフトウェアは、複数のドメインに分割できます。私がオブジェクト指向を学んだときは、演習の都合もあってある単一のドメインについてのみ考えていました。インターネットショッピングの例で言えば、配送ドメインだけを見て、他のドメインについてはほとんど知らないような状況です。この状況においても何がドメインの本質であるか主張することはできます。たとえば、配送ドメインの本質とは、何かモノをある場所から他の場所へ移すことだと。しかし、そうでない振る舞いを我々の知らない他のドメインが期待していたとしたらどうでしょう。すこし強引な例かもしれませんが、発注ドメインは配送ドメインに、物理的なモノの配送だけでなく、電子データの配送も期待するかもしれません。この場合は、モノは移動するのではなく、モノ(電子データ)のコピーが送られます。
ソフトウェアをドメインに分割するということは、ドメインを組み合わせてソフトウェアを作るということです。ですから、あるドメインが一体何であるかは、他のドメインとの関係によって決まります。この関係性を無視したのでは、ドメインの本質どころか、まともに動作するかどうかすらわかりません。当たり前のことですが、いくら自分の担当だからといってそこだけを見ていては上手く行くはずもなく、全体を見ないといけなかったんですね。

もう一つの理由は、本質だけにフォーカスしすぎていたことにあったのではないかと思っています。本質とは普遍的な性質だから、本質をソフトウェアの骨格になりえます。しかし、果たしてそれだけで再利用性が高いとまで言えるのでしょうか。骨格は大事ですが、価値のあるソフトウェアを生み出すには骨格にどれだけ適切に肉付けしなければなりません。本質だけを考えていては、骨格を再利用した新たなソフトウェアが作れるのか(作りやすいのか)は見えてきません。ソフトウェアの普遍性も大事だけれど、将来どのように変化するか(あるいは変化させたいか)という可変性も大事だということですね。

長文になってしまいまいしたが、まとめると再利用性について考えるには次の二つが必要なようです。
(1)ドメイン間の関係性が明確になっていること
(2)ドメインの時間的・空間的変化が明確になっていること

ところで、私の「しっくりこない」状態はずいぶん長く続きました。だいたい、2年ぐらい続いていたのかもしれません。きっと周りの熟練者たちに聞けばすぐに解消したのでしょうが、そのときの私は自分がなぜしっくりこないのかすらよくわかっていなかったので疑問を上手く質問という形で表現できなかったんですね。
それにしてもこうやって振り返ってみると、そもそもの問題は、一つのドメインだけを見たり、本質だけ考えたり、部分だけを見て全体を見ていないことなのかも。。