Index: [Article Count Order] [Thread]

Date:  Wed, 28 Apr 2004 13:34:26 +0900
Subject:  【オブジェクト倶楽部: 2004-15 号】

       ┏━━━━━━━━━━━━━━━━━━━━━━━━━━■
       ┃                         ■┃
      ●┃● ● オ ブ ジ ェ ク ト 倶 楽 部   ■ ┃
       ┃                       ■  ┃
       ┗━━━━━━━━━━━━━━━━━━━━━━■━━━┛
                          No.43 2004/04/28

■ I N D E X
┃
┣【お知らせ】メーリングリストドメイン変更のお知らせ
┣【オブジェクト入門】暴いておやりよOOバッキー[3]
┣【プログラミング】C#で学ぼうオブジェクト指向入門 [5]
┗【アンケート】気になるシステム業界 ホントのところ

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━1 s t ■━
■
┗【お知らせ】メーリングリストドメイン変更のお知らせ
4月30日(金)に、オブジェクト倶楽部が運営する各種MLのドメイン変更を行
います。この作業に伴い、4月30日(金)8:00〜12:00まで、MLを停止しますの
で、下記アドレスと、その関連アドレス(-ctl、-adminなど)に宛てたメール
はエラーとなります。ご注意ください。
magazine@ObjectClub.esm.co.jp
extremeprogramming-jp@ObjectClub.esm.co.jp
webservice-jp@ObjectClub.esm.co.jp
refactoring-jp@ObjectClub.esm.co.jp

変更後は下記のアドレスになります。(各関連アドレスも同様)
magazine@ObjectClub.jp
extremeprogramming-jp@ObjectClub.jp
webservice-jp@ObjectClub.jp
refactoring-jp@ObjectClub.jp

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━2 n d ■━
■
┗【オブジェクト入門】暴いておやりよOOバッキー[3]

筆者が非オブジェクトな時代から今まで経験した、オブジェクト指向での自ら
の失敗を取り上げてOOバッキーに断罪させるコーナーです。

登場人物
OOバッキー:性格が悪い子猫。
              オブジェクト指向の勘違いを指摘していじめるのが何より好き。
U君    :OOバッキーの飼い主。いつもOOバッキーにいじめられている。
              気が弱い。オブジェクト指向の初心者。

OOバッキー:ニャー!俺OOバッキー。オブジェクト指向の勘違いを探しに
              やってきた子猫なんだ。勘違い野郎はどこにいるのかニャー。

U君    :OOバッキー。今度僕が考えた構造でものっすごくコード量が
              減って、重複が少なくなったんだ。
------------------------------------------------
public class CreateCatalogCommand {
   public void execute(){
            :
   }

   protected Catalog doServiceMethod() throws ApException{
            :
        SessionBeanのカタログ生成のサービスを呼ぶロジック
            :
   }
}
public class UpdateCatalogCommand extends CreateCatalogCommand {
   protected Catalog doServiceMethod() throws ApException {
       :
    SessionBeanのカタログ更新のサービスを呼ぶロジック
      :
   }
}
------------------------------------------------
              僕は気づいたんだけど、このカタログの更新と、新規作成でやっ
              てることは、SessionBeanの更新メソッドか、生成メソッドを使
              うかというだけで、画面からカタログの項目をとってきて、カ
              タログオブジェクトにセットすることや、サービスから帰って
              きたカタログオブジェクトを再度画面に渡すこととか、他はみ
              んないっしょなんだ。だから、更新はCreateCatalogCommandを
              継承してdoServiceMethod()を上書きするだけで出来ちゃうんだ
              よ。
 
OOバッキー:にゃ〜。(ため息)
 
U君    :え?
 
OOバッキー:オブジェクト指向の3大基礎のうちのもっとも理解しやすい
              「継承」すら理解していないようだニャー。
 
U君    :どこが!継承使ってるじゃないバリバリに。重複もないよ。
 
OOバッキー:じゃ継承ってどういうことだニャー?
 
U君    :差分コーディングだろ?AクラスとBクラスがあって、Aクラ
              スのメソッドと違う部分と追加部分だけBに書けばいいんでしょ?
 
OOバッキー:にゃ〜。(ため息)それだったら、継承は機能が同じだったら
       継承するのかにゃ?オブジェクト指向は「オブジェクト(もの)」
       が同じだから継承するんだニャ。たとえば「商品」を継承した
       「一般商品」と「特売品」はどちらも「商品」だから「商品」
              を継承している(性質を引き継いでいる)んだニャー。機能が
              同じだからじゃないんだニャ。ご主人様はここでも非オブジェ
              クトだニャ。
 
U君    :ハイハイ。どうせ僕は非オブジェクトですよ。なんかよく意味
              わからんけど。
 
OOバッキー:最近は外国ではスクイークとやらで、子供でもオブジェクト指
              向やってるらしいニャー。ご主人様は、猫の俺様と子供以下だ
              ニャ〜。
              ご主人様の例では、図でいくとこうなるニャ。
       
           カタログ登録の命令
                 △
                | 
           カタログ更新の命令

              この例ではたまたまやっていることが同じなだけであって、
              どう考えても「カタログの更新」は「カタログの登録」じゃ
              ないニャー。さっきの商品の例だと「一般商品」も「特売品」
              も「商品」だニャ。だからやるとしてもせめてこんな風にす
              るとまだましだニャ。

           カタログを操作する命令
                △
                |
            ┌──┼──┐ 
            |     |
           更新命令   登録命令

              これだったら「カタログを更新する命令」も「カタログを登
              録する命令」も「カタログを操作の命令」といえるので、継
              承として考えられん事もないニャ。
              「機能が同じ」だから「継承」すると、スーパークラスが
              ぶくぶくに膨れて、ほとんど共通関数の塊みたいな「何でも
              クラス」になって、それを修正するととんでもなく影響範囲
              が大になったりするニャー。
              Javaとかでコーディングするときは、頭の中や紙でモデル
              みたいなものがあってそれをJavaに置き換えるイメージでやっ
              たほうがいいんじゃないかニャー。

U君    :なるほど。僕もこんな感じで努力していたら、○ーチンファ
              ウラーみたいになれるかなぁ。

OOバッキー:努力じゃなくて、単なる無駄だニャ。今のままじゃ、180
              年以上はかかるんじゃないかニャー。(きっぱり)

 こうして今夜もOOバッキーはオブジェクター志望U君を夢から現実に引き
戻すのであった。

暴いておやり、ねぇ子猫。僕の育てたOOバッキー。
おなかつつけば語りだす真実を・・・。

OOバッキーに断罪してほしい、失敗ネタをお持ちのかたはぜひネタをご提供
ください。(OO槻ケンジ) 
_______________________________________________________________________
この記事への評価にご協力をお願いします。
URLをクリックして、「ご協力ありがとうございました」のメッセージがご使用
のブラウザに表示されれば投票完了です。
良かった:
http://objectclub.esm.co.jp/cgi-bin/question.cgi?I001+2+0
普通:
http://objectclub.esm.co.jp/cgi-bin/question.cgi?I001+2+1
イマイチ:
http://objectclub.esm.co.jp/cgi-bin/question.cgi?I001+2+2

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

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

■目標
前回、カプセル化されたものを「利用する側」は、カプセル化の結果、余り複
雑なこと考えずにプログラムできることを、確認しました。

今日の目標は
  ●カプセル化で情報隠蔽を行ったクラスを「実装する側」の視点に立って考
  えた場合、利用者側に内部実装(やその変更)を意識させないことができ
  る、を確認したいと思います。
です。

■内容
前回と同様に、一つの銀行口座のお金の預け入れ、引き出し、サービス履歴の
一覧表示するプログラムの簡単な例で考えたいと思います。
★印のついた箇所を中心にご覧ください。
======================================================================
using System;
using System.Collections;
using System.IO;

class MainClass
{
    public static void Main(string[] args)
    {
        // ★Account利用側:サービス履歴を残すためのデータ構造の
        // 記述なし
        Account account = new Account();
        account.Deposit(10000);
        account.Withdraw(9000);
        account.PrintRecords(Console.Out);
    }
}

class Account 
{
    // ★Account実装側:サービス履歴のを残すためのデータ構造に
    // AarrayListを利用.
    private  IList records = new ArrayList();    
    private decimal amount = 0m;
    public Account() 
    {
        AddRecord("新規口座作成");
    }
    public void Deposit(decimal money)
    {
        amount += money;
        AddRecord( money + "を預け入れ" ); 
    }
    public void Withdraw(decimal money) 
    {
        amount -= money;
        AddRecord( money + "を引き出し" );
    }
    public void PrintRecords(TextWriter writer) 
    {
        foreach (Record record in records){
            record.PrintRecord(writer);
        }
    }
    private void AddRecord(string message) 
    {
        records.Add(new Record(message, amount, DateTime.Now));
    }
}
class Record 
{
    private string message;
    private decimal money;
    private DateTime time;
    public Record(string message, decimal money, DateTime time) 
    {
        this.message = message;
        this.money = money;
        this.time = time;
    }
    public void PrintRecord(TextWriter writer) 
    {
        writer.WriteLine("{0}\t預金額:{1}\t日付時刻:{2}", message, money, time);
    }
}
======================================================================
サービス履歴を残す役割は、(Mainではなく)Accountにあるのが妥当と考え、
Accountにサービス履歴を残すためのデータ構造(ArrayListのrecords)を用
意しました。ここでポイントは、そのrecordsはprivate修飾子を使っているこ
とです。これによって、Accountを実装する側は、使う側のMainに、サービス
履歴を残すためのデータ構造を直接アクセスできないようになっています。
(Withdrawなどの操作の呼び出し時に間接的にアクセスするようになってい
る。)Accountを利用する側にとって関心のあるのはサービス履歴が残り、参
照できることであって、どのようなデータ構造でサービス履歴を残すかではな
いので、このような方法が妥当と考えられます。

privateのデータ構造にpublic操作で間接的にアクセスするようにすることで、
例えば何らかの理由により、データ構造をArrayListから配列やそのほかの
データ構造に変更しても、Depositなどの公開された操作に変更が必要ない限
り、Main側は変更する必要がありません。なぜなら、データ構造がMain側に公
開されていないため、変更の波及がAccount内に収まるからです。

もし、たくさんのクラスがAccountのサービス履歴を残すデータ構造に直接ア
クセスするようなソフトウェア構造にした場合、データ構造の変更が、使う側
すべてに波及してしまい、変更が難しいソフトウェア構造になってしまうこと
が想像できます。

■まとめ
銀行口座の例を使ってカプセル化で情報隠蔽を行った結果、利用側にデータ構
造のような複雑な実装を意識させないことができることを確認しました。また
データ構造を変更しても、公開された操作に変更がない限り、利用側に変更が
波及しないことを確認しました。
情報隠蔽の効果の1つに変更容易性の向上があります。実装側は利用側に必要
な操作だけを公開し内部の複雑な状態や振る舞いを隠蔽することで、外部との
依存を減らすことができ、変更が容易にできるようになります。

実践で役立つものですね。日ごろからどんどん使っちゃいましょう。

それでは。さいなーら。(IENAGA)
_______________________________________________________________________
この記事への評価にご協力をお願いします。
URLをクリックして、「ご協力ありがとうございました」のメッセージがご使用
のブラウザに表示されれば投票完了です。
良かった:
http://objectclub.esm.co.jp/cgi-bin/question.cgi?E003+4+0
普通:
http://objectclub.esm.co.jp/cgi-bin/question.cgi?E003+4+1
イマイチ:
http://objectclub.esm.co.jp/cgi-bin/question.cgi?E003+4+2
 
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━4 t h ■━
■
┗気になるシステム業界 ホントのところ

今週は「普及率が高いブラウザ」のホントのところ。普段から最も使用してい
るブラウザは何ですか?

  Internet Explorerです。
     http://objectclub.esm.co.jp/cgi-bin/question.cgi?Z001+9+0
  Netscapeです。
     http://objectclub.esm.co.jp/cgi-bin/question.cgi?Z001+9+1
  Mozillaです。
     http://objectclub.esm.co.jp/cgi-bin/question.cgi?Z001+9+2
  Operaです。
     http://objectclub.esm.co.jp/cgi-bin/question.cgi?Z001+9+3
  Safariです。
     http://objectclub.esm.co.jp/cgi-bin/question.cgi?Z001+9+4
  その他のブラウザです。
     http://objectclub.esm.co.jp/cgi-bin/question.cgi?Z001+9+5
  それは秘密です。
     http://objectclub.esm.co.jp/cgi-bin/question.cgi?Z001+9+6
  ちょっと語らせて!
     editors@ObjectClub.jp まで詳細を!!

アンケート結果はオブジェクト倶楽部HP上にて公開します。お楽しみに。
なお、前号「デスクトップ、ノート、PDAを含めた、自分専用のマシンの数」
の結果は公開中。是非ご覧下さい。
⇒http://objectclub.esm.co.jp/ml-arch/magazine/question/index.html
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━--■--●--■
■
┗編集後記

こんにちは、編集人です。おかしな気候が続いていますが風邪などひかれてい
ませんか?毎日、充分気をつけてお出かけくださいね。
今週は、牛尾さんの『暴いておやりよOOバッキー[3]』が登場です。毎回の
大好評でしたが、今回で牛尾さんの記事もストックがなくなってしまいました。
また是非OOバッキーを連れて紙上(?)を賑わしてほしいですね。
来週のメルマガは、勝手ながらお休みさせていただきます。オブジェクト倶楽
部カレンダーにあるハートを出してるお手紙マークは、メルマガ配信予定日な
のですが、来週水曜などは、「マークなし」にさせてもらっています。予定日
なので出産予定日のようにズレることもあるわけで...まいったなァ。(T_T)
(…先週はごめんなさいでした…)

今週の強引な一言
*** 下手の横好き(ことわざ)***
XPが好きなだけではプロジェクトが成功するわけではありません。その裏にあ
る背景を確実に理解し、実行する必要があります。「好きなだけじゃハタ迷惑
なだけだニャー。」って感じっスかね。(さわ)

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