上手です。
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)