昨日の「オブジェクト指向は難しい」について、 ツッコミ、リンク、Trackbackなどいろいろな反応をいただく。
で、考えたのが、「オブジェクト指向が難しいと思われる原因は、難しいというイメージそのもの」ではないかと。
「オブジェクト指向」のもっとも重要な概念は通常のプログラミングにも登場している。 たとえば、Cで
FILE *f = fopen(path, "r");
という呼び出しは「pathにあるファイルをオープンして、ファイルオブジェクトを得る」という処理そのものだ。 別にオブジェクト指向は必要ない。CのFILE*にはfprintf()やfclose()などのいくつかの「メソッド」がある。
つまり、通常の非オブジェクト指向言語におけるプログラミングでも、 「オブジェクト」という概念は存在していて、無意識のうちに使っているはずなのだ。 このことは別に目新しいことでもなんでもない。K&Rにも「オブジェクト」という用語が使われている。
もっとも多くの言語には「オブジェクト」でない「値」もある。 またCの例を出すと、構造体はオブジェクトではない。代入によってコピーが発生するからだ。 BASICの文字列もオブジェクトではない。
だから、オブジェクトな値(リファレンスあるいはポインタ値)とオブジェクトでない値が混在している言語より、 すべての値がオブジェクトであるRubyのようなオブジェクト指向言語の方が覚えることは少ないはずだ。
ほら、やっぱり「オブジェクト指向は難しくない」。
ただ、問題が残っている。ひとつは従来型プログラミングしか学んでいない人にとっては、 「単なる値」という考え方の方になじんでおり、リファレンスの方は十分に理解されていないらしいのだ。 世の中に「ポインタ解説本」が登場する理由でもある。 つまり、ふたつの考えのうち、ひとつが消えて単純になったはずなのに、残ったのは苦手な方だったと。
なんて不幸な。
やはり、早いうちにLispやRubyやPythonなど、「すべての値がオブジェクト」型の言語を身に付けておくべきではないかと。逆よりも幸福になれそうだ。
オブジェクト指向で2番目に重要な概念も通常のプログラミングに登場している。 2番目に重要な概念とは「動的結合」あるいは「多態(ポリモルフィズム)」である。
harukiさんのツッコミにもあるように、 非オブジェクト指向言語にも引数のデータ型に応じて適宜処理を行ってくれる関数があるものもある。 私が知っているのはLispだが、BASICなどもにあったような気がする。 オブジェクト指向言語と呼ばれるものは、そのような手続きを自分で定義できるようになっただけだ。
ほら、やっぱり「オブジェクト指向は難しくない」。
「多態」を理解していれば「継承」も難しくないはずだ。 現実世界にも結構ある関係だし。
もっとも、あまりに現実世界のモデルにこだわりすぎて(「ほ乳類」と「犬」とか)、 実際のプログラミングにどう使ったらよいのかわからないという点はあるかもしれない。 「差分プログラミング」同様、オブジェクト指向解説書の罪と呼べるかもしれない。 『オブジェクト指向スクリプト言語Ruby』では、私も同じ罪を犯しているけど。
ただ、Rubyのようなオブジェクト指向言語を使っていてもっとも困る点は、 ドキュメントを探すのが面倒という点だ。
あるオブジェクトのメソッドについて知りたい時、
という手順を踏まなければならない。はっきりいって苦痛だ。なんらかの支援が必要だ*1。
Eiffelにはshortとかflatとかいうツールがあり、前者はクラスの仕様だけを抽出し、後者はクラスの継承関係を展開してくれる。これでドキュメントを探し回る苦痛が軽減される。
Rubyにはriとかrefeとかいうツールがあり、ドキュメントを検索してくれる 人間が自分で探すことを比べれば、はるかに楽だ。
%ri each The method named `each' is not unique among Ruby's classes and modules: Array#each, Dir#each, Hash#each, IO#each, Range#each, String#each, Struct#each %ri each Array#each ------------------------------------------------------------- Array#each arr.each {| item | block } -> arr ------------------------------------------------------------------------ Calls block once for each element in arr, passing that element as a parameter. a = [ "a", "b", "c" ] a.each {|x| print x, " -- " } produces: a -- b -- c -- %refe each_line IO#each_line String#each_line StringIO#each_line % refe IO#each_line IO#each_line --- each([rs]) {|line| ... } --- each_line([rs]) {|line| ... } IO ポートから 1 行ずつ読み込んで繰り返すイテレータ。IO ポートはリー ドモードでオープンされている必要があります(open参 照)。 行の区切りは引数 rs で指定した文字列になります。rs の デフォルト値はシステム変数 $/ の値です。 rs に nil を指定すると行区切りなしとみなします。 空文字列 "" を指定すると連続する改行を行の区切りとみなします (パラグラフモード)。 self を返します。
*1 しまった。これは来月のLinux Magazineの記事のネタだった。発売前に書いてしまった
会社から帰宅する時、かなりくたびれていたせいか、自宅直前で 対向車をよけようとして、ガードレールに車をぶつけてしまった。 左後ろのドア周辺にかなり大きな傷がついた。ショック、がっかり。
元々打たれ弱い人間なので、失敗するとかなり落ち込んでしまう。
暗い気持ちで自宅にたどりつくと、心当たりのない荷物が届いている。
なになにNTT-X? これってgooやってるところだよね。
手紙が入っていた。
まつもとゆきひろ様
この度は「gooユーザアンケート」にて、ご協力をいただきまして誠にありがとうございます。
厳正なる抽選の結果「Sonyバイオ」が当選しましたので、送付させていただきました。 今後も、ポータルサイトgooをよろしくお願いします。
草々
なんと、そんなアンケートに答えたことも忘れていたが、VAIO U101当選だそうだ。
びっくり。今まで長いこと生きてきて懸賞なんて当たったことがないのに。 良いことと悪いことが同時に来たのでかなり混乱している。
さて、このVAIO U101をどうしたものか。 今のマシンより速いCPUと大容量のディスクを積んでるんだよな。 こんなに小さいのに。
でも、日常使うにはキーボード小さすぎるんだよな。 少々贅沢な悩み。
妻が腰痛に苦しむので、自宅作業で家事も行うことにした。 こんなに痛そうにしていたこともない。
が、夏休みってのはコンピュータ使ってても、子供が入れ代わり立ち代わりやってきて仕事が進みやしない。 能率悪すぎ。
しかも、この日は午後から小学校の地区プール解放日で、監視員の当番が当たっていたりするのだ。 いくらパラソルの下だとはいえ、2時間、屋外で暑い思いをするのはインドア派の私には辛いわ。
頭痛がするようになってしまった。
今日はかずひこさんの引っ越しだったのだが、 おかげで会社に行けなかった。
月曜からは真面目に仕事しよう。そうしよう。
さらに午後は買いものへ。業務用商品のたくさんおいてある店にいってみたのだが、 妙なもの(食用金箔とか)や大きいもの(桜でんぶ1Kgとか、たこ焼き粉10Kgとか)が多く、 見ているだけでも楽しかった。あと、ドリアン。輸入可能になったとは知らなかった。
で、自宅で肉焼いて食べる。 人数多いからたくさん食べる。
先日の北海道での影響を受けてジンギスカン用のラム肉を買ってきたのだが、 息子は一口しか食べなかった。やっぱ羊はダメらしい。 娘たちは、「おいしい...でも、複雑」とか言ってた。
デザートに桃。9ヶ月の末の娘にも食べさせてやろうと、かけらを器にとってすりつぶそうとしていたら、 一瞬の隙をついてまるごとの桃にかぶりついていた。 あんまり一生懸命かじりついているありさまがおかしいんでみんなで笑っていたら、 あれよあれよと言う間にぜんぶ食べてしまった。よっぽとおいしかったんだねえ。
びっくり。
そういえば下の歯がわずかに顔を覗かせていた。
今週は司会担当。
聖餐会のお話で印象的だったのは、一人の姉妹の話。 プライマリの教師をしていただいているその方は (一般的な視点からみると手がかかる)ある子供に大変余裕をもって 楽しげに接しておられ、また、大変喜びをもって教えておられる様子を 生き生きと語っていただいた。
それを見て、自分の子育てを省みると、なかなか改善の余地が多いなと感じてしまった。 つい感情的になったり、説明を省いたり、 心に余裕を持つことと、事前に備えをすることで、だいぶマシにできそうだ、 と思った。
「常に余裕ある態度」は私のモットーなのだが、 子育てに関しては(4人もいると)なかなか思い通りにはいかないものだなあ。
先日、浸水被害があった松江市近辺であるが、 実際の被害は限定的で、 松江駅周辺が一部床上浸水、 松江近郊で数箇所土砂崩れ(山陰道玉造宍道間が通行止)になったが、 それ以外はまったく通常通りに戻っている。
正直、かなり気をつけてみないと「跡形もない」という感じだ。 山奥ではまだ復旧に時間がかかるところもあるようだけど。
しかし、近所でない人にはそんなことは伝わらないわけで、 「松江は水没したらしい」、「観光地も被害を受けたらしい」などと いう「印象」から観光予約をキャンセルする人が続出していると聞く。
近所の温泉旅館でも大量のキャンセルを受けて困っているとか。
みなさ〜ん、松江近辺は安全ですよ〜。
結果として自民大敗ということらしい。
まあ、その辺は流動的なものだから、どうでもいいんだけど。 人気商売は大変だなあ。
で、政治方面には疎くて理解できないことが沢山あるんだけど、 今回、一番理解できないのは、選挙に大敗したから 総理は責任をとって辞任、総選挙で国民に信を問うべきだ、 という意見が自民党から出る、という点。
現在、与党は自民・公明合わせて衆院の2/3を占める圧倒的有利な状態である。 まあ、以前の小泉人気のおかげだけど。
で、参院選挙に大敗して過半数を割り込むような状態で 選挙に望めば、またもや大敗して衆院でも現在の勢力を失い、 かなり高い確率で政権政党から脱落することが予想される。
解散することで国民に真を問うたことに対して、 潔いと感じてくれる人もいるだろうが、選挙結果を逆転するほどのものではない(と思う)。 それならば、なんと言われても任期中は政権を維持して、 なすべき事をなし、その結果で評価してもらうことが、 与党としてなすべきことではないのだろうか。
結果が出なかったらそれまでだが、その場合はどうしようもないということで。
この件に関して(だけ)は、首相の判断に共感できる。
首相に反発する自民党の人は、選挙に負けようが、政権を失おうが、 「責任は取った」と言えればそれでいいのかな。 サムライの潔さがなによりも優先するのかな。
Rubyについて古典的な記事『Thirty-seven Reasons I Love Ruby』(2000年)の「37の理由」はHaskellでも成立する、という話。
となると、Rubyが好きな人は(少なくともこの基準に従う限り)Haskellも愛さねばならない ということになるが、実際はそうとも限らない。少なくとも私は(現時点では) Haskellを愛せない。
では、38番目の理由があるはずだが、それはなにかと考えると、 Haskellみたいな言語だと宣言的なスタイルが思いつかないと とたんにどうしたらいいのかわからなくなる。
ということは、つまり....手続き型脳の恐怖?
出雲から夕方の飛行機で福岡へ。
一度自宅に帰るつもりだったのに、会社での作業が長引いて 時間がなくなったので、空港へ直行。 おかげで着替えを取ってこれなかった。
仕方がないので、福岡で着替えを購入しようと思ったが、 土地勘がないので、買い物する場所を探すのに不自由する。 ネットできるケータイを持ってると、こういう時には便利かもしれない。
かなりさまよったあげく、天神でいくつか買い物と食事。
スタッフに予約してもらったホテル(ハイアットレジデンシャルスイート)が めっちゃ豪華であせる。台所があるってどういうことよ。