2003年10月2日号

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

【○】本日のお題  MVCモデル を Ruby&ActionScript で実装する ━━━━━━
 
前回 注1)Flash ActionScriptオブジェクト指向から見ると で「ActionScript
で 部品化、自律 がよく見える。..ActionScriptでプログラミングすることは、
まさにオブジェクトを操っている実感を得られる」と書きました。

前回までは【 基本編 】ということで、抽象的な説明が多かったのですが、今回
から、【 実践編 】に入って具体的な話しに入って行きます。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ MVCモデル とは
────────────────────────────────────
 MVCモデル とは何かと言うと、「ツボによく利くJAVA & DB」の連載の際 注2)
にも言及したのですが、業務ロジック(Model)と表示(View)と制御(Controller)
を分けて扱うと、ユーザインターフェースが変わっても業務ロジックは独立して
扱えるので、広く受け入れられている方式です。

デザインパターンに対して、アーキテクチャパターンという整理がありMVC(アー
キテクチャ)パターンという呼び方もあります。注3)

このあたりは、『ソフトウェア・パターン』という名前で、豆蔵の羽生田栄一氏
が、いろいろまとめておられるので参考になります。注4)

概念は良しとしても、実際のレベルでは、あちらをたてればこちらがたたずを調
整することが必要で、様々な実装があります。

 1) (一般の(smalltalkの)) MVC モデル 注5)
 2) Javaでの実装
    StrutsMVC2 モデル
    TurbineMVC2+1 モデル
    J2EEMVC モデル 注6)
 3) Flashでの実装
    Flash + ColdFusion でのモデル 注7)
    Pet MarketのMVC構造 注8)

いろいろ奥深いテーマなので、研究もされています。 注9)

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ Web-DBアプリケーションのグルーピング
────────────────────────────────────
 MVCモデルの話しも、過去のスタンドアロンでの画面プログラムでのパターンと
現在主流となってきているWeb-DBアプリケーションでのパターンでは、当然実装
は変わってきます。ここでは、Web-DBアプリケーションのグルーピングをしてみ
ます。

・ 第一グループ
   PerlCGIやServletのみ で サーバサイドで、単一プログラム内でHTMLタグの
   編集もDBの処理も混在する形態。

・ 第二グループ
   IIS ASPPHPJSPを利用し、HTML文書をベースに、プログラムを埋め込み
   このなかでDBの処理も混在する形態。

・ 第三グループ
   HTML文書とDBの処理を分離して、実装する形態。
   見栄え(≒View)はJSP、受付処理は、Servlet、DB処理まわりはBeansなど。
   eRubyとRubyの組み合わせなどもこの範疇。

・ 第四グループ
   第三グループを発展させた形態。
   HTML文書は、できるだけデザイン要素に重点がおける様に(デザイナとの分業
   がし易いように)プログラムとは、分離するように工夫。
   
   JSP2.0でのタグライブラリ拡張などを活用しようとする方式です。
   また J2EEEJB導入やStruts,Turbineフレームワークもこの範疇に。
   JSFJavaServer Faces)の動向もありますし、ASP.NETの動向もあります。
   WebObjectsのようにDB処理まわりもフレームワークに取り込んだ先進形態も
   ありです。

・ 第五グループ
   リッチクライアントの必要性を認識し、パラダイムシフトした形態。
   見栄え(≒View)はFlashやPDF(Format)など。Microsoft Office Systmもここ
   に位置づけても良いかもしれません。
   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ Web-DBアプリケーションでのMVC実装の問題点と今後
────────────────────────────────────
 第一グループは、もう部分的にしか利用されないパターンとなりました。ただ
しこれが基本なので、押さえて置く必要はあります。
第二グループは、現役ですし、これを維持するは勢力はあります。注10)
第三グループも、現役ですし、それなりに、すっきりはしています。

現在 第四グループがホットです。ただ、まだまだ流動的(言い換えるとぐちゃ
ぐちゃ)ですね :-p

私は、第五グループで、Viewは、Flash、Controlは、ActionScript(All Flashの
場合) or Ruby、Modelはもちろん Rubyというのが予算数百万〜クラスでは、適
当だと思います。複雑な要素(CFなど)を除いてお手軽・簡潔に!

予算が潤沢にあり、人月が50越えなら Java/C#..もありでしょうが。

Flash & RubyMVC モデルは、以下のようになります。
( ※ 必ず等幅フォントで、ご覧ください )

  Client  ←─────────→  Server
1) 最初のリクエスト
┏━━━━━┓ リクエスト     ┏━━━━━━━┓
┃ブラウザ  ┃ ─────→   ┃ コントローラ ┃
┃          ┃                ┃ Ruby         ┃
┗━━━━━┛                ┃              ┃
                              ┗━━━━━━━┛
        ↑                         │
        │    ┏━━━━━━━┓   │
        └──┃ ビュー       ┃ ←┘           
              ┃ Flash        ┃                
              ┃              ┃                
              ┗━━━━━━━┛                
2) 一旦Flashが開かれたあと
   クライアント内でのFlash画面遷移は、ActionScriptがコントロール。
   サーバサイドまで、影響する挙動に対しては、Rubyがコントロールし
   また Rubyのクラスで実装したモデルがDB処理を行います。
┏━━━━━┓                    ┏━━━━━━━━┓
┃ブラウザ  ┃      ─────→  ┃ コントローラ   ┃
┃┏━━━━┻━┳━━━━┓  ←  ┃ Ruby           ┃
┗┫ビュー      ┃ ──┐ ┃      ┃                ┃
  ┃Flash       ┃ ←─┘ ┃      ┗━━━━━━━━┛
  ┣━━━━━━┛        ┃             ↓↑
  ┃ コントローラ Action  ┃      ┏━━━━━━━━┓     ┌────┐
  ┃              Script  ┃      ┃ モデル         ┃ ─→│ DB   │
  ┗━━━━━━━━━━━┛      ┃ Ruby           ┃ ←─│        │
                                  ┃                ┃     │        │
                                  ┗━━━━━━━━┛     └────┘
  
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■  実装例によるMVCモデル比較
────────────────────────────────────
【 例 】 ブラウザに、今月のカレンダを表示する
【前提条件】
   Rubyのインストール済 、Apacheのインストール済
【第一グループ方式 実装例】

下記ファイルを実行可能領域に設置
ex.)  http://fsys.net/ruby/cal1.rb
 
# cal1.rb
#
#!/usr/local/bin/ruby
def create_calendar ( year, month )
  nextmonth = Time.at(
    Time.local(year, month).tv_sec + 31*24*3600 )
  daycount  = Time.at(
    Time.local(nextmonth.year, nextmonth.mon).tv_sec - 1 ).mday

  emptystr = "   "
  lines    = [ sprintf("%8d 年 %d 月", year, month),
               " 日 月 火 水 木 金 土" ]
  line     = nil
  w = Time.local( year, month, 1 ).wday
  for d in 1..daycount do
    line ||= Array.new( 7, emptystr )
    line[w] = sprintf( " %2d", d )
    if w == 6 then
      lines << line.join
      line = nil
    end
    w = (w+1) % 7
  end
  lines << line.join if w > 0
  return lines.join("\n")
end

puts "Content-type: text/html\r\n\r\n"
puts "Calendar"
puts "
"
puts create_calendar (2003,10)
puts "
"
【第五グループ方式 実装例】
 
 1. FlashMX インストール 注11)
 
 2. UIコンポーネント セット2をインストール 注12)

 3. カレンダーコンポーネントを画面に配置

 4. Flash ファイルをパブリッシュ
 
 5. サイトに配置
  例)http://fsys.net/ruby/comcal.html

Flashコンポーネントを利用した方法で Flashを View に採用する方式は、リッ
チクライアント実現へとても有利です。


次回は「【 実践編 】サーバサイドで Ruby&PostgreSQL 連携 」です。


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
※ 注釈、資料、参考情報
────────────────────────────────────
注1) http://www.melma.com/mag/02/m00020302/a00000621.html
注2) 「ツボによく利くJAVA & DB」(#014)
     http://www.melma.com/mag/02/m00020302/a00000290.html
     「ツボによく利くJAVA & DB」(#015)
     http://www.melma.com/mag/02/m00020302/a00000292.html

注3)『ソフトウェアアーキテクチャー:ソフトウェア開発のためのパターン体
     系』フランク・ブッシュマンほか/金沢典子ほか訳 近代科学社,2000
     
    「アーキテクチャ・パターンを理解する」萩本順三・奥村洋氏
     JavaWorld 2001年4月号

     UMLによるアーキテクチャパターン 萩本順三氏
  http://www.mamezou.com/tec/Tips/umlForumJp2001/pdf/UMLArchitecture.pdf

注4) 「ソフトウェア・パターンの射程を知る」羽生田栄一氏
     JavaWorld 2001年4月号

     「総説パターン -概念と応用」
     ドクタードブズジャーナル日本版 翔泳社 1998年10月号

注5) (クラシック)MVCとは
     http://www.ogis-ri.co.jp/otc/hiroba/technical/Squeak5/S5-3-1.html

注6) はじめてのBluePrints & J2EEパターン
     http://www.gihyo.co.jp/magazines/issue.php/wdpress/Vol08

注7)「ColdFusionMXとFlashMXを用いて操作性の良いWebアプリケーションを開発
      しよう」連載 日経Linux 2003年2月〜8月 ワイスリー 安河内 浩二氏
     2003年7月、8月に MVCアーキテクチャに言及
    
注8) Flash Pet Market Blue Print ApplicationにおけるMVCの構造 松村氏
    http://faces.bascule.co.jp/flashoop/src/mvctest.zip
     
注9) 完全なMVCパターン導入の必要性
     http://www.fuka.info.waseda.ac.jp/~washi/m_html/node7.html
     MVCパターン
     http://www.fuka.info.waseda.ac.jp/~washi/m_html/node8.html

注10)日経「検証:ITキーワード」連載 
     第3回 JavaWebサービスは夢で終わる 2003/05/27
     http://biz-inno.nikkeibp.co.jp/open/article20030527.shtml

注11) マクロメディア社よりトライアル版がダウンロード可能
     http://www.macromedia.com/jp/downloads/

注12) UIコンポーネント(下のページ右側にリンク)
     2003/10/1 時点では、不明^^;
     http://www.macromedia.com/jp/devnet/mx/flash/

     UI Components Set2非公式日本語マニュアル
     http://hpcgi2.nifty.com/icutommy/fwiki_ja/wiki.cgi?FlashUIComponentsSet2Manual


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