Index: [Article Count Order] [Thread]

Date:  Mon, 5 Jun 2000 00:23:13 +0900
From:  Yutaka Kamite <y-kamite@....jp>
Subject:  [XP-jp:00486] XP Installed26 Part2 Test-first, by Intetion
To:  extremeprogramming-jp@....jp (extremeprogramming-jp ML)
Message-Id:  <393A7407269.1D1FY-KAMITE@....jp>
Posted:  Mon, 05 Jun 2000 00:21:43 +0900
X-Mail-Count: 00486

上手です。
XP Installed26 Part2 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 193

<Smalltalk>
=== Page 193 Code 1

___SummarizeTest
10:32:08
testEmpty
    |summarizer|
    summarizer:=self emptySummarizer.

</Smalltalk>

これは我々が"意向によるプログラミング”と呼ぶものだ。空の Summarizer をど
うやって作るか考え、たぶん次に書く代わりに、Che tは空の Summarizer を得る
という彼の意向を表現している。これによりコードはクリアになるが、より重要
なのは、今やっているメソッドのコーディングの間に、別の細かい事を考えるこ
とにギアをチェンジする必要がないので、動きがスムーズに保たれることだ。

さて、Chet は最初の should:メソッドを書く前に何をすべきか話あう。

Chet answerはどうやってもらう
Ron  Summarizer に "summarize" (というメッセージ)を送ろう
Chet "summary"(要約という名前)はどうだろう
Ron  いいんじゃない

Summarizer のプロトコルのキー要素を定義していることに注意して下さい。送ら
れるメソッドは実際に実行されます。これをテストで実行することは大事です。
実際にオブジェクトを使うので、有用で明確なインターフェースを定義するチャ
ンスが多くなります。

<Smalltalk>
=== Page 193 Code 2

___SummarizeTest
10:32:08
testEmpty
    |summarizer|
    summarizer:=self emptySummarizer.
    self should:[summarizer summary isEmpty]

解説
|summarizeは一時変数(オート変数)の定義。
'.'は、文の終了を示す。Javaの ';’
#以下説明をお願いします。とりあえず、書いてみました(??)
[]はブロックでブロックのコード自身を返します。ブロックの意味は、
summarize に summary を送り、返って来た結果に isEmpty を送るです。
その結果を、 自分の should: (やるべき)メソッドの呼び出しの引数にします。

</Smalltalk>

上のコードは 一つの emptySummarizer(オブジェクト)をつくり、summary が
empty(空)であるかどうかテストする。自然に我々はテストを走らす。動かない、
emptySummarizer が定義されていない。我々はそれを予想していた、しかしチャ
ンスがあればいつもテストを走らすのが好きだ−それは持つと良い習慣だ。

=== Page 194

Chet 取引(deals)をどうやって作る?
Ron  クラスを定義して、インスタンス変数を2つ(つくる)、first と second
Chet いやな名前だね
Ron  同感、でも他にいいのを思いつかない。


<Smalltalk>
=== Page 194 Code 1

___Summary
10:32:45

Object subclass:#Summarizer
instance variables:'first second'

</Smalltalk>

我々はすぐにテストに戻る。コンストラクタ(emptySummarizer)をつくるわけで
はない、まだそれがどう見えたらいいのか解らないから。emptySummarize のため
の空のテストメソッドを見ながら、それを議論する。

Ron  一つの emptySummarizer(オブジェクト)には Sums の2つの
collections がいるね
Chet first:second: (というメソッド名になるのかな)
Ron  with:with: はどうだい
Chet OK

順番以外はそんなに違わない要素を2つ持つオブジェクトを創る場合には、
with:with: という名前はSmalltalkでは良い歴史を持っています。一方、この名
前はあまり自分の目的を良く伝えて(communicative)はいないので、 Ron のこの
同意は間違いかもしれません。

Chetはそのようにメソッドを書き、emptySummarizer に2つの空白の配列を入れる。

<Smalltalk>
=== Page 194 Code 2

___SummarizerTest
10:33:06
emptySummarizer
     ^Summarizer
         with:#()
         with:#()

解説:
配列は #(1 3)などと表記する。

</Smalltalk>

もう一度テストを走らす、もちろんブレークする。Summarizer は with:with:を
理解しないから。
対応するコンストラクタ・パラメータ メソッドと一緒に書く。いつもこうやっ
ているので、楽なことだ。

=== Page 195

<Smalltalk>
=== Page 195 Code 1

___Summarizer class
10:35:03
with:firstCollection with:secondCollection
      ^self new
           setFirstCollection:firstCollection
           secondCollection:secondCollection

解説:
引数付きの with:with:

</Smalltalk>

<Smalltalk>
=== Page 195 Code 2

___Summarizer class
10:35:54
setFirstCollection:firstCollection secondCollection:secondCollection
      first:=firstCollection
      second:=secondCollection

解説:
#(??)
引数付きのコンストラクタ

</Smalltalk>

テストをまた走らす。今度は Summarizer が summary を理解しないのでブレーク
する。Chet にはメソッドをどうするかのアイデアが無いので、halt(停止)をい
れたものをつくり、デバッガに入るためにテストを走らす。

<Smalltalk>
=== Page 195 Code 3

___Summarizer
10:37:18
summary
    self halt

解説:
#(??)
自己停止

</Smalltalk>

デバッガでちょっとばかりチェックする。

Chet OK、2つの入力 collection は空だ。
Ron  何を answer する。次に何をするかわからない。
Chet  これでうまくいくさ。

<Smalltalk>
=== Page 195 Code 4

___Summarizer
10:38:11
summary
    ^first,second

</Smalltalk>

Chetは二つの入力 collection を連結して answer した。何で彼がこうしたか判
らないが、これは動くのは解る。空の collection が返される。これはたぶん動
くであろう最も単純なことだ。空の collection を書いてそれを返す方がより単
純だが、 Chetは変数に手を加えた。

=== Page 196

我々の最初のテストは走った。オブジェクトは明らかに間違っているのに、それ
をフィックスするテストが無い。そこで、別のテストを書く。

Ron  私の書いた例をテストしよう。(テーブルの上にある)
Chet OK
Ron  これがどれだけ重要か彼らに言うのを覚えてかなくっちゃ。
Chet これは君が僕に教えてくれた一番重要なことの一つだ。
abcSummarizer メソッドのように、10秒前に誰かが私の必要とするメソッドを
書いたら、すぐそれを想定する (assume)コードを書くんだ。

ここでまた我々は意向について話し合う。我々はどうやってそれをやるかではなく、
欲しいものについて話す。欲しい物が判れば、実現するのは簡単だ。

<Smalltalk>
=== Page 196 Code 1

___SummarizerTest
10:39:34
testABC
     "self unsafeRun:#testABC"
     |summarizer|
     summarizer:=self abcSummarizer.
     self should:[summarize summary size=3]

解説:
”comment"はコメントを示す。
[]ブロックは、summarize へ summary(sizeは3)というメッセージを送る。
その結果を shoul: に引数として送る。

</Smalltalk>

これが、意向によるプログラミングだ。Chetはテストオブジェクトをセットアッ
プするメソッド abcSummarizer を想定している。
次に、summary が自分に送られた3要素の collection を確実に answer するか
どうかをチェックする単純なテストを書く。それはテストとしては十分ではない
が、我々の必要としているブレークするためには十分だ。メソッドをコピーした
ことを覚えておいてね−要素はまだ入れない。

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

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