2003年10月07日
川俣晶の縁側ソフトウェア技術雑記total 4056 count

どうしても受け入れるのが気持ちが悪いオブジェクト指向と、そうではないオブジェクト指向の違いは何か?

Written By: 川俣 晶連絡先

 この関係の話題も近いうちに終わりにしたい感じがあります。

 私の中で、だいたい、この問題に対する決着が付きつつある、というのがその理由ですが、それだけではありません。決着が付くことによって様々な展望が見えてきて、開発ツールなどに必要なものが、かなり足りない感じもして来ていて、考えるよりも、手を動かすべきことが増えたと思うからです。

 それはさておき。

 最近、はっきりと分かってきたことがあります。それは、私にとって気持ちが悪いオブジェクト指向と、そうではないオブジェクト指向があるということです。まず、オブジェクト指向と呼ばれるものの実体は1つではない、ということは前提として明確にしておきましょう。聞こえてくるオブジェクト指向に関する主張には、相矛盾するものがあります。オブジェクト指向という言葉は、1つの明瞭な思想を示しているとは思えません。そうすると、いくつもあるオブジェクト指向を2つのカテゴリに分けることも可能になります。たとえば、私にとって気持ちが良いか悪いか、という基準を設けて、二つのカテゴリに分けていくことは可能でしょう。

 次の問題は、そうやって分けたときに、それらの共通項はあるか、です。気持ちが悪いオブジェクト指向に共通する特徴、気持ちが悪くないオブジェクト指向に共通する特徴があれば、それらを分ける基準が明瞭に浮かび上がってきます。

 そして、ちょっと前に、その基準に思い至ったのです。

 それは、「現実をそのままクラスに置き換える」という部分だと気付いたのです。

 たとえば、読んでもまったく気持ちが悪くならないケント・ベックさんの本には、こういう話は全く出てきません。リファクタリングすると、それによってクラスが生まれたり消えたりします。しかし、一般のオブジェクト指向の入門書は違います。現実世界をモデリングする手順を踏んで、必要なクラスが決定されます。

 さて、どうして「現実をそのままクラスに置き換える」のが気持ち悪いのでしょうか。あくまで、理論的な答ではなく、雰囲気、気分の問題に過ぎないということは先に断っておきますが。その理由は、1980年代の人工知能ブームの空気と似たものを感じるからです。おそらく、「現実をそのままクラスに置き換える」ことが可能であり、かつ、それが上手く機能するとすれば、きっと1980年代の人工知能ブームは大成功を収め、今頃日本のメーカーが製造した第5世代コンピュータが世界中で使われているはず、という気がします。まったく理論的な答ではなく、単なる感想に過ぎませんが。

 おそらく、「現実をそのままクラスに置き換える」ことが実現できないケースというものが、かなりあるような気がします。そして、置き換えられたとしても、それが上手く機能しないケースも多いような気がします。

 しかし、成功しているオブジェクト指向によるプロジェクトもありますね。

 私の感想が間違っていることが、オブジェクト指向の実績から証明されているのでしょうか?

 少し考えてから、どうもそうではないようだ、と気付きました。

 ここには、少々の言葉のトリックが隠されています。

 それを考えるために、あるオブジェクト指向の入門書から引用します。

オブジェクト指向の特徴としてよくいわれることに、「オブジェクト指向は現実をそのままプログラミングする」ということがあります。これは、コンピュータシステム自体がある種のシミュレーションであり、そしてオブジェクト指向自体がシミュレーション的な面を色濃く持った手法である、ということが無関係ではありません。

 さあ、これを読んでどう思いますか?

 オブジェクト指向がシミュレーション的であるから、現実をそのままプログラミングできる、と書いています。

 これだけなら、しごくまっとうなことが書いてあるように思えるかも知れません。

 では、シミュレーションという言葉の意味を辞書で引いてみましょう。

シミュレーション [3][simulation]

物理的あるいは抽象的なシステムをモデルで表現し、そのモデルを使って実験を行うこと。実際に模型を作って行う物理的シミュレーションと、数学的モデルをコンピューター上で扱う論理的シミュレーションがある。工学上の設計や社会現象の分析などに用いられる。模擬実験

三省堂 『大辞林』

 ここで注意すべきポイントは、「モデルで表現し」という部分です。つまり、シミュレーションは現実ではなく、モデルを使うものであるというのが言葉の意味です。

 モデルは現実とは違います。モデルは、現実を模倣するための構築されるものですが、たった1つのモデルが常に決まるものではありません。1つの現実の事象を扱うために、異なるいくつものモデルが立てられる場合も珍しくありません。また、計算量などの現実的な扱いやすさのため、近似的なモデルを使うケースもあります。近似的なモデルにしなければ計算できないケースも珍しくありません。

 つまり、シミュレーションには複数の解釈があり得、また現実の完全なる模倣とは限らないということが言えます。そこから逆に考えると、シミュレーション的であることと、「現実をそのままプログラミングする」ということは、相互に直接関係ないことだと言えます。むしろ、関係があると思い込んで、モデルが完全に現実を模倣する、あるいは、完全に現実を模倣するモデルを構築する必要がある(構築できる)、と思い込むことは危険であると思います。モデルには何かの限界や制約があるのが普通であって、それを現実とイコール視するのは、失敗への順調な第1歩でしょう。

 このような考えから言えば、現実をそのままプログラミングする方法論はほぼ確実に失敗を運命づけられていると言えます。つまり、「オブジェクト指向は現実をそのままプログラミングする」のなら、オブジェクト指向はほぼ確実に失敗すると言えます。

 それにも関わらず、成功しているオブジェクト指向による開発プロジェクトがあるのはなぜでしょうか。

 それは、オブジェクト指向は現実をそのままプログラミング「していない」からです。オブジェクト指向を囓ればすぐに知ることになるモデリングという言葉がありますが、これはまさにモデルを作成する手順です。

 つまり、オブジェクト指向とは。「オブジェクト指向は現実をそのままプログラミングする」のではなく、「現実からモデルを作成し、モデルをプログラミングする」ものだと言えます。

 ここで、モデルには複数の解釈があり得、更に、現実を完全に模倣しないかもしれない、という特徴があることを考えると、オブジェクト指向を正しく運用すればプロジェクトは成功するという主張は、鵜呑みにはできなくなります。おそらく、モデルをプログラミングするのはそれほど困難ではないでしょう。まあ、この段階にもいろいろと罠が待ち構えていると思いますが、ここでは扱わないことにしましょう。それよりも、現実からモデルを作成する部分に潜む罠の方がはるかに大きいような気がします。というのは、モデルの作成には多くの恣意性が入り込む余地があり、更にモデルの正しさを検証する手段が乏しいからです。(何にでも使える万能のモデルは存在しないだろう、という話もありますが、このへんは割愛)

 正しさの検証は重要なポイントかも知れないと、これを書きながら思いました。プログラムは、単体テストや受け入れテストなどを使って、正しさを検証することができます。実際にユーザーが使ってみて、「使える」「使えない」という判断を下すこともできるでしょう。その判断を下すために、難しい技術的な知識は不用です。しかし、モデルは抽象的であるために、その正しさを判断するのは難しいと言えます。そして、正しいかどうかも明確な結論の出ないモデルを用いてプログラミングすれば、その結果として出来上がるプログラムの正しさも明瞭ではありません。

 では、どうしたら良いのでしょうか。

 モデルを作らなければ良いのです。方針を示す大ざっぱなモデルは作っても良いですが、ソースコードを事細かに拘束するような詳細なモデルは作らない方が良いでしょうね。モデルを使ったシミュレーション的な手法(オブジェクト指向もそれに含まれる)は、プログラム開発の1つの方法に過ぎず、それを使わねば開発ができないというものではありません。検証が困難なモデルに頼るよりも、検証可能なプロセスを積み上げる方法の方が、開発のリスクが少ないと言えます。つまり、要求をモデルにせず、そのままコードに反映させていく方法の方がベターであると言えます。(もちろん、この話の流れから行けばそういう話になると言うだけで、それが正しいということを私が保証できるわけではありません。実際、私が完全にそれを信じている訳でもありませんし)。

 「検証可能なプロセスを積み上げる方法」や「要求を詳細なモデルにせず、そのままコードに反映させていく方法」というのは、とてもケント・ベック臭い話です。エクストリーム・プログラミングや、テスト駆動開発には、そういう臭いがします。

 このあたりで、結論を付けて終わりにしましょう。

 今回の「どうしても受け入れるのが気持ちが悪いオブジェクト指向と、そうではないオブジェクト指向の違いは何か?」という問いに対する別の表現の答を与えるなら、「要求とコードの中間に詳細なモデルの構築を要求するか否か」と言えるかも知れません。

 おお、素晴らしい結論が出ましたね。

 UMLが嫌いなのも、オブジェクト指向モデリング技法に興味が持てないのも、ケント・ベックの本が好きなのも、その理由を一言で言い表しています。

 念のため付け加えるなら、この話の内容を正しいと主張するつもりも、世の中に広めようという意図もありません。まあ、これを読んだ読者が、ぜひ広めたいと思って広めるのは構わないと思いますが、その場合でも私はこのような内容の正しさを保証できません。

 それから、この内容を真剣に受け止めたい人は受けても良いですが、「ふ~ん、そういう考えもあるのか」というぐらいに読み流す方が良いでしょうね。その方が、この文章の本来の意図に照らして適切です。

Facebook

このコンテンツを書いた川俣 晶へメッセージを送る

[メッセージ送信フォームを利用する]

メッセージ送信フォームを利用することで、川俣 晶に対してメッセージを送ることができます。

この機能は、100%確実に川俣 晶へメッセージを伝達するものではなく、また、確実に川俣 晶よりの返事を得られるものではないことにご注意ください。

このコンテンツへトラックバックするためのURL

http://mag.autumn.org/tb.aspx/20031007141013
サイトの表紙【技術雑記】の表紙【技術雑記】のコンテンツ全リスト 【技術雑記】の入手全リスト 【技術雑記】のRSS1.0形式の情報このサイトの全キーワードリスト 印刷用ページ

管理者: 川俣 晶連絡先

Powered by MagSite2 Version 0.36 (Alpha-Test) Copyright (c) 2004-2021 Pie Dey.Co.,Ltd.