Date:  Wed, 02 Jun 2004 12:30:24 +0900
Subject:  【オブジェクト倶楽部: 2004-19 号】

       ┏━━━━━━━━━━━━━━━━━━━━━━━━━━■
       ┃                         ■┃
      ●┃● ● オ ブ ジ ェ ク ト 倶 楽 部   ■ ┃
       ┃                       ■  ┃
       ┗━━━━━━━━━━━━━━━━━━━━━━■━━━┛
                          No.47 2004/06/02

■ I N D E X
┃
┣【Topics】オブジェクト倶楽部納涼イベント参加登録開始!
┣【キーワード】知ってるようで分からないビジネスキーワード勉強会[9]
┣【プログラミング】C#で学ぼうオブジェクト指向入門 [6]
┗【アンケート】気になるシステム業界 ホントのところ

〇━━━━━━━━━━━━━━━━━━━━━━━━━━━T o p i c s━
 〇  オブジェクト倶楽部納涼イベント参加登録開始!
  〇 〇━━━━━━━━━━━━━ ━━・  

お待たせしました、いよいよオブジェクト倶楽部イベント(納涼祭)の参加登
録開始です。主賓講演は平澤章さん。新刊「オブジェクト指向でなぜつくるの
か」(日経BP)http://www.amazon.co.jp/exec/obidos/ASIN/4822281957/xp-jp22
の講演をお願いしています。また、ワークショップも決定。これから詳細を続々
掲載していきます。また「失敗から学ぶオブジェクト指向〜本当にあった怖い
話〜」というテーマで、ライトニングトークスのスピーカーを募集します!オ
ブジェクト指向開発関係の展示物(コマーシャル色OK)も募集中。
詳細はこちら:http://www.ObjectClub.jp/event/2004summer 

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━1 s t ■━
■
┗【キーワード】知ってるようで分からないビジネスキーワード勉強会[9]
            「ニューロシステム」

hiroshiです。今回のキーワードは「ニューロシステム」です。今まで名前く
らいは多少なりとも聞いたことがありましたが、実際の使用例は聞いたことが
ありませんでした。「ニューロシステム」の概要と使用例をご紹介します。

ニューロシステムとは、人間の脳で行われている情報処理の仕組みを真似たア
ルゴリズムである「ニューラル・ネットワーク」を利用したデータ処理システ
ムです。主に、新規入力のデータと、あらかじめ読み込ませておいたパターン
との類似性や相関性を見出す場合などに使用されています。

ニューロシステムでは、ほとんどプログラミングは不要です。(オブジェクト
倶楽部号外でこの様なプログラミング言語が紹介されていましたが)プログラ
ミングに対応するのが、"学習"です。ニューロシステムにおける"学習"とは、
入力パターンと出力パターンのペアをいくつも用意して、システムに読み込ま
せることを意味します。

ビジネス分野では、金融業界で顧客の与信審査やクレジットカードの不正使用
検知など業務向けの適用も進んでいます。テキスト・マイニングに使われてい
る例もあります。
それでは、カードの不正使用検知の例を紹介します。あらかじめ、過去のカー
ド利用の履歴データをあらかじめニューロシステムに読み込ませておきます。
(これが学習となります。)そして、学習済みのシステムに新たな利用データ
を入力すると、過去の不正使用の履歴にどの程度近いかを定量的に示す、とい
った仕組みです。ニューロシステムでは、学習のさせ方が重要になります。今
紹介したカードの不正使用検知の例でも、学習によって不正検知の精度が大き
く左右されます。まず、多量のデータを用意する必要があります。さらに、デ
ータの様々な属性(利用場所、金額、日時など)の中から、不正使用を見分け
るのに有効な属性を選ぶ必要があります。

このニューロシステムは、当初は人工知能の研究から始まりました。現在では
ネットワークの処理単位も大きく,教師なしの学習(競合学習)や、出力層か
ら入力層へのフィード・バックがある逆伝搬学習の考えを導入しています。こ
れからは人間が行うには非常に労力の使う作業を、学習機械が変わって行う時
代になっていくのでしょうか。(hiroshi)

_______________________________________________________________________
この記事への評価にご協力をお願いします。
URLをクリックして、「ご協力ありがとうございました」のメッセージがご使用
のブラウザに表示されれば投票完了です。
良かった:
http://www.ObjectClub.jp/cgi-bin/question.cgi?D001+8+0
普通:
http://www.ObjectClub.jp/cgi-bin/question.cgi?D001+8+1
イマイチ:
http://www.ObjectClub.jp/cgi-bin/question.cgi?D001+8+2

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

■はじめに
この記事は、初級開発者である私がみなさんと一緒にC#を使ってオブジェクト
指向(OO)の基礎を気軽に勉強していこう、という内容です。
■目標
今回からは、メッセージが同じでも受け手のオブジェクトによって振る舞いが
異なる「ポリモフィズム」を勉強していきます。

今回の目標は
『ポリモフィズムを使った既存システムは、たくさんのif文を使った既存シス
テムと比べて、拡張することが容易であることを確認する。』
です。ポリモフィズムの「しかけ」の確認は次回にして、ポリモフィズム
の「うれしい点」を中心に確認したいと思います。

■内容
銀行の口座を例として、状況を下記のようにあると考えてください。
・銀行の口座には預け入れと引き出しサービスがある。
・口座の種類によって振る舞いは異なる。
・口座の種類が今までは、普通預金と定期預金の2種であった。
 (既存のソースコードがある)
・口座の種類に新たにVIP預金サービスを増やしたい。
 (新たに追加したいソースコード)


まず口座の種類による振る舞いの違いを条件分岐(if)を使って実現した既存
システムの拡張を考えてみます。★印を中心にご覧ください。(/**/で囲んだ
コードがVIP口座のための拡張ソースコード、それ以外が既存ソースコードと
してお読みください。)
======================================================================
using System;
class MainClass {
 // args[0] = 0 -> 普通貯金 (SavingAccount)
  //         = 1 -> 定期預金 (TimeDeposit)


 public static void Main(string[] args)
 {
     Account account = null;      
     try{
         account = createAccount(args[0]);
     }catch{
         Console.WriteLine("実行時引数が不正で、" + 
                "アカウントのオブジェクト生成に失敗しました。");
         return;
     }
     account.Deposit(10000);
     account.Withdraw(9000);
 }
 private static Account createAccount (string typeId){
     Account.AccountType accountType = 
         (Account.AccountType)Int32.Parse(typeId);
     return new Account(accountType);
 }
}
class Account {
 // ★ 列挙体にVIP口座を追加
 public enum AccountType{ SavingAccount=0,
                          TimeDeposit 
                          /*, VIPDeposit*/ };
 private AccountType type;
 public Account(AccountType type) {
     this.type = type;
 }
 public void Deposit(decimal money) {
     if( AccountType.SavingAccount.Equals(type) ) {
         Console.WriteLine("普通貯金の預け入れの振る舞い。");
         // 普通貯金の預け入れのロジック記述
     }
     if( AccountType.TimeDeposit.Equals(type) ) {
         Console.WriteLine("定期貯金の預け入れの振る舞い。");
         // 定期貯金の預け入れのロジック記述
     }
     /* ★VIP貯金の場合の預け入れを追加
     if( AccountType.VIPDeposit.Equals(type) ) {
         Console.WriteLine("VIP貯金の預け入れの振る舞い。");
         // VIP貯金の場合の預け入れロジック記述
     }
     */
 }
 public void Withdraw(decimal money) {
     if( AccountType.SavingAccount.Equals(type) ) {
         Console.WriteLine("普通貯金の引き出しの振る舞い。");
         // 普通貯金の引き出しのロジック記述
     }
     if( AccountType.TimeDeposit.Equals(type) ) {

         Console.WriteLine("定期貯金の引き出しの振る舞い。");
         // 定期貯金の引き出しのロジック記述
     }
     /* ★VIP貯金の場合の引き出しを追加
     if( AccountType.VIPDeposit.Equals(type) ) {
         Console.WriteLine("VIP貯金の引き出しの振る舞い。");
         // VIP貯金の場合の引き出しのロジック記述
     }
     */
 }
}
======================================================================
口座の種類を列挙体(enum)で分類し、種類によって異なる振る舞いを、ifを使っ
て実現しています。新たにVIP貯金を追加するには、Accountクラス内に
・VIP用の列挙体要素を追加
・Deposit(預け入れ)メソッド内にVIPの場合のロジックを追加
・Withdraw(引き出し)メソッド内にVIPの場合のロジックを追加
と、既存コードの中の複数箇所に修正が必要です。

口座の種類が固定で預け入れ・引き出しの振る舞いも単純であれば、条件分岐
でも問題ありません。しかし、今回のケースのように、口座の種類が追加され
るといった拡張がある場合は問題になってきます。拡張するには、既存ソース
コードの条件分岐を直接修正することが必要で、拡張に手間がかかってしまい
ます。

条件分岐がなくなり、わざわざ既存のソースコードを修正することなく、拡張
ソースコードを新たに追加するのみになれば、拡張が簡単になりそうです。そ
れを可能にしてくれるのがポリモフィズムです。

次にポリモフィズムを使って実現した既存システムの拡張を考えます。
★印を中心にご覧ください。(/**/で囲んだコードが拡張ソースコード、それ
以外が既存ソースコードのつもりでお読みください。)
======================================================================
using System;
class MainClass {
 // args[0] 利用したい口座の種類のクラス名
 //             例 SavingDeposit,TimeDeposit
 public static void Main(string[] args)
 {
     Account account = null;
     try{
         account = createAccount(args[0]);
     }catch{
         Console.WriteLine("実行時引数が不正で," + 
                "アカウントのオブジェクト生成に失敗しました。");
         return;
     }
     account.Deposit(10000);
     account.Withdraw(9000);
 }
 private static Account createAccount(string className) {
     return Account.createAccount(className);
 }
}
abstract class Account {
 public static Account createAccount(String className) {
     Type type = Type.GetType(className); 
     return (Account)System.Activator.CreateInstance( type );
 }
 public abstract void Deposit(decimal money);
 public abstract void Withdraw(decimal money);
}

class SavingDeposit : Account {
 public override void Deposit(decimal money) {
     Console.WriteLine("普通預金の預け入れの振る舞い");
     // ・・・・
 }
 public override void Withdraw(decimal money) {
     Console.WriteLine("普通預金の引き出しの振る舞い");
     // ・・・・
 }
}
class TimeDeposit : Account {
 public override void Deposit(decimal money) {
     Console.WriteLine("定期預金の預け入れの振る舞い");
     // ・・・・
 }
 public override void Withdraw(decimal money) {
     Console.WriteLine("定期預金の引き出しの振る舞い");
     // ・・・・
 }
}
/* ★VIPクラスの追加
class VIPDeposit : Account {
 public override void Deposit(decimal money) {
     Console.WriteLine("VIP預金の預け入れの振る舞い");
     // ・・・・
 }
 public override void Withdraw(decimal money) {
     Console.WriteLine("VIP預金の引き出しの振る舞い");
     // ・・・・
 }
}
*/
======================================================================
/**/で囲んだ箇所に注目してください。VIPのための拡張コードは
・VIPDepositクラスを追加する
のみになっています。

条件分岐を使った既存システムの拡張の場合と比べ、
・既存ソースコード(Accountクラス等)は修正してしておらず追加が簡単
・VIP預金のための追加コードがVIPDepositクラスのみに集まって簡単
 (普通・定期預金のためのソースコードがそれぞれSavingDepositクラス、
 TimeDepositクラスに集まって、VIPとは分離されて簡単)
つまり、拡張が簡単♪ということです。

今回は口座の種類の追加を例に考えましたが、口座の種類の削除も条件分岐の
場合と比べ簡単にできることが容易に想像できます。

■まとめ
ポリモフィズムを使った既存システムの拡張は容易であることを、銀行口座の
種類を例に、条件分岐とポリモフィズムを比較して確認しました。
ポリモフィズムの効果として、理解容易性、変更容易性の向上があげられます。
ポリモフィズムの代替手段として、条件分岐があります。が、分岐が増えれば
増えるほどコードが複雑になり、理解容易性が低下する傾向にあります。また、
今回の例のように、拡張を実現するのに、条件分岐の箇所を直接変更する必要
が発生し、変更容易性が低下してしまう場合がよくあります。このような問題
をポリモフィズムはエレガントに解決してくれます。使えそうなところは、ド
ンドン使っちゃいましょう。
次回は、ポリモフィズムを実現するしかけ(メッセージ・継承等)を確認して
理解を深めたいと思います。

ではでは。(IENAGA)
_______________________________________________________________________
この記事への評価にご協力をお願いします。
URLをクリックして、「ご協力ありがとうございました」のメッセージがご使用
のブラウザに表示されれば投票完了です。
良かった:
http://www.ObjectClub.jp/cgi-bin/question.cgi?E003+5+0
普通:
http://www.ObjectClub.jp/cgi-bin/question.cgi?E003+5+1
イマイチ:
http://www.ObjectClub.jp/cgi-bin/question.cgi?E003+5+2

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

今週は「出身は文系?理系?それとも体育会系?!」のホントのところ。

文系です。
  http://www.ObjectClub.jp/cgi-bin/question.cgi?Z001+12+0
どちらかといえば文系です。
  http://www.ObjectClub.jp/cgi-bin/question.cgi?Z001+12+1
理系です。
  http://www.ObjectClub.jp/cgi-bin/question.cgi?Z001+12+2
どちらかといえば理系です。
  http://www.ObjectClub.jp/cgi-bin/question.cgi?Z001+12+3
バリバリの体育会系です。
  http://www.ObjectClub.jp/cgi-bin/question.cgi?Z001+12+4
どの分野もそつなくこなします。
  http://www.ObjectClub.jp/cgi-bin/question.cgi?Z001+12+5
それは秘密です。
  http://www.ObjectClub.jp/cgi-bin/question.cgi?Z001+12+6
ちょっと語らせて!
  editors@ObjectClub.jp まで詳細を!!

アンケート結果はオブジェクト倶楽部HP上にて公開します。お楽しみに。
なお、前号「一人でじっくり仕事をするのが好きですか?みんなでワイワイ仕
事するのが好きですか?」の結果は公開中。是非ご覧下さい。
⇒http://www.objectclub.jp/special/kininaru
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━--■--●--■
■
┗編集後記

こんにちは、編集人です。もうすぐ、あのいやーな季節がやってきます。梅雨。
そう思っている人は少なくないはず。私は癖毛なので、毎年梅雨の時期は、髪
の毛が膨張しまくりです。おそらく、私の髪の毛の膨らみ具合では湿度が測れ
てしまいます。快適で楽しい梅雨の過ごし方をご存知の方がいたら、ぜひぜひ
極秘で教えてほしい、今日この頃です。

「オブジェクト倶楽部カレンダー」7月の電子データを公開します。7月の挿絵
のテーマは「デザイン・パターン(Adapter)」です。なお、8月のカレンダー
は、7月最初のメルマガ発行日に公開予定です。お楽しみに。
/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.