Index: [Article Count Order] [Thread]

Date:  Mon, 5 Jun 2000 00:21:16 +0900
From:  Yutaka Kamite <y-kamite@....jp>
Subject:  [XP-jp:00485] XP Installed26 Part1 Test-first, by Intetion
To:  extremeprogramming-jp@....jp (extremeprogramming-jp ML)
Message-Id:  <393A7391300.1D1EY-KAMITE@....jp>
Posted:  Mon, 05 Jun 2000 00:19:45 +0900
X-Mail-Count: 00485

上手です。まとめの初回分です、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)