Index: [Article Count Order] [Thread]

Date:  Sun, 2 Jul 2000 00:48:00 +0900
From:  Kaoru Hosokawa <khosokawa@....com>
Subject:  [XP-jp:00569] Re: XP Installed26 Part1 Test-first, by Intetion
To:  extremeprogramming-jp@....jp (extremeprogramming-jp ML)
Message-Id:  <B5843439.2298%khosokawa@....com>
In-Reply-To:  <393A7391300.1D1EY-KAMITE@....jp>
Posted:  Sun, 02 Jul 2000 00:46:57 +0900
X-Mail-Count: 00569

ホソカワです。

整理の意味で、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