2003年9月4日号

「システムはオブジェクト指向 Ruby & Flash」(#003)   
                                                          福井修@Fsys

【○】本日のお題  Ruby がなぜすごいのか ━━━━━━━━━━━━━━━━
 
 まだまだ暑いですね。Hot かつ Coolに、オブジェクト指向をおいしく頂きまし
ょう。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ オブジェクト指向設計は難しい
────────────────────────────────────
前回 注1)オブジェクト指向について クラス設計は難しいのでデザインパターン
GoFの23パターンを勉強するのがよさげという話しをしました。
さらに オブジェクト指向プログラミングから入ってクラスに慣れるのが、早道
であることも付け加えました。

また実際に出来合いのライブラリでは結構これらのパターンが使われています。
例えば Flash ActionScriptでは Keyイベントを検知するListenerメソッドには
典型的なObserver パターンが実装されています。注2)

デザインパターンを勉強するまで、「何故このような回りくどいやりかたをする
必要があるのか」と他者の実装がよく理解できないことがあります。私がそうで
した。
また 「ほーすごい!とどうしたらそんなやり方をあみだしたのか」と感心する
こともあります。それらは結局デザインパターンを把握しないと理解できない訳
で、デザインパターンは避けては通れない道だと思います。
将棋や囲碁の定石というやつですね。

とは言うものの私が最初にデザインパターンを意識したのは1999年Rubyの教科書
注3)が出版されてそれを手にした時でした。ばりばり使いこなすと設計者冥利に
つきるのでしょうが、それから4年経ちましたが、まだまだ未踏の壁がそびえ立
っています。

まあ もともと建築のデザインパターンから、ソフト設計の解法を体系化したもの
なので、当分は、飽きないで済むだけの深みがあります。

理論と実践の両方が伴わないと理解できないので、現場だけではなかなか難しい
ところがありますし、机上だけでは空論になるでしょうし、踏み絵的なところが
ありますね。デザインパターンがきちんと使いこなされて、設計・実装が行われ
ていると、ちゃんと本格的なオブジェクト指向と言えるでしょう。

あまり訳も分からずに、Javaは使っていますというだけでは、オブジェクト指向
しているとは、言えないでしょう。


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ オブジェクト指向のたとえ
────────────────────────────────────
たとえ話をします。
優秀な中小企業の経営者が居るとします。まあ課長さんでも良いですが。
何から何まで、自分で取り仕切って、うまくやってきました。そうすると部下は、
自分では動かずに、指示されるまま、指示されたとおりにだけ動くようになりま
す。
そのようなやり方では、ある規模まではうまくいっても、限界があります。

規模が膨らんでくると、何から何まですべてひとりが取り仕切るのは、無理にな
ります。
そうするとどうすれば良いのかというと、誰か別の人に、ある部分は「任せる」
ことになります。組織が大きくなると役割を分担して、分業しますがそれです。

ある「くくり」で分担して、その「くくり」分は、そこに任せてしまうのです。
営業は、営業に、経理は経理に、技術は技術に、総務は総務に.....

そうすると、それぞれが自分の判断で処理ができるようになり、ひとりが全部を
取り仕切っているよりも、より大きく複雑な仕事もこなせるようになります。

任せられて、自律してある部分の仕事をこなせるようになると、細かくいちいち
全部指示されなくても、だいたいの指示があれば、あとはそこで判断して処理で
きるようになります。

ある機能に専門特化すると、独立して、他所でも通用するようになります。

経理に専門特化すると、実は、別の会社に転職してもその会社で経理の仕事は、
出来るのです。

専門特化せずに中途半端に、どこにでも首をつっこんで社内政治しかできないと、
他所では通用するようにはなりません。

これは、従来の手続き型であり、手続き型の問題点といえるでしょう。

このように、ある部分をくくり出して独立させる方式が、オブジェクト指向での
クラスであり、クラスで処理をくくることで、再利用ができるようになるのです。

従来のモジュール化でも同様な部分はありますが、データ(プロパティ)を含め
てくくることで独立したカプセル化できるところが、異なります。

オブジェクト指向の話しに戻して、クラスには、手続き(メソッド)とデータ(
プロパティ)があり、他のクラスのデータ(プロパティ)は、自分以外からは直
接さわれないようにして、カプセル化することで独立性が確保されて部品として、
再利用が可能になってゆくわけです。

また、根本の部分で共通に使える手続きをメソッド化しておくと、継承した子孫
でいちいち定義しなくてもそのメソッドがそのまま使えますし、同じ名前で、上
書きすればバリエーションが組み込めます。

面倒そうなオブジェクト指向をする理由は、『再利用』するときに、独立した部
品として使い回ししやすいことが有利となりそこで、資産が有効利用でき、省コ
スト可能となるからです。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ オブジェクト指向の実装
────────────────────────────────────
 1990年代はじめに、オブジェクト指向が話題になりました。が普及には、時間
が必要でした。難解な C++ でのオブジェクト指向は準備が進んだ訳ですが普及
するには、Javaの登場 注4) が必要でした。他の言語も 注5)いろいろ登場です。

ちなみに オブジェクト指向言語の起源は、SIMULA ですね。

オブジェクト指向しやすいかどうかは、言語仕様に大きく依存します。

C言語でも、苦労すれば、可能です。

Java言語も選択枝のひとつです。C#も使われ出して、Javaの欠点の指摘もされる
ようになりました。

Rubyは、まつもとゆきひろ氏によって開発されたオブジェクト指向スクリプト言
語です。注6)

Rubyは、根本からオブジェクト指向で実装されていますので、とてもオブジェク
ト指向しやすいのです。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ Ruby が なぜすごいのか?
────────────────────────────────────

Ruby が なぜすごいのか の答えです。

 「 難しいオブジェクト指向が、Ruby によって簡単に使えるようになった 」

『簡単に』というところがポイントです。そして『手軽』で『楽しい』のです。

 Rubyの特長を列挙してみます。注1),注7)ほか
・ 手軽
   コンパイルがいらない
   型宣言不要

・ 読みやすくて書きやすい文法
   驚き最小のポリシー

・ 自由なライセンス

・ 日本語がオリジナル   

・ すべてがオブジェクト
   おいしいメソッドがどんどん使える

・ 充実したオブジェクト指向機能
   多重継承より便利なMix-in

・ 動的で柔軟なモデル
   evalを使えば任意の文字列をRubyプログラムとして実行できる
   
・ 強力なライブラリ 
   標準添付およびRAA(Ruby Application Archive)注8)

・ 多くのOSで動作

・ 優れたコミュニティ

・ 使いやすい日本語正規表現
   PHPの日本語正規表現は、 Rubyのがオリジナルです。注9)

・ 使いやすい繰り返しの処理
   『イテレータ』! 私は、これなしではもうプログラムしたくありません。

   
 「 RubyJavaPerl の良いとこ取り 」注10)


 前にも書きましたが、再度書きます。注11)
 「オブジェクト指向は難しい! なんて難しいんだ!」という文字列は
 次の Ruby スクリプト で

   txt = "オブジェクト指向は難しい! なんて難しいんだ!"
   p txt.gsub(/難しい!/,"簡単だ!").gsub(/難しい/,"簡単な")

  「オブジェクト指向は簡単だ! なんて簡単なんだ!」という文字列に簡単に
   変わります。(^^ゞ

次回は「 Flash ActionScriptオブジェクト指向から見ると 」です。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
※ 注釈、資料、参考情報
────────────────────────────────────
注1) http://www.melma.com/mag/02/m00020302/a00000602.html
注2) The pitter-patter of little patterns
     http://www.macromedia.com/jp/devnet/mx/flash/extreme/
注3) 『オブジェクト指向スクリプト言語 Ruby』 1999年11月1日刊
     まつもとゆきひろ/石塚圭樹共著 アスキー出版局 7561-3254-5
注4) Javaの歴史
     http://msugai.fc2web.com/java/app/history.html
注5) オブジェクト指向の基本
     http://msugai.fc2web.com/java/oo.html
注6) オブジェクト指向スクリプト言語 Ruby とは
     http://www.ruby-lang.org/ja/20020101.html 
注7) 『Rubyプログラミング入門』 2000年10月25日刊
     原信一郎著 まつもとゆきひろ監修 オーム社 274-06385-2 
注8) RAA - Ruby Application Archive
     http://raa.ruby-lang.org/
注9) http://ns1.php.gr.jp/php-jp/archives/msg02151.html
     Ruby 1.9 では、小迫さんの「鬼車」による実装に
     http://www.ruby-lang.org/ja/20030303.html
注10) http://www.melma.com/mag/02/m00020302/a00000592.html
     http://fsys.net/lms/docs/lms20020526.txt
注11) http://www.melma.com/mag/02/m00020302/a00000324.html

【プロフィール】
福井 修 ( FUKUI Osamu )o-fukui@po.iijnet.or.jp
福井システムリサーチ http://ns3.fsys.net/  主幹。システム構築歴27年。
システム構築エキスパート
日本リヌクス協会、神戸商工会議所情報処理学会 会員
関西ソーホ・デジタルコンテンツ事業協同組合デジタルハリウッド三宮校 Java講師