ホソカワです。
整理の意味で、Javaのコードを埋め込みました。厳密な変換ではなく、「このような
ことを言いたいのだろう。」という変換をしています。(例えば、Smalltalk の new
は、factory を使っていません。)
on 2000/06/05 0:21 AM, Yutaka Kamite at y-kamite@....jp wrote:
> === 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>
>
<Java>
=== Page 190 Code 1
class Sum {
private String name;
private int amount;
}
解説:
Smalltalkでは変数のタイプを定義しないので、ここでは本文から String name と
int amount にしました。
</Java>
> これは、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>
>
<Java>
=== Page 191 Code 1
setNameAmount(aString, aNumber);
解説:
Sum クラスのコンストラクタの中身を定義しました。Smalltalk のキーワードメッセー
ジ
setX: x
Y: y
は、
setXY(x, y)
のようにメソッド名を結合し、パラメータはリストにするようにします。
</Java>
> これは このクラス(Sum)の新しいインスタンスをつくり(self new)、それに
> setName:aString
> amount:aNumber
> のメッセージを送ることだ。
>
> これは我々がコンストラクタ・パラメータ メソッドと呼ぶものだ。
> キャレット(^)は”answers”、”returns"を意味する。
>
> 我々は各クラス定義を同じ様に始める。コンストラクタとコンストラクタ・パ
> ラメータ メソッドだ。皆さんもいつもそうすると、うまくいく。
>
> これがメソッドの全部だ。
>
> <Smalltalk>
>
>
> ___Sum Class
> 10:25:00
> name:aString amount:aNumber
> ^self new
> setName:aString
> amount:aNumber
>
> 解説:
> name:amount: メソッドの定義。name:引数 amount:引数 となる。
> setName:aStrig, aomout:aNumber 引数付きコンストラクタ呼び出し。
>
> </Smalltalk>
>
>
<Java>
public Sum(String aString, int aNumber) {
setNameAmount(aString, aNumber);
}
解説:
^self new は、新しい Sum インスタンスを返すと言う意味ですが、Java には明示的
に書いていません。
</Java>
> 次のステップはいつも、今メッセージを送ったコンストラクタ・パラメータ メソ
> ッドを定義することだ。Smalltalkでは(普通)未定義のメソッドを使っても問題
> ない。
>
> <Smalltalk>
> === Page 191 Code 3
>
> ___Sum Class
> 10:25:15
> setName:aString amount:aNumber
> name:=aString
> amount:=aNumber
>
> 解説:
> 引数付きコンストラクタの定義。:=(コローンイコール)は代入。
>
> </Smalltalk>
>
>
<Java>
=== Page 191 Code 3
public setNameAmount(String aString, int aNumber) {
name = aString;
amount = aNumber;
}
</Java>
> このメソッドは二つのパラメータを対応するインスタンス変数に割当てる。イン
> スタンスは初期化された。どうせ必要なのでアクセサもつくろう。厳密に言うと、
> これは誤りだったが、記憶からこのクラスをつくった。
>
> <Smalltalk>
> === Page 192 Code 1
>
> ___Sum
> 10:25:30
> name
> ^name
>
> </Smalltalk>
>
<Java>
public String name() {
return name;
}
</Java>
> このメソッドは name という名前で、name というインスタンス変数を返す。name
> のアクセサです。厳密に言うと、このクラスを合って当然のもの(as a "given")
> としてつくったのでなければ、(その時必要ではなかったので)これをいれるべ
> きではなかった。
>
> amount に対してもアクセサをつくる。
>
> <Smalltalk>
> === Page 192 Code 2
>
> ___Sum
> 10:25:40
> amount
> ^amount
>
> </Smalltalk>
>
<Java>
public int amount() {
return amount;
}
</Java>
> ウオームアップは十分だ。我々のオブジェクト、Summarizer と呼ぶ、を書こう。
> 最初に SummarizerTest と名付けるテストクラスを作ることから始めよう。
>
> ペアプログラミングをやっている時の会話だ。
>
> Chet 最初に何をやろう
> Ron 空のを作ろう。空の collection を返すやつだ。
>
> Chet はテストを書く。彼は emptySummarizer と言う名前のメソッドがあること
> を仮定している。これによりタスクに集中できた。
>
> まで ----------------------------------------------
>
> オリジナル http://www.xprogramming.com/
> Copyright (c) 1999, REJeffries et al. (ronjeffries@....org)
>
>
今までの部分をまとめると
class Sum {
private String name;
private int amount;
public Sum(String aString, int aNumber) {
setNameAmount(aString, aNumber);
}
public setNameAmount(String aString, int aNumber) {
name = aString;
amount = aNumber;
}
public String name() {
return name;
}
public int amount() {
return amount;
}
}
Ken N.さん、吉田さん、上手さん、石井さん、コメントありがとうございます。
--
Kaoru Hosokawa
khosokawa@....com