Date:  Wed, 23 Mar 2005 14:20:45 +0900
Subject:  【オブジェクト倶楽部: 2005-11号】

       ┏━━━━━━━━━━━━━━━━━━━━━━━━━━■
       ┃                         ■┃
      ●┃● ● オ ブ ジ ェ ク ト 倶 楽 部   ■ ┃
       ┃                       ■  ┃
       ┗━━━━━━━━━━━━━━━━━━━━━━■━━━┛
                          No.86 2005/03/23

■ I N D E X
┃
┣【Topics】モデリングコンテスト 好評開催中です!
┣【Topics】お試しセミナー受講者募集 『オブジェクト指向の設計原則』
┣【PF】朝会ガイド[5]
┣【プログラミング】Rubyで進むオブジェクトの道 〜脱初心者をめざして〜[3]
┗【アンケート】気になるシステム業界 ホントのところ

〇━━━━━━━━━━━━━━━━━━━━━━━━━━━T o p i c s━
 〇  モデリングコンテスト 好評開催中です!
  〇 〇━━━━━━━━━━━━━ ━━・ 

今回のお題は「クリーニング屋さん」。ただいま、応募作品がぞくぞくと集まっ
ています。最初の応募は、なんとお題公開当日でした。
応募締め切りまではまだまだありますので、気にはなっているけどちょっと忙
しくて... というかたも一度お題を眺めてみてください。案外すぐにできちゃ
うかも。詳細はこちらからご覧下さい。
http://www.ObjectClub.jp/community/modeling/modeling_contest/

〇━━━━━━━━━━━━━━━━━━━━━━━━━━━T o p i c s━
 〇  お試しセミナー受講者募集 『オブジェクト指向の設計原則』
  〇 〇━━━━━━━━━━━━━ ━━・ 

オブジェクト倶楽部を運営、管理している永和システムマネジメントでは、通
常セミナーのエッセンスを抜き出し、短時間で実施する「お試しセミナー」を
開催しております。
3月30日(水)の『オブジェクト指向の設計原則』セミナーの受講者を募集してい
ます。締め切りは、3月25日(金) 12:00です。
これって、正しいオブジェクト指向設計なの?と、不安に思っているような人
に、オススメです。
http://po2d.esm.co.jp/

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━1 s t ■━
■
┗【PF】朝会ガイド[5]

今回は前回の続き。司会者が心配りすべき点について、ポイントを挙げていき
ます。

・延期しない
プロジェクトが忙しくなってくると、ついつい「今日は忙しいから延期」とい
う誘惑に駆られることがあります。しかし、一度誘惑に負けてしまうと、だら
だらと、朝会が自然消滅してしまうことがよくあります。そして、情報共有が
ない、誰も何も言い出せないというムードにチーム全体が飲み込まれてしまい
ます。忙しいときこそ、意識の共有のために朝会をやりましょう!(そのため
に、短くするのです)

・硬さとやわらかさのバランス
朝会を短く終わらせようとするあまり、司会者が会話を制してしまい「必要な
こと以外言うな」というムードが出てしまうことがあります。一番危険なのは、
「自分が問題と思っていることは小さなことなので、言うべきではない」と思っ
てしまうメンバーが出てくることです(「悪いニュースこそ良いニュース」参照)。
逆に和やかな雰囲気を重視するあまりだらだらと世間話で長くなってしまう場
合もあります。司会者は、常にバランス感覚を意識し、ユーモア感覚と強さを
持って会議をリードしてください。

・初回が大事
はじめての朝会は、特別です。必ず、「なぜ朝会をするのか」という目的・ね
らいを全員に伝えましょう。そして、最初に述べた、グランドルールを説明し
ましょう。この「朝会ガイド」をチーム用にカスタマイズして、全員に配りま
しょう。

・個別に対応も忘れずに
ルーズさが原因で常に進捗が遅れる人、報告・連絡・相談の基本動作が出来な
い人には、個別に時間を取って話をしましょう。特に、注意をするときには、
全員の前で行ってはいけませんし、メールで行ってもいけません。必ずフェイ
ス・トゥ・フェイスで個別に話をしましょう。

・メンバーの変化に注意
プロジェクトの中では、体調不良を押して朝会に出ている人がいる場合があり
ます。また、時に、心理的なプレッシャーに負けて精神状態を病んでしまう人
が出ることがありますし、人間関係のつまずきから、まったく会話をしない人
などが出ることもあります。リーダーは朝会で全員の体調や心の健康にも気を
つけましょう。

・徐々に改善
最初から、完璧な朝会はできません。徐々に改善していくことが必要です。改
善は、「ふりかえり」によって行ないます。定期的に、「朝会のやり方」をチー
ムで話あうのです。何がよかったか、何が悪かったか、どうすればよくなるか。
これを繰り返すことで、着実に、有効な朝会になって行きます。

・マンネリは悪
リーダーは、朝会がマンネリ化しないように、いつも気をくばりましょう。マ
ンネリ化を感じることがないように、常に新しいやり方、新しいネタを探しま
しょう。(平鍋)
_______________________________________________________________________
この記事への評価にご協力をお願いします。
URLをクリックして、「ご協力ありがとうございました」のメッセージがご使用
のブラウザに表示されれば投票完了です。
良かった:
http://www.ObjectClub.jp/cgi-bin/question.cgi?M001+4+0
普通:
http://www.ObjectClub.jp/cgi-bin/question.cgi?M001+4+1
イマイチ:
http://www.ObjectClub.jp/cgi-bin/question.cgi?M001+4+2

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━2 n d ■━
■
┗【プログラミング】Rubyで進むオブジェクトの道 〜脱初心者をめざして〜[3]

●はじめにを記す
Compositeパターンは書籍デザインパターン[1]の中で紹介されたパターンの1つ
で、ファイルシステムのように全体-部分の関係の繰り返しで構成される構造を
簡単に扱うためのパターンです。このような構造はファイルシステム以外にも、
組み立て製品の構造、組織の構造など多くで発見でき、何かと役立つと思いま
す。

今回は参考文献[1][2]を参考に「Compositeパターン」をRubyを使って学んでい
きましょう。

●テストプログラムを書く
早速RubyでCompositeパターンの実装例を書いてみましょう。今回の例は、
・部品(製品)の一部は、複数の部品で構成され、そのまた部品は複数の部品
  で構成されるといった、再帰的な構造を持つ
・製品の値段を部品の値段の合計から算出する
プログラムです。

まずはテストプログラムから
--<item_test.rb>------------------------------------------------------
require 'test/unit'
require 'item'
class ItemTest < Test::Unit::TestCase
  def setup
    @computer = CompositeItem.new("Myパソコン")
    box = CompositeItem.new("My本体ケース", 10000)
    hard_disk = LeafItem.new("Myハードディスク", 2000)
    board = CompositeItem.new("Myマザーボード", 300)
    cpu = LeafItem.new("MyCPU", 40)
    memory = LeafItem.new("Myメモリ", 5)
    board.add_item cpu
    board.add_item memory 
    @computer.add_item box
    box.add_item hard_disk
    box.add_item board
  end
  def test_price
    assert_equal(12345, @computer.price)
  end
end
----------------------------------------------------------------------

●部品構成を示す
Myパソコンのテストプログラムで構成した部品は以下のようなイメージです。
--<パソコンの部品構成の図>--------------------------------------------
 ┏━━━━━┓  ┏━━━━━━┓  ┏━━━━━━━━┓
 ┃Myパソコン┃━┃My本体ケース┃━┃Myハードディスク┃
 ┗━━━━━┛  ┗━━━━━━┛┃┗━━━━━━━━┛
                                 ┃┏━━━━━━━┓  ┏━━━┓ 
                                 ━┃Myマザーボード┃━┃MyCPU ┃ 
                                   ┗━━━━━━━┛┃┗━━━┛ 
                                                     ┃┏━━━━┓ 
                                                     ━┃Myメモリ┃ 
                                                       ┗━━━━┛ 
----------------------------------------------------------------------

●クラス図でテスト対象プログラムの構造を示す
--<コンポジットパターンを適用したクラス図(一部省略)>------------------
               ┏━━━━━━━━┓
クライアント →┃      Item      ┃
               ┣━━━━━━━━┫←━━━━━━━┓
               ┣━━━━━━━━┫                ┃
               ┃     price()    ┃                ┃
               ┗━━━━━━━━┛                ┃
                         △                        ┃
                         ┃                        ┃
                         ┃                        ┃
               ┏━━━━┻━━━━┓              ┃
     ┏━━━━━━━━┓  ┏━━━━━━━━┓    ┃
     ┃    LeafItem    ┃  ┃  CompositeItem ┃    ┃
     ┣━━━━━━━━┫  ┣━━━━━━━━┫◇━┛
     ┣━━━━━━━━┫  ┣━━━━━━━━┫
     ┃     price()    ┃  ┃     price()    ┃
     ┗━━━━━━━━┛  ┗━━━━━━━━┛

----------------------------------------------------------------------
Myパソコン、My本体ケース、MyマザーボードはCompositeItemクラス(複合)My
ハードディスク、MyCPU、MyメモリはLeafItemクラス(葉)に分類します。
 
Myパソコンをパソコンクラス、My本体ケースを本体ケースクラスのように分類
して、
パソコンクラス◇−本体ケースクラス◇−マザーボードクラス◇−CPUクラス
のように構成する方法も考えられます。
しかし、この方法だと、後で全体-部分の部品構成が変ってしまった時に、新規
にクラスを作成、又は既存のクラスを削除し、全体‐部分の関係を結びなおす
といった変更に手間のかかるプログラム構造になってしまいます。

代わりに、
・本体ケース、マザーボードなどの複合的な部品はCompositeItemクラスに分類
・CPUやメモリなど単一の部品はLeafItemクラスに分類
・全体-部分の関係をComositeItemとItemの間で結んで再帰構造を表現
することで、部品構成が変わっても、影響が少なくて済むようにCompositeパター
ンは工夫しています。

また、computer.priceでパソコンの値段を合計していますが、priceの呼び出し
側では部品構成がどのようになっているか気にせずに呼び出せるようにするの
がCompositeパターンの肝です。

●テスト対象プログラムを書く
--<item.rb>-----------------------------------------------------------
class Item
  attr_reader :name, :part_price
  def initialize(name, part_price)
    @name = name
    @part_price = part_price
  end
  #静的型の言語の場合ここで、CompositeItemとLeafItemを意識せずに扱うた
  #めに抽象メソッド price を書く
  def price
    raise NotImplementedError, "サブクラスでオーバーライドしてください"
  end
end
class LeafItem < Item
  #単に部品の値段を返す
  def price
    @part_price
  end
end
class CompositeItem < Item
  def initialize(name, part_price=0)
    super(name, part_price)
    @items = []
  end
  #部品の合計の値段を返す
  def price
    composite_price = @part_price;
    @items.each { |item|
      #itemがLeafItemオブジェクトの場合と
      #      CompositeItemオブジェクトの場合で振る舞いが異なる
      composite_price += item.price
    }
    composite_price
  end
  def add_item(aItem)
    @items.push aItem
  end
end
----------------------------------------------------------------------

ここでのポイントは、CompositeItemのpriceメソッド内で呼ばれるitem.priceで
  itemオブジェクトの型がLeafItemの場合は、単一の部品の値段を返す
  itemオブジェクトの型がCompositeItemの場合は、複数の部品の値段の総和を
  返す(再帰を利用)
のようになっています。ポリモーフィズムをうまく活用しているところですね。

●Itemクラスのpriceメソッドは必要ないので削除する
私を含めJava・C#出身のデベロッパは、ここで驚くべき発見があります。なん
とItemクラスでpriceメソッドは必要ありません。声を大にして繰り返します。

「Itemクラスでpriceメソッドは必要ありません!!」

Itemクラスを次のようにpriceメソッドを削除しても、テストはパスします。
--<item.rb>-----------------------------------------------------------
class Item
  attr_reader :name, :part_price
  def initialize(name, part_price)
    @name = name
    @part_price = part_price
  end
end
・・・
----------------------------------------------------------------------
Javaなどの静的型の言語では、ポリモーフィズムを継承(またはインタフェー
スの実現)とメソッドのオーバーライドで表現します。しかし、Rubyなどの動
的型の言語では、それらを使わなくてもポリモーフィズムを表現できるように
なっています。
これは、本当にびっくりです!!
 
Ruby界隈では、ポリモフィズムを継承とメソッドのオーバライドを使わないで
表現するプログラミングスタイルを「Duck Typing」と呼んでいるそうです。
「Duck Typing」については別の機会に詳しく紹介したいと思います。

●動的型の言語の場合、他のパターンがどうなるか思いをめぐらす
StateパターンやStrategyパターンをRubyで実装したらどうなるでしょうか?お
やおや?これまたびっくり!

●文法の補足を記す
・繰り返し
----------------
  @items.each { |item|
    compositePrice += item.price
  }
 ----------------
eachを使えば、簡単にコレクション(items)の各要素(item)にアクセスできます。

・オブジェクトの初期化
----------------
class ItemTest < Test::Unit::TestCase
  def setup
    @computer = CompositeItem.new("Myパソコン")
    box = CompositeItem.new("My本体ケース", 10000)
    ・・・
    
class CompositeItem < Item
  def initialize(name, part_price=0)
    super(name, part_price)
    @items = []
  end
  ・・・

----------------
initializeは、オブジェクトを初期化するための特殊なメソッドです。newメソッ
ドが呼ばれた際にinitializeメソッドが呼ばれます。
part_price=0
は引数がなかった場合のデフォルト値になります。

●参考文献を記す
[1]オブジェクト指向における再利用のためのデザインパターン
   http://amazon.co.jp/o/ASIN/4797311126/xpjp-22/
[2]増補改訂版Java言語で学ぶデザインパターン入門
   http://amazon.co.jp/o/ASIN/4797327030/xpjp-22/
(Ienaga)
_______________________________________________________________________
この記事への評価にご協力をお願いします。
URLをクリックして、「ご協力ありがとうございました」のメッセージがご使用
のブラウザに表示されれば投票完了です。
良かった:
http://www.ObjectClub.jp/cgi-bin/question.cgi?E006+2+0
普通:
http://www.ObjectClub.jp/cgi-bin/question.cgi?E006+2+1
イマイチ:
http://www.ObjectClub.jp/cgi-bin/question.cgi?E006+2+2
 
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━3 r d ■━
■
┗【アンケート】気になるシステム業界 ホントのところ

今週は「4月1日は何の日だか知っていますか?」のホントのところ。ヒントは
昨年のメールマガジンアーカイブにありますよ。
http://www.objectclub.jp/ml-arch/magazine/42.html
さてみなさん、4月1日は何の日だかご存知ですか?

  春分の日
     http://www.ObjectClub.jp/special/kininaru/vote?vol=53&choice=0
  みどりの日
     http://www.ObjectClub.jp/special/kininaru/vote?vol=53&choice=1
  福井県の日
     http://www.ObjectClub.jp/special/kininaru/vote?vol=53&choice=2
  小泉首相の誕生日
     http://www.ObjectClub.jp/special/kininaru/vote?vol=53&choice=3
  オブラブ メルマガ 創刊日
     http://www.ObjectClub.jp/special/kininaru/vote?vol=53&choice=4
  オブラブ メルマガ エープリールフールネタ号外発行日!
     http://www.ObjectClub.jp/special/kininaru/vote?vol=53&choice=5
  まったくわかりません
     http://www.ObjectClub.jp/special/kininaru/vote?vol=53&choice=6
  ちょっと語らせて!
     editors@ObjectClub.jp まで詳細を!!

アンケート結果はオブジェクト倶楽部サイト上にて公開します。お楽しみに。
なお、前号「コーディングの時のスタイルはどれが好きですか?」の結果は公
開中。是非ご覧下さい。
⇒http://www.objectclub.jp/special/kininaru/vol52/PlonePopoll_results2

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━--■--●--■
■
┗編集後記

こんにちは、編集人です。春分の日を迎え、ようやく温かくなってきましたね。
これで花粉が飛んでいなければ最高なんですが。。
さて、来週はとうとう4月に突入です。4月と言えば、まず最初に「あの日」が
やってきます。気になるアンケートでもお気づきでしょうが、来週は何かが起
きるかも?ご期待ください!

今週の強引な一言
*** 当たるも八卦、当たらぬも八卦(ことわざ)***
不確実なことが多い世の中、マスタースケジュールをきっちり作ったところで、
占い程度の確実性しかないものです。ただし、強く信じ、熱く動くことで、自
分たちで不確実性を取り除けるかもしれません。 
(さとみ)

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