Date:  Wed, 01 Sep 2004 12:32:31 +0900
Subject:  【オブジェクト倶楽部: 2004-32号 】

       ┏━━━━━━━━━━━━━━━━━━━━━━━━━━■
       ┃                         ■┃
      ●┃● ● オ ブ ジ ェ ク ト 倶 楽 部   ■ ┃
       ┃                       ■  ┃
       ┗━━━━━━━━━━━━━━━━━━━━━━■━━━┛
                          No.60 2004/09/01

■ I N D E X
┃
┣【Topics】オブジェクト指向ソフトウェア技術者向け「お試しセミナー」
┣【書評】新着紹介!「リーンソフトウェア開発」
┣【プログラミング】C#で学ぼうオブジェクト指向入門 [10]
┗【アンケート】気になるシステム業界 ホントのところ

〇━━━━━━━━━━━━━━━━━━━━━━━━━━━T o p i c s━
 〇  オブジェクト指向ソフトウェア技術者向け「お試しセミナー」
  〇 〇━━━━━━━━━━━━━ ━━・
 
10月よりオブジェクト倶楽部を運営、管理している永和システムマネジメント
では、オブジェクト指向技術者の皆様向けに、教育サービスを行います。
その特別企画として、9月29日(水)に「お試しセミナー」を実施します。セミ
ナーの内容は『ユニットテスト技法』です。奮ってご参加ください。
http://po2d.esm.co.jp/ 
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━1 s t ■━
■
 ┗【書評】新着紹介!「リーンソフトウェア開発」

● 書名: リーンソフトウェア開発
―アジャイル開発を実践する22の方法―
● 著者名: メアリー・ポッペンディーク、トム・ポッペンディーク
● 訳者名:平鍋健児、高嶋 優子、 佐野 建樹
● 発行: 日経BP
http://www.amazon.co.jp/exec/obidos/ASIN/4822281930/xpjp-22

訳者、平鍋自身から新着本を紹介させてください。

私は、この本を、ソフトウェア開発現場のリーダーにぜひ読んで欲しいと思っ
て訳しました。

よく、ソフトウェア開発は土木、建築、製造などの他の先輩業種からもっと多
くのことを学ぶべきだ、といわれます。これらの業種では、「しっかりしたプ
ロセス」を用いて「しっかりした設計」を行い、「属人性を排除」して、「工
学的に」ものづくりが行なわれている、だから、ソフトウェア開発もこのよう
に行なうべきだ、という論です。しかし、この思い込みには、この20年間で
これらの業種が経てきた生産革新についての認識がありません。実際の生産革
新の現場では、絶え間ない改善、モチベーションの重視、現場参加の環境づく
り、などの活動が大きな原動力となっています。さらに、ソフトウェア開発を、
「製造工程」だと位置づけるのも根本的に間違っています。ソフトウェア開発
は、同じものの繰り返し生産とは全く違います。この活動の本質は「発見」と
「学習」であり、コーディングも含めて、常にトレードオフを伴う知的「設計」
活動と位置づけるべきです。だからこそ、人に焦点を当てたマネジメントが、
この活動を正しく導く鍵となるのです。

先日、ある製造業の生産革新を行なっている工場を訪問する機会を得ました。
そこでは、各ラインのチーフを「店長」と呼び、店長の名前とともに、「顔写
真」と「モットー」が、大きくラインの上に張り出されていました。こういっ
た現場の一体感と目に見えるマネジメントこそが、リーン思考の原点だと私は
感じました。

本書では、リーン生産の原則を使って、ソフトウェア開発という活動の本質を
解き明かし、22個の思考ツールを読者に提供します。読者は、みずからの開
発現場において、このツールを使って、実際のプラクティスを編み出していく
手がかりが得られるでしょう。XP (Extreme Programming)を本で読んだから
と言って、そのままピュアな形で自分の開発現場に適用しようとするのは無謀
です(そんな人はいないでしょう!)。プロセスは、「これが唯一正解」とい
うものはありえず、状況に応じて作り、また改善していく必要が元来あります。
あなたがたずさわるプロジェクトの特徴、システムの性質、属する企業の文化、
顧客との関係、それらすべてがプロセスに影響するのです。だから、いつでも
あなたの現場にあったプロセスを作り、それをたえず改善しなければなりませ
ん。本書の思考ツールをいつも頭にしまっておけば、そのプロセス作りの大き
な助けになるはずです。

私は、この本を、ソフトウェア開発現場のリーダーに読んで欲しいと思って、
訳しました。ぜひ手に取ってみてください。
きっと一つの指針を得ることができると思いますよ。(平鍋) 
_______________________________________________________________________
この記事への評価にご協力をお願いします。
URLをクリックして、「ご協力ありがとうございました」のメッセージがご使用
のブラウザに表示されれば投票完了です。
良かった:
http://www.ObjectClub.jp/cgi-bin/question.cgi?A001+5+0
普通:
http://www.ObjectClub.jp/cgi-bin/question.cgi?A001+5+1
イマイチ:
http://www.ObjectClub.jp/cgi-bin/question.cgi?A001+5+2

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

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

■目標
『C#の「デリゲート」を理解』をテーマに学習していきます。さくっと解説す
るとデリゲートは関数ポインタのようなものです。関数ポインタと異なる主な
点は、タイプセーフであることです。インターフェースと似たような効果が得
られます。

■内容
まずはデリゲートを使ったソースコードの一部を見てみましょう。
TransactionCommandを簡単に解説すると、トランザクション処理したいメソッ
ドを包み込んで処理してくれるクラスです。インタフェースを使う方法もあり
ますが、ここではデリゲートを使っています。

======================================================================
// ★1
delegate void ExecuteTransactionTarget();
class TransactionCommand {
    private ExecuteTransactionTarget executeTransactionTarget;
    public TransactionCommand(ExecuteTransactionTarget target) {
        // ★2
        this.executeTransactionTarget = target;
    }
    public void Execute() {
        Console.WriteLine("トランザクション開始");
        // ★3
        executeTransactionTarget();
        Console.WriteLine("トランザクション終了");
        // 失敗したらロールバック処理
    }
}

======================================================================
★1ではデリゲートの宣言、★2では呼び出し先のリンク付け、そして、★3で
は、デリゲート先の呼び出しをしています。ここで注目すべき点はデリゲートを
使うことで、コンパイル時には実際に呼び出しするメソッドが決定されていない
点です。これによって、呼び出し先のメソッドを間単に変えることができます。

デリゲートでは、呼び出したいメソッドがデリゲート宣言と同じ引数があれば、
どんなメソッド名でも呼び出せるようになっています。もしデリゲートを使わず
にインタフェースで代替するなら、

interface Command {
    void Execute();
}
class TransactionCommand /*:Command*/{
    private Command target;
    public TransactionCommand(Command target) {
        this.target = target;
    }
    public void Execute() {
        Console.WriteLine("トランザクション開始");
        target.Execute();
        Console.WriteLine("トランザクション終了");
        // 失敗したらロールバック処理
    }
}

といった感じになります。ただし、トランザクション処理をしたいメソッドを
持つクラスは、Commandインタフェースを実装しなければならない、トランザ
クション対象のメソッドはCommandで宣言した操作(Excecute())に限られる
など、デリゲートよりも制約が多くなっています。

次にトランザクション処理の実装例を見てみましょう。ここでは、トランザク
ション処理の一般的な例題の、銀行の口座Aから口座Bへの送金をあげます。
(銀行の送金は、(1)送金元の口座引き出し(2)送金先の口座預け入れの2つが
完了して、初めて業務上で整合性がとれた状態です。何らかの理由で(1)の途
中で処理が中断して状態が記録されれば、業務上の矛盾が生じるため、(1)の途
中で処理が失敗した場合は、送金処理の実行前の状態に戻すなどの、トランザ
クション処理が必要になります。) 

★5を中心にご覧ください。
======================================================================

class MainClass
{
    private static int fromId;
    private static int toId;
    public static void Main()
    {
        InitDB();
        TransferCommand cmd = new TransferCommand();
        cmd.FromID = fromId;
        cmd.ToID = toId;
        cmd.TransferMoney = 9000;
        // ★5
        new TransactionCommand(
            new ExecuteTransactionTarget(cmd.Transfer)).Execute();
    }
    
    private static void InitDB() {
        Account fromAccount = new Account();
        fromAccount.Money = 10000;
        fromId = AccountDB.Insert(fromAccount);
        Account toAccount = new Account();
        toAccount.Money = 222;
        toId = AccountDB.Insert(toAccount);
    }
} 

 
class TransferCommand {
    ・・・
    public int FromID {・・・}
    public int ToID {・・・}
    public long TransferMoney {・・・}
    public void Transfer() {
        getWithdrawCommand().Withdraw();
        getDepositCommand().Deposite();
    }
    private WithdrawCommand GetWithdrawCommand() {・・・}
    private DepositCommand GetDepositCommand() {・・・}
} 
   
  
class WithdrawCommand {
    ・・・
    public int ID {・・・}
    public long WithdrawMoney{・・・}
    public void Withdraw() {・・・}
}

class DepositCommand{
    ・・・
    public int ID {・・・}
    public long DepositMoney{・・・}
    public void Deposite() {・・・}
}
class Account {
    ・・・
    public int ID {・・・}
    public long Money {・・・}
} 

class AccountDB {
    ・・・
    public static int Insert(Account account) {・・・}
    public static void Update(Account account){・・・}
    public static Account Find(int id) {・・・}
    public static void Remove(int id) {・・・}
} 

======================================================================
★5で実際に呼び出すメソッド(TransferCommandのオブジェクトのTransferメ
ソッド)とデリゲートを関連付けています。Execute()を呼び出すと、その中
で、トランザクション開始、送金処理、トランザクション終了(トランザクシ
ョンに失敗すれば、ロールバック)といった順序で処理が実行されます。同様
な使い方で別のトランザクション処理をしたいメソッドをデリゲートで関連付
けてあげれば、簡単にトランザクションが実行できるようになる、を意図して
実装しました。 

■まとめ
デリゲートについて学習しました。デリゲートは、進化した関数ポインタです。
デリゲートを使うとメソッドの呼び出し元と呼び出し先の依存関係を弱めるこ
とができ、システムの柔軟性が増します。インタフェースでも代替出来ますが、
デリゲートを使った方が、インタフェースが不要になるなど、コードがよりシ
ンプルになる場合があります。呼び出し先が、今回は1つのみでしたが、複数
も可能です。状態変更を複数に通知する、複数のコマンドをまとめ実行すると
いった実装がデリゲートを使うと簡単にできます。次回はここら辺を探るため、
引き続きデリゲートについて学習します。(IENAGA)  
_______________________________________________________________________
この記事への評価にご協力をお願いします。
URLをクリックして、「ご協力ありがとうございました」のメッセージがご使用
のブラウザに表示されれば投票完了です。
良かった:
http://www.ObjectClub.jp/cgi-bin/question.cgi?E003+9+0
普通:
http://www.ObjectClub.jp/cgi-bin/question.cgi?E003+9+1
イマイチ:
http://www.ObjectClub.jp/cgi-bin/question.cgi?E003+9+2
 
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━3 r d ■━
■
┗【アンケート】気になるシステム業界 ホントのところ

今週は「プログラマは英語は得意?」のホントのところ。多くの技術情報が英
語で発信されていますね。話せなくとも読める。と言う方がこの業界には多い
と聞きますが、実際の皆さんの英語力はどうですか?

  読む、書く、話す、どれも不自由しません。
     http://www.ObjectClub.jp/cgi-bin/question.cgi?Z001+25+0
  読む、書く、のが得意です。
     http://www.ObjectClub.jp/cgi-bin/question.cgi?Z001+25+1
  読む、話す、のが得意です。
     http://www.ObjectClub.jp/cgi-bin/question.cgi?Z001+25+2
  書く、話す、のが得意です。
     http://www.ObjectClub.jp/cgi-bin/question.cgi?Z001+25+3
  読むのが得意です。
     http://www.ObjectClub.jp/cgi-bin/question.cgi?Z001+25+4
  書くのが得意です。
     http://www.ObjectClub.jp/cgi-bin/question.cgi?Z001+25+5
  話すのが得意です。
     http://www.ObjectClub.jp/cgi-bin/question.cgi?Z001+25+6
  英語は、ほとんどできません。
     http://www.ObjectClub.jp/cgi-bin/question.cgi?Z001+25+7
  それは秘密です。
     http://www.ObjectClub.jp/cgi-bin/question.cgi?Z001+25+8
  ちょっと語らせて!
     editors@ObjectClub.jp まで詳細を!!

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

こんにちは、編集人です。ようやく時折、夏の暑さが緩んできたのを感じられ
るようになりました。嬉しい反面、夏しか体験できない空気を吸いそこねた人
にも、いい思い出を作った人にも名残惜しく…という季節の境目でございます
ね。皆さんの夏はいかがでしたか?私は、海で思い切り泳いだ帰り道、西日が
差すドライプ中に深く眠ったり…という体験はありませんでした。が、代わり
に、思い切り血を抜いて、保険が利かず2万3千円払って、貧血で深い眠りに落
ちかけるという体験をしました。色々返してー。(大声)

「オブジェクト倶楽部カレンダー」10月の電子データを公開します。10月の挿
絵のテーマは「デザイン・パターン(Strategy)」です。なお、11月のカレン
ダーは、10月最初のメルマガ発行日に公開予定です。お楽しみに。
http://www.ObjectClub.jp/special/

今週の強引な一言
*** 運用の妙は一心に存す(ことわざ) ***
「開発プロセスは、こうだ」「報告書はこのフォーマットで」なんて、いろい
ろルールを決めても、実際にやる人がその気にならなくては、ルールは守って
もらえません。そこに、やる気になる仕組みは入っていますか。(さわ)

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━--■--●--■
● ご意見、ご感想は         ⇒このメールに返信ください
〇 配信中止、アドレス変更は ⇒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.