第5回 2002/10/30

復刻第35弾!!4年まえ

━━━━━━━━━━━━━━━━━━━━━━ 2002.10.30 Vol.605 ━━━━━
 □■□
 ■□■□■□■□■ 日刊「WEBのツボ!!」
 □■□                      http://www.soho-union.com/
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
                          配信部数 2927部

【○】本日のお題 「システムはオブジェクト指向、そしてRubyで」(#005)━━━
                              福井修@Fsys

  もう寒くなってきましたが、オブジェクト指向Ruby の時間です。
「オブジェクト指向」使ってますかぁ 「Ruby」使ってますかぁ

オブジェクト指向には、ものの認知・モデル化という本質があるというお話をしてき
ました。従来の機能で分析する構造化分析に対して、オブジェクトで分析するのが、
オブジェクト指向分析です。処理の対象を「機能」や「データ」ではなく「オブジェ
クト」として考えるというパラダイムシフトが、必要なので、ここに敷居があるのは
確かです。ただもう何でも慣れです。慣れれば良いのです。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ JavaScriptによるオブジェクト指向
──────────────────────────────────────
動的なWeb作りには、従来から JavaScriptが使われています。JavaScriptを使ったこ
とがないという人はいないでしょう。JavaScriptを組んだことはなくても、ほとんど
のサイトで使われているので、意識していなくても利用しているのです。
この JavaScript にも「オブジェクト」というのが出てきます。JavaScriptもオブジ
ェクト指向言語の流れをくんだ言語なのです。

     documentオブジェクト って何?

documentオブジェクトは、それが記述されているHTMLファイルを示すオブジェクトで
す。
オブジェクトとは、操作の対象であり、それを操作するためのメソッドがあります。

   オブジェクト.メソッド(引数、引数..)

writeメソッドを例示すると   
  document.write("

秋の夜長は、神戸でストリーミング

"); また、オブジェクトの属性を示すデータとしてプロパティがあります。 オブジェクト.プロパティ[=値] ドキュメントオブジェクトモデルDocumentObjectModel (DOM) は、そのまま XMLでも 使われ頻繁に出てきます。もう避けては通れません。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ■ クラスが先かオブジェクトが先か ────────────────────────────────────── ものを認知しモデル化してゆくのがデザイン(=設計)ですが、ここで2つのアプロー チ方法が並立します。 クラスが先か? オブジェクトが先か? これは 卵が先か? 鶏が先か? という永遠のテーマにつながります。(ホンマにどっちが先やろ) 先に本質を見抜いて「クラス」を抽出するのか、まず、「実体(=オブジェクト)」を 抽出してからグルーピングして抽象概念化し「クラス」を導くのか。 UMLでは、ユースケース図を書いて、次にクラス図を書くことになっていますが、こ の「クラス」を決めるのが、難しいのです。 クラスがすんなり決まればクラスが先でよいでしょうが、オブジェクトを並べてみて グルーピングしてからやっとクラスが決まるケースも多々あります。 どちらのアプローチもあり というのが正解でしょう。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ■ 概念の抽出 ────────────────────────────────────── ものを表すのに名前を付けます。名前がついていたらそれは もの です。まあ抽象度 粒度の違いはあるのですが。 ですから「名詞抽出法」によって もの を列挙することができます。 名簿システムを想定すると、「氏名」「福井修」「生年月日」「住所」「神戸市」「 電話番号」「個人情報」「連絡先」「所属」「福井システムリサーチ」「よみがな」 「ふくいおさむ」「性別」「郵便番号」.... などの名詞が、抽出できます。 これらを「クラス」なのか「オブジェクト」なのか「属性」なのか「値」なのかで、 区別して行きます。 「概念」を表す名詞は、「クラス」の候補です。従ってこの場合には「個人情報」と いうのは、「概念」を表しており「値」や「属性」より抽象度が高いので「クラス」 になり得ます。 このように名詞のなかから 「概念」を表しているものを抽出すると、「クラス」の 候補を列挙できます。 固有名詞は、「属性」の「値」として整理できますね。 そう この整理は、データ項目の整理の際にも同様で、2次元表(表計算やDB)の 設計にも自然に使われています。同じことです。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ■ クラスの粒度 ────────────────────────────────────── オブジェクト指向が優れている点のひとつに「クラス」を用いることで、設計と実装 が同じ土俵で語れるようになることがあります。 設計書であるところのUMLのクラス図やその他の図で「クラス」を設定すると、それを 実装にも一貫して使えるはずなのです。 ただ言うのは簡単ですが、実際には『粒度』の違いを調整しなければなりません。 「個人情報」クラスを ParsonalInfoという名前でひとつのクラスにする class ParsonalInfo : end のは、まあ順当として「住所」が単なる「属性」なのか、これも「クラス」なのかは 粒度によって違ってきます。概念レベルでは、まあ「個人情報」クラスの「属性」と の位置づけでかまわないと思いますが、実装レベルの検討で、「住所」の中身に関し て 1)郵便番号は、2)都道府県レベルを別項目化したい 3)ビル名なども別項目化した い 4)総務省郵便番号簿の項目と合わせたい 5)合成後の住所も項目化したい 6)住所の ふりがなをどうする ....... いろいろ検討は、深まってゆきます。 そうすると、「住所」も属性では、表現しきれなくなって、抽象度を上げて独立した クラスにして実装する事になります。 『粒度の違いを意識する』『粒度を合わせる』のも重要なポイントです。 ではまた、実際の Rubyプログラミングの話です。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ■■ Ruby CGI 入門 ────────────────────────────────────── 環境整備は、 http://www.melma.com/mag/02/m00020302/a00000350.html 参照 今回から RubyをWebで使うための入門を進めます。 LinuxApacheバリバリという方は、おいておいて、WindowsにてRubyCGIをという ケースをガイドします。 【 準備 】 WindowsApacheをインストール WindowsXP HomeEditionをノートで使っている場合などまず WebServerが必要です。 1) ダウンロード http://www.apache.org/dist/httpd/binaries/win32/ から apache_2.0.43-win32-x86-no_ssl.msi をダウンロードします。 どおせ新しくインストールするなら 先進の Apache2 で^^ 2) インストール apache_2.0.43-win32-x86-no_ssl.msi をダブルクリックするだけ インストール場所はデフォルトでは、通常、C:\Program Files\Apache Group\ となりますが、私は、深くなるのを嫌って d:\ にしました。(d:\Apache2に) 3) 設定 インストール場所\conf\httpd.conf を編集します。 Apache2では、文字化けしないようにデフォルトの文字コードシフトJISに AddDefaultCharset ISO-8859-1 ↓ #AddDefaultCharset ISO-8859-1 AddDefaultCharset shift_jis また、次の行も編集します。 LanguagePriority en da nl et fr de el it ja kr no pl pt pt-br ltz ca es sv tw         ↓ ^^ LanguagePriority ja en da nl et fr de el it kr no pl pt pt-br ltz ca es sv tw ^^ ドメインを指定 例「fsys.net」 ServerNameを指定 例「hoge.fsys.net」 Administrator's Email Address には、自分のメールアドレスを入力 AllowOverride None #Options None ←─ コメントにする Options ExecCGI ←─ 実行可能にする Order allow,deny Allow from all #AddHandler cgi-script .cgi ↓ #を取って有効に AddHandler cgi-script .cgi 4) Apache起動 スタートメニューから、Apache httpd Server → Start Apache in Console を選択 【 CGI設置 】 CGI置き場(例 d:\apache2\cgi-bin)に hello.cgi を作成 hello.cgi↓ #!c:\program files\ruby\bin\ruby -Ks print "Content-type: text/html\n\n" print "Hello Ruby CGI" この1行目の #!c:\program files\ruby\bin\ruby -Ks で 呼び出すプログラム(この場合は Ruby本体)を指定します。 ポイントです。 【 CGI作動 】 ブラウザから http://localhost/cgi-bin/hello.cgi をリクエスト Hello Ruby CGI と表示されたらOK OK 簡単!簡単! 【 Ruby CGIへ 】 1) httpd.conf に .rb も CGIファイル扱いすることを指示 AddHandler cgi-script .rb 2) Apache再起動 スタートメニューから、 Apache httpd Server → Restart Apache in Console 3) CGIファイル設置(例 d:\apache2\cgi-bin)に kobe.rb を作成 kobe.rb↓ #!c:\program files\ruby\bin\ruby -Ks print "Content-type: text/html\n\n" print "秋の夜長は、神戸でストリーミング" 4) ブラウザから http://localhost/cgi-bin/kobe.rb をリクエスト 秋の夜長は、神戸でストリーミング と正しく日本語も表示されるはず CGI をはじめるには、Perlで沢山ガイドがあります。Ruby でもそれがほとんど適用 できます。 ■ RubyCGIのガイド書籍は ・ 「RubyによるCGIプログラミング」 http://www.rubycgi.org/ruby_cgi_book/index.htmRuby de CGIRubyで作るインタラクティブWebサイト http://www.amazon.co.jp/exec/obidos/ASIN/4274064727/ref= pd_sims_dp__1/250-0909535-6993039 ↑1行で続ける CGIに慣れてきたら CGIオブジェクト指向に進むことになります。 ■ RubyCGIオブジェクト指向するには ・ Rubyアプリケーションプログラミング http://www.amazon.co.jp/exec/obidos/ASIN/4274064611/250-0909535-6993039Ruby CGIの応用例 ・ Ruby でカレンダー CGI version http://homepage1.nifty.com/~tetsu/ruby/web/cal.html ■ Wakaba Ruby で ViewとModel,Controllerを分離して制御できるライブラリ http://www.ruby-lang.org/en/raa-list.rhtml?name=Wakaba ■ Wakabaを利用した郵便番号・事業所検索 http://fsys.net/nw/post.rb/ 【プロフィール】 福井 修 ( FUKUI Osamu )o-fukui@po.iijnet.or.jp 福井システムリサーチ http://fsys.net/ 主幹。システム構築歴25年。 日本リヌクス協会、神戸商工会議所情報処理学会 会員 関西ソーホ・デジタルコンテンツ事業協同組合流通科学大学 委託SE http://www.umds.ac.jp/ デジタルハリウッド三宮校 Java講師