ホソカワです。
Javaへの変換、試みてみました。Smalltalkをちゃんと理解していないので、変なと
ろがあります。
on 2000/06/05 0:26 AM, Yutaka Kamite at y-kamite@....jp wrote:
> 上手です。
> 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はテストを強化する準備ができている。
> 私はまだ準備が出来ていない、しかし彼は出来ている、そこで彼が全ての値をチ
> ェックするためのテストをつくるのを見守る。
>
<Java>
=== Page 197 Code 1
--SummarizerTest
10:40:57
public Summarizer abcSummarizer() {
return new Summarizer(new Vector(), new Vector());
}
</Java>
解説:
空のベクターを二つあたえて、Summarizerを作成しています。
> <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>
>
>
<Java>
=== Page 197 Code 2
--SummarizerTest
10:43:06
public void testABC() {
Summarizer summarizer;
Summary summary;
summarizer = abcSummarizer();
summary = summarizer.summary();
assert(summary.size() == 3);
assert(summary.first().name() == "a");
assert(summary.first().amount() == 11);
assert(summary.at(2).name() == "c");
assert(summary.at(2).amount() == 2);
assert(summary.last().name() == "b");
assert(summary.last().amount() == 3);
}
解説:
「"self unsafeRun:#testABC"」は、なんですか?変換していません。
</Java>
> Ron もう選択(の余地)はないね。今 collection を構築しなきゃ。
> Chet いやいや、まだやることがある。
>
> <Smalltalk>
> === Page 197 Code 3
>
> ___SummarizerTest
> 10:44:29
> abcSummarrizer
> ^Summarizer
> with:self acCollection
> with:self abCollection
>
> </Smalltalk>
>
<Java>
=== Page 197 Code 3
---SummarizerTest
10:44:29
public Summarizer abcSummarizer() {
return new Summarizer(new acCollection(), new abCollection());
}
</Java>
> === 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>
>
<Java>
=== Page 198 Code 1
---SummarizerTest
10:45:45
public Vector acCollection() {
Vector acCollection = new Vector;
acCollection.addElement(new Sum("a", 1));
acCollection.addElement(new Sum("c", 2));
return acCollection;
}
解説:
VectorにSumという要素をaddElement()を使って二つ追加しています。
</Java>
> <Smalltalk>
> === Page 198 Code 2
>
> 10:45:49
> abCollectio
> ^OrderdCollection
> with:(Sum
> name:'a'
> amount:10)
> with:(Sum
> name:'b'
> amount:3)
>
> </Smalltalk>
>
<Java>
=== Page 198 Code 2
10:45:49
public Vector abCollection() {
Vector abCollection = new Vector;
abCollection.addElement(new Sum("a", 10));
abCollection.addElement(new Sum("b", 3));
return abCollection;
}
</Java>
> よし、テストは書けた。走らそう。おっと。オリジナル 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>
>
<Java>
=== Page 199 Code 1
---Summarizer
10:50:29
public Summary summary() {
processFirst();
processSecond();
return this;
}
</Java>
> 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>
>
<Java>
=== Page 199 Code 2
---Summarizer
10:51:01
public void setFirstCollectionSecodCollection(
Vector firstCollection, Vector secondCollection) {
first = firstCollection;
second = secondCollection;
summary = new Vector;
}
</Java>
> Ron 二つの違うプロセスメソッドを持つ必要はないね。process:メソッドを2回
> 使おう。
>
> <Smalltalk>
> === Page 199 Code 3
>
> ___Summarizer
> 10:51:55
> summary
> self process:First.
> self process:Second
>
> </Smalltalk>
>
<Java>
=== Page 199 Code 3
---Summarizer
10:51:55
public Summary summary() {
process(first);
process(second);
}
</Java>
> 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>
>
ここは、私のSmalltalkの知識を超えています。援助お願いします!eachは、なんで
しょうか?
<Java>
=== Page 200 Code 1
---Summarizer
10:52:32
public void process(Vector aCollection) {
for (int i = 0; i < aCollection.size(); i++) {
aCollection.elementAt(i).processItem(each);
}
}
</Java>
> もう終了は近い。我々はテストを走らし、processItem: をまだ定義していないこ
> とに気がついた。Chet はブランクメソッドをつくり、それから我々は話し合う。
>
> <Smalltalk>
> === Page 200 Code 2
>
> ___Summarizer
> 10:52:42
> processItem:aSum
>
> </Smalltalk>
>
<Java>
=== Page 200 Code 2
---Summarizer
10:52:42
processItem(aSum);
</Java>
> 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>
>
<Java>
=== Page 200 Code 2
---Summarizer
10:54:22
public void processItem(Sum aSum) {
matchingSum(aSum).add(aSum);
}
解説:
ここは、直訳です。多分、Sum の name が同じ場合は、その Sum を返すのでしょう
か?でも、name が違う場合は何が戻ってくるのでしょうか?
</Java>
> まで ----------------------------------------------
>
> オリジナル http://www.xprogramming.com/
> Copyright (c) 1999, REJeffries et al. (ronjeffries@....org)
>
--
Kaoru Hosokawa
khosokawa@....com