(漱石の夢に出てくる)運慶から学ぶオブジェクト指向プログラミング

前振り

オブジェクト指向が何なのかという議論はいたるところで語られますが、元祖となるアラン・ケイオブジェクト指向であったり、派生したすっぽすっぽ先生の抽象データ型のオブジェクト指向であったりと定義からしてゴチャゴチャしてなかなか収束しないことが多いです。
そもそも「オブジェクト指向」という言葉なのになぜか「クラス」が主役かのように語られることが多いのが疑問です。大切なのはクラスではなく実体化されたインスタンスでありオブジェクトであるはずです。クラスはあくまでもオブジェクトの1つでしかありません。
(メタプログラミングは置いといて)クラスはどれだけ頑張っても静的な情報しか持てないので、そこから個々のオブジェクトがどう連携してメッセージをやり取りしているかをイメージできるか、プログラミングできるか*1が1番重要であるはずです。

オブジェクトとは何か?

オブジェクトとはなんでしょうか?プログラマが作りだすものでしょうか?あれやこれやと設計書をもとに作られるものなのでしょうか?
昔はぼくもクラスやオブジェクトはプログラマモデラーが頑張ってクラス図とかUMLを頑張って書いて作りだすものだと思っていました。
しかし最近はちょっと違った考え方を持っています。
オブジェクトはただ、そこに存在しているだけなんです。

オブジェクトはどこにいるの?いるなら手を振って欲しい

オブジェクトが存在しているといってもどこにいるのでしょうか?それはプログラマの目の前です。今目の前に写っている画面にこそオブジェクトは存在します。
あなたが今「プログラミングしよう!」と思ったその瞬間からオブジェクトはそこに存在するのです。オブジェクトは作るものではなく掘り起こすものなのです。

そこで運慶登場

漱石の短編小説「夢十夜」に明治時代に蘇った運慶の話がでてきます。
( なんと青空文庫で公開されてました。http://www.aozora.gr.jp/cards/000148/files/799_14972.html )

 しかし運慶の方では不思議とも奇体ともとんと感じ得ない様子で一生懸命に彫っている。仰向(あおむ)いてこの態度を眺めていた一人の若い男が、自分の方を振り向いて、
「さすがは運慶だな。眼中に我々なしだ。天下の英雄はただ仁王と我(わ)れとあるのみと云う態度だ。天晴(あっぱ)れだ」と云って賞(ほ)め出した。
 自分はこの言葉を面白いと思った。それでちょっと若い男の方を見ると、若い男は、すかさず、
「あの鑿と槌の使い方を見たまえ。大自在(だいじざい)の妙境に達している」と云った。
 運慶は今太い眉(まゆ)を一寸(いっすん)の高さに横へ彫り抜いて、鑿の歯を竪(たて)に返すや否や斜(は)すに、上から槌を打(う)ち下(おろ)した。堅い木を一(ひ)と刻(きざ)みに削(けず)って、厚い木屑(きくず)が槌の声に応じて飛んだと思ったら、小鼻のおっ開(ぴら)いた怒り鼻の側面がたちまち浮き上がって来た。その刀(とう)の入れ方がいかにも無遠慮であった。そうして少しも疑念を挾(さしはさ)んでおらんように見えた。
「よくああ無造作(むぞうさ)に鑿を使って、思うような眉(まみえ)や鼻ができるものだな」と自分はあんまり感心したから独言(ひとりごと)のように言った。するとさっきの若い男が、
なに、あれは眉や鼻を鑿で作るんじゃない。あの通りの眉や鼻が木の中に埋(うま)っているのを、鑿(のみ)と槌(つち)の力で掘り出すまでだ。まるで土の中から石を掘り出すようなものだからけっして間違うはずはない」と云った。

わかりましたでしょうか。オブジェクトは創りだすものではなくて彫り出すものなのです。
余計なことをゴチャゴチャ考えずにあるべき姿をイメージできるかがオブジェクト指向プログラミングの肝なのです。

えっそんな芸術的なことを言われてもわかりません!

ですよね。ぼくもわかりません。
でも「芸術だ!」って言われるとあまりにも途方過ぎて、返ってそんなに難しく考える必要もないかなって気が楽になりませんか?
少なくとも、プログラミングを助けるためのツールであるはずの概念に囚われて試行錯誤するよりもよっぽどかマシなんじゃないかとぼくは思ってます。

*1:そしてそれはプラガバルであるか? http://d.hatena.ne.jp/coolstyle/20101223/1293120737