第3回 2002/08/19

復刻第33弾!!4年まえ

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

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

  暑いですが、オブジェクト指向Ruby の時間です。

前回は、オブジェクト指向のメリットとして『部品化』しやすい点を挙げました。
システムは、その設置環境(外部仕様、内部構造)によって同じものはありません。
建物も同じですね。共通に使えるものは部品化して、部品を使うことで、作るコスト
を下げようという自然な発想に「オブジェクト指向」はよく似合うわけです。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ オブジェクト指向ってそもそも何なんだ?!
──────────────────────────────────────
もともと「オブジェクト指向(の方式)」というのは、従来の方法の問題点を分析し、
それに「手続き型(の方式)」という名前をつけて、それに対する、改善された新し
い方式として名付けられて登場しました。これも前回説明済みですね。

いちど『オブジェクト指向って何?』という問いにも、正面から答えて見ます。

オブジェクト指向とは、次の認知概念によってモデル化し、実装する技術です。
「もの」の持つ機能による認知(これは何ができるものか)
「もの」の分類を行うことによる認知(これは何に似ているのか)
「もの」の構造による認知(これは何からできているのか)

そしてオブジェクトに対するメッセージ(メソッドという)によって駆動するしかけが
オブジェクト指向の方式です。

【参考】 浅海 智晴さんの 「オブジェクト指向分析/設計概論」
http://www.asahi-net.or.jp/~dp8t-asm/java/articles/OOAD/article.html

【補足】↑には、咲本さんお得意の『暗黙知』の話も登場します(^-^v

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ ではオブジェクト指向分析・設計は?
──────────────────────────────────────
オブジェクト指向には、ものの認知、モデル化という本質があります。

これを具体的に実施するオブジェクト指向分析・設計に、UMLを利用しようというの
が最近のトレンドです。
UMLとはオブジェクト指向を使ってモデリングする際に使われる統一的な表現(言語)で
す。
UML(Unified Modeling Langage) の説明は最近頻出しています。
・ 5分で絶対に分かるUML 
http://www.atmarkit.co.jp/fjava/devs/01fivemin/fivemin00.htmlUML入門<基礎編>
http://www.mamezou.com/tec/Tips/umlForBeginner/index.html

まあ UML は 図を書く(これすなわちモデリング)際のお約束事なだけです。
ただしここから 開発方法論や、プログラムの実装へのさまざまな道筋がつながって
行きます。

真正面からシステム全部を網羅してUMLで書こうとするとその膨大さに圧倒されてし
まいます。
冗長さを避け、いかに必要なポイントを押さえて作図するかは、まさに『職人技』の
世界になります。もともと『モデル化』自体が高度に知的な作業ですし。

現実の作図には、紙と鉛筆のスケッチがありなのですが、ソフトを使う場合、Visio
という選択もあります。しかし Free でとてもすばらしい描画ソフトがリリースされ
ているので ご紹介します。作者の福代 昌之さんや 貢献している皆様には、感謝です。
(従来 Molips と呼んでいたものが VersionUPで DynamicDraw と変更になりましたの
 でMolips という 旧呼称 もしばしば出てきますが混乱のないように。)
・ DynamicDraw 
http://www.molips.com/jp/
・ MolipDraw Fun Club
http://shibaguchi.com/molip/index.html
・ Dynamic Draw Supporters (UMLテンプレート 取扱説明書など)
http://www3.to/d-d-s
・ Dynamic Draw 関連プラグイン
http://www.cam.hi-ho.ne.jp/~hirosawa/DynamicDraw/

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ オブジェクト指向プログラミング
──────────────────────────────────────
 オブジェクト指向の特長(前回の復習)
 1) カプセル化 (encapsulation)
 2) 継承 (inheritance)
 3) 多態性 (polymorphism)

Javaは、これらの機能を言語仕様でサポートしていますので、評価を得ています。
VBは、メソッドとかは、オブジェクト指向風になっていますが、継承の機能は、もっ
ていませんでした。VB.NETではサポートされたようです。

オブジェクト指向スクリプト言語 Rubyでは、もちろん全部サポートされています。

オブジェクト指向プログラミングの話では、Javaが頻出します。もともとC++向けに
書かれた分をJava向けにリライトしたものも多く、オブジェクト指向の本質は、言語
に依存しません。もちろん実装は、言語にておこなわれますので、言語による特徴が
現れます。

ではいよいよ総論と並行して、実際の Rubyプログラミングの話も進めましょう。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■■   Rubyプログラミングの基礎
──────────────────────────────────────
サーバサイドで、JavaPHP,Perl の位置づけで オブジェクト指向をおいしく頂きな
がら Ruby を使おう というのがターゲットなのですが、まずは最初の一歩からです。

──────────────────────────────────────
■ 環境整備
──────────────────────────────────────
・ Linux版ダウンロード
http://www.ruby-lang.org/ja/download.htmlRubyインストール
http://www.ruby-lang.org/ja/install.htmlWindowsユーザの為のWindows版のてっとりばやい方法
 ActiveScriptRuby
http://www.geocities.co.jp/SiliconValley-PaloAlto/9251/ruby/
からActiveRuby.msiをダウンロードして.msiファイルをクリックするだけです。

・ Ruby 稼働の確認 (これはWindowsでの例。Linuxでも同様)

プロンプト>ruby -v
と入力して
プロンプト>ruby 1.6.7 (2002-03-01) [i586-mswin32]
とかバージョンが、正しく返ってくればOKです。

──────────────────────────────────────
■ はじめの一歩 スクリプト言語としての Ruby
──────────────────────────────────────
【 Linuxの場合 】
・ hello.rb ソースファイル作成

#!/usr/local/bin/ruby
puts "Hello, Webのツボ!"

・ 実行
$ ./hello.rb
bash: ./hello.rb: bad interpreter: Permission denied

実行権限がないと怒られます。

実行権限を付与してやります。
$ sudo chmod 755 hello.rb
Password:

では再度実行します。
・ 実行
$ ./hello.rb
Hello, Webのツボ!

【 Windowsの場合 】
・ hello.rb ソースファイル作成

#!c:\program files\ruby\ruby.exe
puts "Hello, Webのツボ!"

・ 実行
> ruby hello.rb
Hello, Webのツボ!

簡単ですね(^^ゞ では 次のステップへ進みましょう。

──────────────────────────────────────
■ オブジェクト指向 (class を使った) Ruby 
──────────────────────────────────────
【 Linuxの場合 】
・ oo.rb ソースファイル作成

#!/usr/local/bin/ruby -ke
class Oo
  def initialize(x)
    @string = x
  end
  def println
    print @string, "\n"
  end
end

hello = Oo.new("オブジェクト指向スクリプトRuby!")
hello.println

・ 実行
$ ./oo.rb
オブジェクト指向スクリプトRuby!

【 Windowsの場合 】
・ oo.rb ソースファイル作成

#!c:\program files\ruby\ruby.exe
class Oo
  def initialize(x)
    @string = x
  end
  def println
    print @string, "\n"
  end
end

hello = Oo.new("オブジェクト指向スクリプトRuby!")
hello.println

・ 実行
>ruby oo.rb
オブジェクト指向スクリプトRuby!

何で1行文字を出力するのに、こんなに面倒なことをするのかは次に説明を進めます。

・ クラスの定義

 クラスの定義は、class と end で囲みます。

 class クラス名
  〜
 end

 です。

・ メソッドの定義

 メソッドの定義は、 def と end で囲みます。
 
 def メソッド名
  〜
 end

 初期化メソッドメソッド名は、initialize と決まっています。

 この初期化メソッドは、インスタンスの生成 ( new )の
 際に実行されます。
 
 メソッド名は、自由に決定します。
 ここでは、文字列出力メソッドとして println を定義します。

 メソッドを決めて、その中の処理を記述してゆくのが、オブジェクト指向プログラ
 ミングのスタイルです。

・ インスタンス変数の定義
 @hoge = fuga

クラスを使うと何がうれしいのかは、「継承」をつかって「差分プログラミング」
ができることです。

続く....

【おまけ】
■ Webテクノロジーの基礎知識
http://www-6.ibm.com/jp/software/websphere/developer/pdf/webtech.pdf

 Webサービスに至るまで、網羅的によく説明されています。
 若干オブジェクト指向の説明もあります。

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