Index: [Article Count Order] [Thread]

Date:  Mon, 5 Jun 2000 00:26:31 +0900
From:  Yutaka Kamite <y-kamite@....jp>
Subject:  [XP-jp:00487] XP Installed26 Part3 Test-first, by Intetion
To:  extremeprogramming-jp@....jp (extremeprogramming-jp ML)
Message-Id:  <393A74CD39A.1D20Y-KAMITE@....jp>
Posted:  Mon, 05 Jun 2000 00:25:01 +0900
X-Mail-Count: 00487

上手です。
XP Installed26 Part3 Test-first, by Intetion
まとめの初回分です、SmalltalkとJavaのコードよろしくお願いします。

ページ             まとめ  Java への変換担当者
----------------------------------------------
Part 1 189 - 192   上手
Part 2 193 - 196   上手
Part 3 197 - 200* 上手
Part 4 201 - 204   上手
-----------------------------------------------
Smalltalk の解説は 「さくさくSmalltalk」(梅澤さん、今野さん他共訳)参考に
して基本的な部分だけ埋めてあります。チェックおよび追加をお願いします。


=== Page 197

<Smalltalk>
=== Page 197 Code 1

..SummarizerTest
10:40:57
abcSummarizer
     ^Summarizer
         with:#()
         with:#()

</Smalltalk>

Summarizer オブジェクトを作って、Chetはテストを強化する準備ができている。
私はまだ準備が出来ていない、しかし彼は出来ている、そこで彼が全ての値をチ
ェックするためのテストをつくるのを見守る。

<Smalltalk>
=== Page 197 Code 2

..SummarizerTest
10:43:06
testABC
     "self unsafRun:#testABC"
     |summarizer summary|
     summarizer:=self abcSummarizer.
     summary:=summarizer summary.
     self should:[summary size=3].
     self should:[summary first name='a'].
     self should:[summary first amount=11].
     self should:[(summary at:2) name='c'].
     self should:[(summary at:2) amount=2].
     self should:[summary last name='b'].
     self should:[summary last amount=3].

解説:
summary に順番に3つの collection を創らす。

</Smalltalk>


Ron  もう選択(の余地)はないね。今 collection を構築しなきゃ。
Chet いやいや、まだやることがある。

<Smalltalk>
=== Page 197 Code 3

___SummarizerTest
10:44:29
abcSummarrizer
     ^Summarizer
         with:self acCollection
         with:self abCollection

</Smalltalk>

=== Page 198 

Chetは考えるのに必要な時間をちょっと長く使い彼の意向をメソッドの中に宣言
した。つまり、aとc aとbを持つ collection を一つづつ持つようにした。そて魔
法の小妖精が既にそれを創ってくれていると想定する。彼の意向のプログラミン
グ。

さて、何が必要かは、名前が解っているので、はっきりしている。メソッドを
(キーボードから)打ち込む。

<Smalltalk>
=== Page 198 Code 1

 ___SummarizerTest
10:45:45
acCollection
     ^OrderdCollection
         with:(Sum
              name:'a'
              amount:1)
         with:(Sum
              name:'c'
              amount:2)

解説:
#お願いします。
(以下は、「さくさくSmalltalk」p82の引用です。
OrderdCollection は、オブジェクトのコレクションが特定の順番で保持されアク
セスされねばならない場合に、Arrayの代わりにもっとも頻繁に使われるクラス。

</Smalltalk>

<Smalltalk>
=== Page 198 Code 2

10:45:49
abCollectio
     ^OrderdCollection
         with:(Sum
              name:'a'
              amount:10)
         with:(Sum
              name:'b'
              amount:3)

</Smalltalk>

よし、テストは書けた。走らそう。おっと。オリジナル summary メソッドは与えら
れた4つの要素を連結する、3つじゃない、だからテストはブレークする。でも驚
かない。

Chet OK、summary を実際にやろう。どうやる?
Ron  firstcollection にいって、その要素を全部 summary collection に移そう。
それから second collection に行って、要素が summary の中にあればそれに追加
して、そうでなければその要素を(summary の)中に入れよう。

=== Page 199

#ここ意味不明
Chet 2つのメソッドは全く同じってわけじゃないけど良く似てる。それぞれの
collection をみて、得た要素が summaryの中にあればそれを追加し、そうでなけ
れば新しく創るというのはどうだい。
Ron  いいね。最初に first をプロセスして、次に second をプロセスしよう。

<Smalltalk>
=== Page 199 Code 1

___Summarizer
10:50:29
summary
    self
         processFirst;
         processSecond

解説:
#お願いします。
(以下は、「さくさくSmalltalk」p37の引用です
メッセージのカスケード(直列化)をする時は、メッセージの間にセミコロンを
いれる。続いて送られるメッセージは、最初のメッセージで返されたオブジェク
トではなく、最初のレシーバに送られる。

</Smalltalk>

Chet  answer はどこで入力する?
Ron  新しいインスタンス変数をつくろう、summarizer。
Chet OK、コンストラクタ・パラメータ メソッドで初期化していい?
Ron  OK。

Chet はクラス定義にインスタンス変数を追加し、メソッドに空の
OrderedCollection を追加する。
#ここ意味不明。

<Smalltalk>
=== Page 199 Code 2

___Summarizer
10:51:01
setFirstCollection:firstCollection secondCollection:secondCollection
      first:=firstCollection
      second:=secondCollection
      summary:=OrderedCollection new

解説:
お願いします。

</Smalltalk>

Ron  二つの違うプロセスメソッドを持つ必要はないね。process:メソッドを2回
使おう。

<Smalltalk>
=== Page 199 Code 3

___Summarizer
10:51:55
summary
    self process:First.
    self process:Second

</Smalltalk>

Ron  OK。process: (メソッド)を書こう。


=== Page 200

Chet は collection に対するループを書く。要素をどう処理するかちょっと考え
てから、 processItem: の意向を宣言することを思い出して、続ける。

<Smalltalk>
=== Page 200 Code 1

___Summarizer
10:52:32
process:aCollection
     aCollection do:[:each|self processItem:each]

解説:
お願いします。

</Smalltalk>

もう終了は近い。我々はテストを走らし、processItem: をまだ定義していないこ
とに気がついた。Chet はブランクメソッドをつくり、それから我々は話し合う。

<Smalltalk>
=== Page 200 Code 2

___Summarizer
10:52:42
processItem:aSum

</Smalltalk>

Ron  OK。ゴム舗装道路だ(#??)。どうする。
Chet えーと、summary の中で matchingSum を見つけて・・
Ron  そして 入力 Sum をそれに追加する! そうしよう!

言ったとおりにコーディングする。我々の意向は、 matchingSum を見つけて、入
力 Sum をそれに追加することだ。コードはその通りに言っている。テストを走ら
す、そして、もちろん、matchingSum は定義されていない。

Ron  我々は summary を当たって、matching があるか確認しないと・・
#以下のやりとりの意味不明
Chet detect! (detect メソッド名を創ろう)
Ron  そう、detect をしよう・・
Chet そして ifAbsent: (も創ろう)
Ron  inNone: (じゃなかったっけ)
Chet どっちかわからない
Ron  新しい Sum をつくって summary に入力しよう

<Smalltalk>
=== Page 200 Code 2

___Summarizer
10:54:22
processItem:aSum
     (self matchingSum:aSum)add:aSum

解説:
お願いします。

</Smalltalk>

まで ----------------------------------------------

オリジナル http://www.xprogramming.com/
Copyright (c) 1999, REJeffries et al. (ronjeffries@....org)