Date:  Wed, 27 Apr 2005 13:31:09 +0900
Subject:  【オブジェクト倶楽部: 2005-15号】

       ┏━━━━━━━━━━━━━━━━━━━━━━━━━━■
       ┃                         ■┃
      ●┃● ● オ ブ ジ ェ ク ト 倶 楽 部   ■ ┃
       ┃                       ■  ┃
       ┗━━━━━━━━━━━━━━━━━━━━━━■━━━┛
                          No.90 2005/04/27

■ I N D E X
┃
┣【Topics】オブジェクト倶楽部イベント開催決定!
┣【臨時】石井勝さん、追悼の言葉
┣【プログラミング】Rubyで進むオブジェクトの道 〜脱初心者をめざして〜[4]
┗【アンケート】気になるシステム業界 ホントのところ

〇━━━━━━━━━━━━━━━━━━━━━━━━━━━T o p i c s━
 〇  オブジェクト倶楽部イベント開催決定!
  〇 〇━━━━━━━━━━━━━ ━━・ 

オブジェクト倶楽部納涼イベント、みなさんにご好評いただいて、今年も開催
決定です。イベントも今回で4回目。みなさんのご期待を裏切ることのないよう、
詳細を今煮詰めているところです。決定次第、順次発表していきます。
まずは、下記の開催日をあけておいてくださいね。

       イベント開催日: ☆★6月29日(水)★☆

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━1 s t ■━
■
┗【臨時】石井勝さん、追悼の言葉

このたびの尼崎の事故には、私も大変お世話になった石井勝さんが含まれてい
た、ということを、昨日友人からのメールで知らされました。石井さんは、
masarlさん、というハンドル(ニックネーム)で知られ、日本のオブジェクト
指向界で、数多くの功績を残されています。

http://homepage3.nifty.com/masarl/

特に、Robert C. Martinのオブジェクト指向の原則を、彼自身の本に先立って
C++ Report 誌の記事からまとめたり、Bertrand Meyer のOCP(開放閉鎖原則)を
使ってデザインパターンの本質を見極めたり、さらに、Kent Beck の JUnit 
Testing Framework の内部構造を紹介したり、という記事を 1999 年という非
常に早い時期に行っています。まさに、日本のOOのアンテナであるとともに、
その分かりやすく創意に満ちた文章で、日本には石井さんのファンが多く存在
しています。

私もXP関係の飲み会で過去何度かお話させて頂き、その優しくて謙虚な人柄に
ふれました。心から、ご冥福をお祈りいたします。

このたびの事故に際しまして、石井勝さんを追悼する掲示版を臨時で設けまし
たので、ぜひ、思い出のある方は書き込んでいただければと思います。
http://www.ObjectClub.jp/community/memorial/(平鍋) 
 
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━2 n d ■━
■
┗【プログラミング】Rubyで進むオブジェクトの道 〜脱初心者をめざして〜[4]

●はじめにを記す
コレクションの要素に順次にアクセスして何かの処理をさせるといったことは、
よく書くプログラミングコードです。Rubyでどのようにアクセスするのでしょう
か?詳しく調べてみましょう。

●プログラムを書く
早速Rubyで書いてみましょう。
--<each_sample_test.rb>-----------------------------------------------
require 'test/unit'
class EachSampleTest < Test::Unit::TestCase
  def test_total_internal_iterator
    total = 0
    [2, 7, 1, 8].each { |e|
      total += e
    }
    assert_equal(18, total)
  end
end
----------------------------------------------------------------------

eachを使って、配列要素の合計を計算しています。
    total = 0
    [2, 7, 1, 8].each { |e|
      total += e
    }

●チェックポイントを書く
ここでのポイントは、繰り返し(for,while)自身は配列オブジェクトに任せ、
私自身は、繰り返しで具体的に何をするかに注力してプログラミングしている
ことです。(eachは繰り返しのキーワードではなく、「配列のメソッド」であ
ることに注目してください!)

デザインパターンでいうところの、Iteratorパターン(外部イテレーター)より、
Visitorパターン(内部イテレーター)に近い構造と振る舞いになっています。

Rubyの「ブロック」を使って,eachメソッドに処理のブロックを渡すようにして
  ・配列側に複数要素にアクセスする責務
  ・eachメソッド呼び出し側にアクセスした要素を使って、実際に何かの処理
    を行う責務 (今回の例では、合計の計算)
の役割分担を行っています。

ブロックの詳細については、以下のページを参考にしてください。
http://www.ruby-lang.org/ja/man/?cmd=view;name=FAQ%3A%3A%A5%D6%A5%ED%A5%C3%A5%AF%C9%D5%A4%AD%A5%E1%A5%BD%A5%C3%A5%C9%B8%C6%A4%D3%BD%D0%A4%B7

Javaでメソッドに処理を渡す場合、Rubyのように「ブロック」という文法がな
いため、代わりにインタフェースを使って処理を渡すことになります。
しかし、インタフェースを使うと、残念ながら、少々手間がかかり、わかり難
いコードになってしまいます。

---<MyArrayTest.java>-------------------------------------------------
// Javaでの内部イテレーターの実装例
import junit.framework.TestCase;

public class MyArrayTest extends TestCase {
    public void testTotal() {
        // 言語仕様上、インナークラスで利用するローカル変数はfinalで
        // 宣言する必要があり、int型では、足し算ができない。
        // そのため、配列を使って回避した。
        // このコメント、「不吉な臭い」だなぁ。だけど、
        // わざわざ、コードをわかりやすくするクラスを用意するのも、
        // なんだかなぁ〜。
        final int[] total = new int[1];

        //eachメソッドに無名クラスでインタフェースの実装をした処理を渡す
        //しかし、微妙に読みにくい
        new MyArray(new int[] {2, 7, 1, 8}).each(new MyArray.Closure() {
            public void execute(int element) {
                total[0] += element;
            }
        });
        assertEquals(18, total[0]);
    }
}

---<MyArray.java>----------------------------------------------------
public class MyArray {
    private int[] array;
    public static interface Closure {
        public void execute(int element);
    }

    public MyArray(int[] data) {
        this.array = data;
    }
    public void each(Closure closure){
        for (int i = 0; i < array.length; i++) {
            closure.execute(array[i]);
        }
    }
}
----------------------------------------------------------------------

ところが、Rubyだと、「ブロック」を使えば、インタフェースと比べ、簡単に
ちょちょいと処理をメソッドに渡すことができます。
# Cool!!

●eachメソッド以外の紹介をする
Rubyの配列には、eachメソッドのほかにもブロックが渡せる便利なメソッドが
あります。ここでは、inject,collect,find,sortを紹介します。

--<sample_test2.rb>---------------------------------------------------
require 'test/unit'

class EachSampleTest < Test::Unit::TestCase
  def test_inject_total
    actual = [2, 7, 1, 8].inject(0) { |result, e| result + e }
    assert_equal(18, actual)
  end
  def test_collect
    product_names = ["  JUDE-Pro\n", "\tJUDE-Community\n"]
    actual = product_names.collect {|e| e.strip}
    assert_equal("JUDE-Pro", actual[0])
    assert_equal("JUDE-Community", actual[1])
    assert_equal("  JUDE-Pro\n", product_names[0])
  end
  def test_find_all_sort
    result =
     [2, 7, 1, 8].find_all{|a| a <= 7}.sort{|a,b| a <=> b}
    assert_equal(1, result[0] )
    assert_equal(7, result[2] )
  end
end
----------------------------------------------------------------------
一つ目のテストは、配列要素の合計するプログラムをeachからinjectに書き直
したものです。eachの場合と比べ、totalのような一時変数が削除でき、より
Rubyらしいコードになります。コードの読み方のコツとしては
  0 + 2 = 2               (メソッド引数 0と配列要素[0]の足し算)
  2 + 7 = 9               (前回の足し算結果と配列要素[1]の足し算)
  9 + 1 = 10              (前回の足し算結果と配列要素[2]の足し算)
  10 + 8 = 18             (前回の足し算結果と配列要素[3]の足し算)
の形を 一般化して
  result + e
と表現していると考えればOKです。

二つ目のテストは、不要なスペース、タブ、改行を取り除いた文字列の配列を
生成する際に、collectを使っています。collectメソッドに場合,配列要素は
変更されません。もし配列自身を変更し対場合は、collect!メソッドを利用し
ます。

三つ目のテストは、配列から7以下の要素を選択し、小さい順にソートするため
に、find_allとsortを続けて書き、たった一行で実現しています。

そのほかの、配列のメソッドについては
http://www.ruby-lang.org/ja/man/?cmd=view;name=Array;em=Array
を参考にしてください。

●まとめを書く
・要素のアクセスは配列に任す
・アクセスした要素で具体的に何の処理をするかは、各々のブロックで記述する

ブロックを使った内部イテレーター、すばらしぃ!!(IENAGA)
_______________________________________________________________________
この記事への評価にご協力をお願いします。
URLをクリックして、「ご協力ありがとうございました」のメッセージがご使用
のブラウザに表示されれば投票完了です。
良かった:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=E006-3&choice=0
普通:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=E006-3&choice=1
イマイチ:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=E006-3&choice=2

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━3 r d ■━
■
┗【アンケート】気になるシステム業界 ホントのところ

今週は「ゴールデンウィーク何日お休みですか?」のホントのところ。久しぶ
りの大型連休といわれる今年のG.W。暦どおりだと8日なんですよね。みなさ
ん、何日お休みありますか?

  11日以上!
     http://www.ObjectClub.jp/special/kininaru/vote?vol=57&choice=0
  飛び石連休つなげて10日!
     http://www.ObjectClub.jp/special/kininaru/vote?vol=57&choice=1
  8〜9日。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=57&choice=2
  3〜7日。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=57&choice=3
  1〜2日。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=57&choice=4
  なし。仕事詰めです。。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=57&choice=5
  それは秘密です。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=57&choice=6
  ちょっと語らせて!
     editors@ObjectClub.jp まで詳細を!!

アンケート結果はオブジェクト倶楽部サイト上にて公開します。お楽しみに。
なお、前号「マインドマップ使ってますか?」の結果は公開中。是非ご覧下さ
い。
⇒http://www.objectclub.jp/special/kininaru/vol56/PlonePopoll_results2
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━--■--●--■
■
┗編集後記

こんにちは、編集人です。尼崎の脱線事故には衝撃を受けました。みなさん、
被害はないですか。どうぞご無事でおられることをお祈り致します。また、亡
くなられた方のご冥福を心よりお祈り申し上げます。

なお、来週のメールマガジンはお休みさせていただきます。今年は長期連休と
なる方も多くいらっしゃるのではないでしょうか。事故なく、怪我なく、充実
したゴールデンウィークをお過ごしください。 

今週の強引な一言
*** 物は試し(慣用句)***
オブジェクト指向、ファシリテーション、マインドマップ。新しいことが次々
出てきますね。身構えているだけでは何もならないし、始めてみればうまく行
くかもしれません。きっかけはオブジェクト倶楽部が提供します。とにかくやっ
てみませんか?
(さとみ)

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━--■--●--■
● ご意見、ご感想は         ⇒このメールに返信ください
〇 配信中止、アドレス変更は ⇒http://www.ObjectClub.jp/community/object_ml/help/
〇 免責事項、過去の記事は   ⇒http://www.ObjectClub.jp/community/object_ml/
■ 発行:オブジェクト倶楽部 ⇒http://www.ObjectClub.jp/
■ 編集代表:平鍋  健児
Copyright (c)2003-2005 オブジェクト倶楽部. All Rights Reserved.
powered by Eiwa System Management, Inc.