2005/7/20

オブジェクト指向って何?  VRMスクリプト禅問答
【怎麼生】
「VRM4はオブジェクト指向だ」と言われますが、今ひとつ意味がわかりません。オブジェクト指向って何ですか。

【説破】 4.0.1.2
オブジェクト指向、という言葉の定義は実は曖昧で「これこそオブジェクト指向である」という議論を始めると百花繚乱します。とりあえずここでは、オブジェクト指向とは「あるもの(オブジェクト)を扱うに際して、そのもの自身が自分がどう扱われるべきかを知っているかのように見せる考え方」である、とします。これだけで意味がわかりにくいですね。そこで、オブジェクト指向ではない状態、との比較を考えてみましょう。
若い方にはイメージしにくいかも知れませんが、WindowsやMacが登場する以前にもパーソナルコンピューターは存在しました。その当時は、現在では考えられないようなことが、極当たり前にユーザーに受け入れられていました。それは、たとえばあるワープロソフトで書かれた文章を読むには、そのワープロソフトをまず起動しなければならなかった、それ以外に手段がなかった、ということです。これを先のオブジェクト指向の定義にあてはめて言い直すと「文章(あるもの=オブジェクト)を読む(扱う)に際して、その文章自身は自分がどう扱われるべきかを知らないので、ユーザーが扱う方法を前もって選らばなければならなかった」ということになります。
一方、WindowsやMacでは、文章は他のいろいろな種類の何か同様に「アイコン」で示されています。そして、ユーザーはこのアイコンさえクリックすれば、そのアイコンが何を意味しているかを知らなくても適切なワープロソフトが起動してくれます。つまり「アイコン(オブジェクト)を扱うに際して、そのアイコン自身が自分がどう扱われるべきかを知っている」ということです。これを、広い意味でのオブジェクト指向と呼びます。
マニアックな方の中には「Windowsがオブジェクト指向だって?、だから素人は!!」と息巻く方がおられるような気がしますが、これこそがオブジェクト指向を語る上で難しい点です。オブジェクト指向というのは、考え方であって、具体的な何かではありません。Windowsは、アイコン(の絵柄とそれに対応するファイル拡張子)とアプリケーション(ワープロソフト等)の対応関係を別途管理しており、これを参照して動作しています。ですから、厳密な意味で「アイコンが自分がどう扱われるかを知っている」わけではありません。しかし、これを利用する人間から見れば、アイコン自身がそれを知っているように「見える」わけです。このように、実装上はさておき、見た目の動作がそれっぽく見えるものを「弱いオブジェクト指向」と呼ぶことにしましょう。
一方で、本当にそれ自身がどう扱われるかを知っている実装、というものもあり得ます。あまり良い例ではありませんが、分かり易さを優先すると、インターネット等でファイルのやり取りに利用される「自己展開型圧縮ファイル」は、先の例の逆で「強いオブジェクト指向」な存在です。この形式のファイルには、圧縮されたデータとそれを復元するためのプログラムの両方が含まれています。つまり、それ自身が自分がどう扱われるべきかを本当に「知っている」のです。
もちろん、自己展開型圧縮ファイル自身は、拡張子exeによってWindowsにプログラムとして実行してもらうことに依存していますから、この観点においては「弱いオブジェクト指向」であるとも言えます。このように、オブジェクト指向は、具体的な何かを指すわけではないので、論じる切り口によっていろいろな解釈がありえるのだ、ということをまず理解してください。

その上でVRMに関して言うと、実は意外にも、VRM内部の実装は「強いオブジェクト指向」的な構造になっているようです。これを端的に示す事象は、Tatsuo氏が独特のレイアウト作風に絡めてしばしば指摘されている「編成に自動運転を設定した場合、ビュワー起動時の編成の位置がPCの性能によって異なる」という点です。もし、VRMビュワーが非オブジェクト指向的な作りであるとすると、ビュワープログラムが画面の表示から編成の操作まですべてを担当するために、全体の速度が変わることはあっても、画面表示だけが遅れて編成の動作が変わるということは起きないはずです。
ところが実際には、VRMにおける編成(オブジェクト)は自分(列車の見た目のデータ)がどう動くべきか(仮想空間内での走行をおこなうプログラム)を知っている(自分自身に含んでいる)ため、ビュワーが画面表示開始の準備を整えるまでに、勝手にレイアウターが前もって準備したレールの情報に従って走行してしまいます。走行はPCの性能に関わらず設定速度に依存して絶対的に決まるため、PCの性能に依存するビュワーの画面表示開始までの時間との間にズレが生じるわけです。このことは、VRM2の車輌をVRM3上で走行させた場合に生粋のVRM3車輌と異なる動作をする点や、動画作成のために連続してスクリーンキャプチャーをおこなった直後に編成が瞬間移動したように見える点でも裏付けられます。
無論、Windowsの例にもあるように、これがVRMの構造を反映しているのか、あるいは、見た目上はそう見えるだけなのか、はVRMをリバースエンジニアリングしない限り断言できませんが、少なくともVRM4車輌の各種ギミックが車輌毎に異なること、それを後からパッケージで追加できること、から類推すると、極めて原理主義的とも言えるハイレベルなオブジェクト指向的なコーディングがおこなわれていると見て間違いないでしょう。そして、このことが、VRM4スクリプトのあり方・考え方とも深く関わっている(と思われる)のですが、長くなるので今回はこれまでとします。

注)本連載で示すVRM4スクリプトや物の考え方をあなたが採用した結果生じる全ての事象については、その責を負い兼ねます。私の書いたものを読むに際しては、常に「コイツは狂人で、でも一部は役に立つことも言っているかも知れない」という程度の心構えで臨んでください。
0

コメントを書く

この記事にはコメントを投稿できません




teacup.ブログ “AutoPage”
AutoPage最新お知らせ