Date:  Wed, 20 Oct 2004 14:12:01 +0900
Subject:  【オブジェクト倶楽部: 2004-39号】

       ┏━━━━━━━━━━━━━━━━━━━━━━━━━━■
       ┃                         ■┃
      ●┃● ● オ ブ ジ ェ ク ト 倶 楽 部   ■ ┃
       ┃                       ■  ┃
       ┗━━━━━━━━━━━━━━━━━━━━━━■━━━┛
                          No.67 2004/10/20

■ I N D E X
┃
┣【Topics】オブジェクト倶楽部クリスマスイベント開催決定
┣【新発想】オブジェクト指向の再定義[1] - EoT
┣【プログラミング】C#で学ぼうオブジェクト指向入門 [12]
┗【アンケート】気になるシステム業界 ホントのところ

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

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

        イベント開催日: ☆★12月9日(木)★☆

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━1 s t ■━
■
┗【新発想】オブジェクト指向の再定義[1] - EoT

今回から新連載として「オブジェクト指向の再定義」を開始する。特に最近の
アジャイル開発の動向から、オブジェクト指向を見つめなおしてみたい、とい
う動機だ。なおこの連載は、最近の本、セミナー、blog、私信メール、そして
実践から感じていることを、新発想として提示していこう、という意気込みで
あり、まだ業界としての定説に至っていない、もしくは至りつつある内容が中
心である。ぜひみなさん、読んだ感想をフィードバックして、平鍋に連載の勇
気をください。

さて、第一回は、「テスト」である。良い設計とはなにか、と問われて、凝集
度と結合度に関する議論を思いつく人も多いだろう。しかし、この定義よりもっ
と具体性がある設計方針として、テストを考える。テストの視点によってオブ
ジェクト指向を再定義したい。キーワードは、EoT(*1)(Ease of Testing)、テ
スト容易性だ。

この記事では、

    EoTの高い設計が、よいオブジェクト指向設計である。

と主張する。設計品質の中で「テスト容易性(EoT)」を最上位と見るのだ。オブ
ジェクト指向のさまざまな機構、用語、考え方は、すべて EoT のため、と捕ら
えられる。例えば、

・継承という言語機構は、Mock(*2)を作るためのもの。
・実装ではなくインターフェイスに対してプログラミングするのは、テストし
  やすくするため。
・よいモジュール分割とは、テストしやすいモジュール分割である。
・循環依存性を排除するのは EoT のため。
・DI(Dependency Injection)は、EoTのためのツール。

ちょっと本末転倒に感じられるかもしれない。しかし、他の業界ではテスト容
易性をもっと重視している例が多い。例えば、コンピュータのハードウェアは
「テストが可能な設計」になっていることが普通だ。テスト用のジャンパーは
設計に折り込み済みだし、メモリにはパターンの記録とチェックができる機能
がある。

写真は、「テストパターンを放送するテレビ」だ。
http://www.ObjectClub.jp/ml-arch/magazine/magazine67/TV.JPG

テレビプログラムは、最初からテレビの受像機をテストする、という機能を折
り込み済みなのである。

他にも、ソフトウェア以外でテストを「折り込み済み」の設計を見つけたらぜ
ひ教えて欲しい。

テストが、最終的な顧客価値の検証になるのだから、テストができない設計な
ど、意味がないと言えないだろうか。(平鍋)

[1] EoT: Ease of Testing、テスト容易性。Testability に替わる平鍋の造語

[2] Mock: ユニットテストで用いられるテストスタブ技法

(参考文献) 『アジャイル開発の奥義』など
http://www.amazon.co.jp/exec/obidos/ASIN/4797323361/xpjp-22
_______________________________________________________________________
この記事への評価にご協力をお願いします。
URLをクリックして、「ご協力ありがとうございました」のメッセージがご使用
のブラウザに表示されれば投票完了です。
良かった:
http://www.ObjectClub.jp/cgi-bin/question.cgi?K001+0+0
普通:
http://www.ObjectClub.jp/cgi-bin/question.cgi?K001+0+1
イマイチ:
http://www.ObjectClub.jp/cgi-bin/question.cgi?K001+0+2

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━2 n d ■━
■
┗【プログラミング】C#で学ぼうオブジェクト指向入門 [12]

■はじめに
この記事は、初級開発者である私がみなさんと一緒にC#を使ってオブジェクト
指向(OO)の基礎を気軽に勉強していこう、という内容です。

■目標
今回は『C#の「イベント」を理解』をテーマに学習していきます。
C#の「イベント」は、あるオブジェクトの状態に変更が起きたとき、その通知
を受けるための仕組みです。マウスクリックの通知なども、この「イベント」
を使って実装するのが一般的です。
 
イベントは前回までに紹介したデリゲートと合わせて使われます。デリゲート
については前回の記事

  C#で学ぼうオブジェクト指向入門 [11]
 http://www.objectclub.jp/ml-arch/magazine/68.html

を参考にしてください。

■内容
まずはイベントを使ったプログラムを見てみましょう。
このプログラムは、1つの水槽タンクの水量が変化したときに、その変化を2つ
のパネルに通知し、それぞれのパネルで水量を表示するというものです。

======================================================================
using System;

class WaterTank {  
    private int currentVolume;
    // ★1
    public delegate void VolumeChangeEventHandler(int currentVolume);
    // ★2
    public event VolumeChangeEventHandler volumeChangeEvent;
    
    public int CurrentVolume {
        get 
        {
            return currentVolume;
        }
        set 
        {
            currentVolume = value;
            Notify();
        }
    }
    
    protected virtual void Notify()    {
        if (volumeChangeEvent != null) 
        {
            // ★3
            volumeChangeEvent(CurrentVolume);
        }
    }
}

class TankVolumePanel {
    private string name;
    public TankVolumePanel(string name) {
        this.name = name;
    }
    
    // ★4
    public void Print(int currentVolume) {
        Console.WriteLine("パネル名:{0}\t水量{1}", name, currentVolume );
    }
}

class MainApp {
    public static void Main() {
        WaterTank tank = new WaterTank();
        TankVolumePanel panel1 = new TankVolumePanel("パネルA");
        TankVolumePanel panel2 = new TankVolumePanel("パネルB");
        // ★5
        tank.volumeChangeEvent +=
            new WaterTank.VolumeChangeEventHandler(panel1.Print);
        tank.volumeChangeEvent += 
            new WaterTank.VolumeChangeEventHandler(panel2.Print);
        while(tank.CurrentVolume < 50) {
            tank.CurrentVolume += 10;
        }
    }
}
======================================================================
■説明
▲イベント発生側の実装 (WaterTankクラス)
●★1でデリゲートを宣言します。
    public delegate void VolumeChangeEventHandler(int currentVolume);

●★2でイベント宣言します。
    public event VolumeChangeEventHandler volumeChangeEvent;
この例では、「タンクの水量が変更されたよ」のイベントを宣言しています。

●★3でイベントを発生させます。
            volumeChangeEvent(CurrentVolume);
この例では、「タンクの水量が変更されたよ」のイベントを発生させています。
ここで注目すべき点は、タンクの水量が変更されたら何らかの処理をすること
は決まっていても、実際にどのような処理するかをイベント発生側の実装で決
定していない点です。これによって、イベント発生時に行う処理を柔軟に変更
できるようになっています。

▲イベント受け取り側の実装(TankVolumePanel、MainAppクラス)
●★4でイベント発生時に行う具体的な処理を記述します。
    public void Print(int currentVolume) {
        Console.WriteLine("パネル名:{0}\t水量{1}", name, currentVolume);
    }
デリゲートで宣言した同じ戻り値の型、引数であればOKです。特別インタフェー
スを用意して実装する必要はありません。
この例では、水量をコンソール表示しています。

●★5でイベント接続をします。
        tank.volumeChangeEvent +=
            new WaterTank.VolumeChangeEventHandler(panel1.Print);
イベントが発生したときに、具体的にどのような処理を行うかをここで決めて
います。
この例では、「タンクの水量が変更されたよ」イベントが発生したら、現在の
水量を表示する処理が呼び出されるようにイベント接続を行っています。

ここで注目すべき点は、イベント発生時に実際に行う処理を簡単に接続できる
ことができるという点です。別の処理をしたいというときには、同じ戻り値の
型と引数のメソッドを用意して、イベント接続をすればそれだけでOKです。ま
た削除するには、「-=」するだけでOKです。

ここで、デリゲートだけでも実現できるのではと疑問に思ったかもしれません
が、eventをつけてあげることで次のような制約をつけることができます。
・WarterTank外部からはイベント接続(+=, -=)のみを許す
・イベント発生はWaterTank内部からのみを許す
これによって、WarterTankを使う側は、より間単、安全にイベントを取り扱う
ことができます。

■まとめ
今回はイベントについて学習しました。もし、イベントとデリゲートなしで実
装しようとすれば、イベント通知を受けるためのインタフェースを用意して実
装したり、複数のイベント通知先の登録削除を自分で作成したりと、手間がか
かってしまいます。イベント、どんどん使っちゃいましょう。(IENAGA)
_______________________________________________________________________
この記事への評価にご協力をお願いします。
URLをクリックして、「ご協力ありがとうございました」のメッセージがご使用
のブラウザに表示されれば投票完了です。
良かった:
http://www.ObjectClub.jp/cgi-bin/question.cgi?E003+11+0
普通:
http://www.ObjectClub.jp/cgi-bin/question.cgi?E003+11+1
イマイチ:
http://www.ObjectClub.jp/cgi-bin/question.cgi?E003+11+2
 
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━3 r d ■━
■
┗【アンケート】気になるシステム業界 ホントのところ

今週は「髭生やしてますか?」のホントのところ。読者の方からのリクエスト
です。オブジェクト倶楽部のイベントでも、各種コミュニティでも、立派な髭
を蓄えている方をよくお見かけしますよね。
 
  がっつり生やしています。
     http://www.ObjectClub.jp/cgi-bin/question.cgi?Z001+32+0
  ちょび髭生やしてます。
     http://www.ObjectClub.jp/cgi-bin/question.cgi?Z001+32+1
  生やしたいのですが、事情により剃ってます。
     http://www.ObjectClub.jp/cgi-bin/question.cgi?Z001+32+2
  生やしたくないので添ってます。
     http://www.ObjectClub.jp/cgi-bin/question.cgi?Z001+32+3
  女性なので生やせません。
     http://www.ObjectClub.jp/cgi-bin/question.cgi?Z001+32+4
  女性だけども生えてます。
     http://www.ObjectClub.jp/cgi-bin/question.cgi?Z001+32+5
  それは秘密です。
     http://www.ObjectClub.jp/cgi-bin/question.cgi?Z001+32+6
  ちょっと語らせて!
     editors@ObjectClub.jp まで詳細を!!

アンケート結果はオブジェクト倶楽部サイト上にて公開します。お楽しみに。
なお、前号「好きな季節はいつですか」の結果は公開中。是非ご覧下さい。
⇒http://www.ObjectClub.jp/special/kininaru
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━--■--●--■
■
┗編集後記

こんにちは、編集人です。今年でプリクラ誕生10周年だそうです。プリント倶
楽部、略称プリクラ。ならば、オブジェクト倶楽部、略してオブクラ?そう思っ
て「オブ倶楽」と言い続けてきたのですが、あまり浸透せず。。ならば、いっ
そ略称を変更してしまおうかとオブジェクト倶楽部メンバーで話してました。
オブジェクト倶楽部、略してオブ楽部=オブLOVE。ちと強引な気もしますが、
普及活動、開始してみようかと思ってます。皆さんも、是非ご唱和(?)くだ
さいね。
 
今週の強引な一言
*** 創造は過去と現在とを材料としながら新しい未来を発明する能力です
(与謝野晶子)***
過去を振り返ることで、プロジェクトの新しい未来が見えるものです。あなた
自身で、プロジェクトの未来を想像しませんか。
(さとみ)

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