2003年8月31日号

「システムはオブジェクト指向 Ruby & Flash」(#002)   
                                                          福井修@Fsys
【○】本日のお題  オブジェクト指向とは  ━━━━━━━━━━━━━━━━

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ なぜオブジェクト指向なのか
────────────────────────────────────
前回 注1)なぜオブジェクト指向なのか そして Ruby&Flash なのか を説明しま
した。

なぜ オブジェクト指向なのか?に対する答えは、次のとおりと前回書きました。

1.従来の 「手続き型」の方式に対して、共通部品化(カプセル化)において
    優れている。
2.共通枠の「クラス」と個別実体「インスタンス」という概念を導入すること
    で、モデル化および実装において整理が進んだ。
3.「継承」という方式が、持ち込まれて、親クラスを継承した子クラスでは、
    差分のみの実装ですむようになった。
4.同じ名前で、文脈によって内部で少し違う処理を実行できる(ポルモーフィ
    ズム)ので、便利。もちろん違う処理は、違う名前で が基本。
5.便利さを実感できるまで敷居は、低くはないが、一旦味をしめるともう手放
    せなくなる。

今回は、オブジェクト指向について、さらに話しをすすめます。

  オブジェクト指向のメリットは、『再利用』です。これが、ポイントです。

  これを実現するために、いろいろしんどい準備をするのです。

 思い出してください。ワープロが導入された頃のことを。なぜしんどい思いを
して慣れないキーボードと格闘して、一生懸命打ち込んだのかを。
デジタル化しておけば、あとで再利用できるし、そこで楽ができるからだったで
しょう。それと同じです。

オブジェクト指向しておけば、あとで再利用ができて楽ができるのです。

従来の手続き型の方式では、手続き部しか部品化できなかった(それでもそれな
りのメリットはありましたが)のに対して、オブジェクト指向では手続き部とデ
ータ部を合わせて部品化できるのでより大規模に、部品化(=再利用可能)でき
るのです。再利用してやっとコストメリットが出るので、最初の部品化だけに着
目するとかえってコストが、かかります。この点は、要注意です。
  
 オブジェクト指向についていろいろな解説は、参考記事等 注2)も参照して頂く
として、ここでは私なりの切り口で、解説します。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■『オブジェクト指向分析・設計』と『オブジェクト指向プログラミング』
────────────────────────────────────
 真のオブジェクト指向システムは、『オブジェクト指向分析・設計』をするべ
きだと教科書には、書いてあります。そのとおりでしょう。条件が整えば。
費やせる時間が、たっぷりあるなら、今から UML を勉強して... というアプロ
ーチもありでしょう。しかしながらそんなに恵まれた状況はなかなか無いと思い
ます。そうすると先に『オブジェクト指向プログラミング』から手をつけても良
いのでしょうか?やっぱり『オブジェクト指向分析・設計』をきちんと学んで身
につけてからなのでしょうか?

どちらが先かは、明らかです。『オブジェクト指向プログラミング』から始める
のが賢明です。

オブジェクト指向プログラミングで、再利用のメリットはすぐに得られます。

また クラス設計 は難しいので、クラスに慣れるまでは、クラスを使用する実装
での経験を積むのが早道だと思います。

野球がうまくなるのには、まずボールに慣れることからです。

実践のオブジェクト指向では、いかにクラスを作って、使うかが勝負です。

でもはじめの一歩は、「クラスって何?」っていうところからですね。

クラスは、『設計図』であり、『たこ焼き器』であり、手続き(=メソッド)と
データ(=プロパティ)をまとめたところの『くくり(=管理単位)』です。

どのような『くくり(=管理単位)』が良いのかは、場合の数だけ答えはありま
す。そこがデザインの世界と共通するところです。工業製品にように、規格とル
ールを決めたら画一的に、一定の品質で物が作れるというのとは、やはり土俵が
違うと思います。(まあ画一的にできる土俵も一部にはあるでしょうが)

DBのテーブル設計もデータの『くくり(=管理単位)』の決め方の問題です。
画面設計も答えは、場合の数だけありますね。何に重点を置くかで、いろいろな
解があるわけです。

オブジェクト指向プログラミングについては、次回 Rubyの話しで、取り扱うの
で今回はパスします。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ デザインパターンを利用する
────────────────────────────────────
 クラス設計は、難しい です。
 
まあ難しいのは、クラス設計だけでなく、画面設計やDB設計も難しいでしょう。
センスと経験の両方が必要なのは、同じです。

良い作品は、悪い作品との比較で評価できますから、クラス設計もどんどん駄作
を重ねてゆくうちにどんどん磨かれて、良い作品に進化します。

C++で、マイクロソフトのクラスライブラリよりボーランドのクラスライブラリの
方が良くできていたとか、Javaのクラスが、膨大になったら、C#が改善案を出し
てくるとか、Flash ActionScript が Flash5 から、磨かれて、機能が増えて 
FlashMX に進化したりとか、RubyのクラスもVersion1.6.8から1.8がリリースされ
進化...『 クラス道 』追求の世界かな。

この進化は、終わらないで続きます。このあたりは、なんでも 摂理 ですね。

汎用クラスライブラリは、プロ達が腕を競う訳ですが、アプリケーションの世界
も、それらを利用しつつ、自分でもクラスを設計し、再利用してゆく訳です。

 UMLのクラス図を、すんなり書けるようになるにはそれなりの慣れが必要です。
上達の早道は、何でもそうですが、先達の真似をすることです。オブジェクト指
向の設計には、GoF(the Gang of Four)の23パターンという教科書が存在して
います。この『オブジェクト指向における再利用のためのデザインパターン』
(通称GoF本)の洗礼を通過しないと一皮むけません。溺れないように^^;

せっかくなので GoFの23パターンを眺めてみましょう。注3)
─────
・ 生成 
─────
Abstract Factory  オブジェクトの組を実行時に切替えて使えるようにする方式
Builder           構造や要素が異なっていても生成方法を共通化して使う方式
Factory Method    インターフェースだけ規定して生成はサブクラスにての方式
Prototype         雛型を決め、複製して生成する方式
Singleton         インスタンスが1つであることを保証する方式

─────
・ 構造 
─────
Adapter           別のインターフェースを組み合わせる方式
Bridge            インターフェースと実装を別々に独立して変更できる方式
Composite         ツリー構造で、単一と復数を区別せず扱えるようにする方式
Decorator         動的に機能を追加できる方式
Facade            複数の内部に、外からのシンプルな窓口を提供する方式
Flyweight         多数を共用を利用して、効率よくする方式
Proxy             オブジェクトのアクセスに代理を利用する方式
 
──────
・ 振る舞い 
──────
Chain of Responsibility 要求に応える役割をチェーンでつなぐ方式
Command           要求をオブジェクト化し、再利用できるようにする方式
Interpreter       文法表現と解釈を同時に定義する方式
Iterator          要素に順にアクセスする方式
Mediator          相談役を立ててメンバー同士の独立性を維持する方式
Memento           状態を保存して、後で復元できるようにする方式
Observer          状態を監視し、変化を通知する方式
State             状態に合わせて動作を変えるのに条件分岐を使わない方式
Strategy          処理をカプセル化し、交換可能にする方式
Template Method   全体は変えずに一部をサブクラスで変更する方式
Visitor           構造を渡り歩きながら操作や、追加をする方式

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
※ 注釈、資料、参考情報
────────────────────────────────────
注1) http://www.melma.com/mag/02/m00020302/a00000592.html
注2) 浅海 智晴さんの 「オブジェクト指向分析/設計概論」
    http://www.asahi-net.or.jp/~dp8t-asm/java/articles/OOAD/article.html
注3) 
・ 『オブジェクト指向における再利用のためのデザインパターン』改訂版
   Erich Gamma/Richard Helm/Ralph Johnson/John Vlissiders 著
   本位田 真一/吉田和 樹 監訳 ソフトバンクパブリッシング 7973-1112-6
・ 『Java言語で学ぶデザインパターン入門』結城 浩著
   ソフトバンクパブリッシング 7973-1646-2
・ UMLプレス Vol.1 技術評論社日経ソフトウェア 2002/3 「デザイン・パターン入門」特集
・ デザインパターンの骸骨たち2 
   http://www002.upp.so-net.ne.jp/ys_oota/mdp/ギコ猫デザインパターン
   http://www.hyuki.com/dp/cat_index.htmlPaul Graham「ものつくりのセンス ---Taste for Makers---」
   http://www.shiro.dreamhost.com/scheme/trans/taste-j.html
・ いろんな言語でデザインパターン
   http://www.hyuki.com/dp/dpml.html#langDelphi で学ぶデザインパターン入門
   http://www.acesekkei.com/dp_frame.htmVB.NET/C#デザインパターン
   http://hccweb1.bai.ne.jp/tsune-1/
・ 「MixJuice によるデザインパターン改善カタログ」
   http://cvs.m17n.org/~akr/mj/design-pattern/

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