上手です。まとめの初回分です、SmalltalkとJavaのコードよろしくお願いします。
XP Installed26 Part1 Test-first, by Intetion です。
ページ まとめ Java への変換担当者
----------------------------------------------
Part 1 189 - 192* 上手
Part 2 193 - 196 上手
Part 3 197 - 200 上手
Part 4 201 - 204 上手
---------------------------------------------
Smalltalk の解説は 「さくさくSmalltalk」(梅澤さん、今野さん他共訳)参考に
して基本的な部分だけ埋めてあります。チェックおよび追加をお願いします。
=== Page 189
Chetと私(Ron)は test-first の短いデモをしたいと思った。我々は顧客のとこ
ろでぶつかった実際の一つの問題を取り上げようと決めた。
この例には見るべき2つの重要なことがある。最初に、動かないテストを持って
初めてコードを書くこと。これを test-first programming (テスト−ファース
トプログラミング)という。
次に、どのようにこれを処理するかはほとんど考えていない、考えるのは何をす
べきか、ということです。我々はこれを programming by intention (意向によ
るプログラミング)と呼ぶ。
誰かがメソッドを書いていて、あなたはそれにメッセージを送るだけ、であるか
のようにコードを書く。
タスクはこれだ。
Sum オブジェクトの2つの collection(訳注参照)がある。一つの Sumは name
(a String),amount(a number)を持つ。アウトプットは新しい Sums の一つの
collection あること。それぞれの collection に同じ名前のものが現れたら、合
計する。Sum が一つの collectionにしかあらわれなかったら(#つまり新規)そ
の amount を持つ。出力の順番は最初の collection の順番で始め、次からはそ
の最初の中にないものが続く。例としては
#訳注:Smalltalk の collection は、他のオブジェクトの集合を含むオブジェ
クト。collection にはあらゆるオブジェクトを混在できる。
=== Page 190
first second 結果
A1 A10 A11
C2 B3 C2
B3
コードはゼロからつくることとする。
我々は新しいマシンを使う。そこで単純な Sum オブジェクトを定義することから
始める。
Smalltalk(#日常のちょっとした会話)を話さない人のためにちょっとコメント
をつける。
___Sum
10:25:00
この2行は、コードを追加しているクラスとそれをやった時間を示す。この目的
は、どれくらい時間がかかったかを示すためだ。
クラス定義だ。
<Smalltalk>
=== Page 190 Code 1
___Sum
10:25:00
Object subclass:#Sum
instance variables:'name amount'
解説:
Sum は Object の サブクラス
</Smalltalk>
これは、Sum という新しいクラスを定義し、インスタンス変数は name, amount
だ。Smalltalkでは、変数の型を定義する必要は無い。
では コンストラクタメソッドをつくろう。メソッド定義は、1タブ空けたメソッ
ド名で始まる。Smalltalkのメソッド名は、1つ以上のキーワードを含む。
=== Page 191
これ(メソッド名)は name:amount: だ。
メソッド自身(中身)は次の行からインデントされて始まる。
<Smalltalk>
=== Page 191 Code 1
^self new
setName:aString
amount:aNumber
解説:
self は 自分を表わす擬似変数、Javaのthis。
setName:(setnNameコローン)を引数オブジェクト aString 付きで呼び出す。
setName: と setName(もしあれば)は 別のメソッド。
クラス名に a,an を付けて オブジェクト名にすることがある。
</Smalltalk>
これは このクラス(Sum)の新しいインスタンスをつくり(self new)、それに
setName:aString
amount:aNumber
のメッセージを送ることだ。
これは我々がコンストラクタ・パラメータ メソッドと呼ぶものだ。
キャレット(^)は”answers”、”returns"を意味する。
我々は各クラス定義を同じ様に始める。コンストラクタとコンストラクタ・パ
ラメータ メソッドだ。皆さんもいつもそうすると、うまくいく。
これがメソッドの全部だ。
<Smalltalk>
=== Page 191 Code 2
___Sum Class
10:25:00
name:aString amount:aNumber
^self new
setName:aString
amount:aNumber
解説:
name:amount: メソッドの定義。name:引数 amount:引数 となる。
setName:aStrig, aomout:aNumber 引数付きコンストラクタ呼び出し。
</Smalltalk>
次のステップはいつも、今メッセージを送ったコンストラクタ・パラメータ メソ
ッドを定義することだ。Smalltalkでは(普通)未定義のメソッドを使っても問題
ない。
<Smalltalk>
=== Page 191 Code 3
___Sum Class
10:25:15
setName:aString amount:aNumber
name:=aString
amount:=aNumber
解説:
引数付きコンストラクタの定義。:=(コローンイコール)は代入。
</Smalltalk>
このメソッドは二つのパラメータを対応するインスタンス変数に割当てる。イン
スタンスは初期化された。どうせ必要なのでアクセサもつくろう。厳密に言うと、
これは誤りだったが、記憶からこのクラスをつくった。
<Smalltalk>
=== Page 192 Code 1
___Sum
10:25:30
name
^name
</Smalltalk>
このメソッドは name という名前で、name というインスタンス変数を返す。name
のアクセサです。厳密に言うと、このクラスを合って当然のもの(as a "given")
としてつくったのでなければ、(その時必要ではなかったので)これをいれるべ
きではなかった。
amount に対してもアクセサをつくる。
<Smalltalk>
=== Page 192 Code 2
___Sum
10:25:40
amount
^amount
</Smalltalk>
ウオームアップは十分だ。我々のオブジェクト、Summarizer と呼ぶ、を書こう。
最初に SummarizerTest と名付けるテストクラスを作ることから始めよう。
ペアプログラミングをやっている時の会話だ。
Chet 最初に何をやろう
Ron 空のを作ろう。空の collection を返すやつだ。
Chet はテストを書く。彼は emptySummarizer と言う名前のメソッドがあること
を仮定している。これによりタスクに集中できた。
まで ----------------------------------------------
オリジナル http://www.xprogramming.com/
Copyright (c) 1999, REJeffries et al. (ronjeffries@....org)