Index: [Article Count Order] [Thread]

Date:  Sun, 11 Jun 2000 15:02:05 +0900
From:  Kaoru Hosokawa <khosokawa@....com>
Subject:  [XP-jp:00522] Re: XP Installed26 Part1 Test-first, by Intetion
To:  extremeprogramming-jp@....jp (extremeprogramming-jp ML)
Message-Id:  <B5695A02.1D03%khosokawa@....com>
In-Reply-To:  <200006101349.WAA31357@....nu>
Posted:  Sun, 11 Jun 2000 15:01:57 +0900
X-Mail-Count: 00522

ホソカワです。

Smalltalk、Java、共に自身がありません。コメントお願いします。

on 2000/06/10 10:50 PM, Ken N. at kenn@....nu wrote:

> Part1と2についてコードをJavaにしてみました。
> どの程度妥当な訳になっているかあまり自信はありませんが、参考になれば。
> 
> 
> まずはPart1のほうです。
> 
> 
> <Smalltalk>
> === Page 190 Code 1
> 
> Object subclass:#Sum
> instance variables:'name amount'
> </Smalltalk>
> 
> <Java>
> === Page 190 Code 1
> 
> /*
> Smalltalkではクラスにメッセージを送ることによってサブクラ
> スを導出します。適当な基底クラスが見付からなければ
> ``Object'' にメッセージを送ることになります。意味としては
> 新規クラスの定義ですので、Javaならば以下のように書けば十分
> でしょう。
> */

補足ですが、

    class Sum extends Object {
        // ...
    }

という事ですね。

教えて下さい。「Object」が「new」を受け取って、インスタンスを返すのでしたっ
け?

> class Sum {
> private String name;
> // 後になって登場するコードを見る限りでは、nameはString
> // で良いと思われます。
> private int amount;
> // amountについては、とりあえずintにしておきました。
> 
> // メソッドの定義は後で出て来ます。ここではブランクにして
> // おきます。
> }
> </Java>
> 
> 
> <Smalltalk>
> === Page 191 Code 1
> 
> ^self new
> setName:aString
> amount:aNumber
> </Smalltalk>
> 
> <Java>
> === Page 191 Code 1
> 
> /*
> 本文の記述をみればわかる通り、上記のSmalltalkコードは、メソッ
> ドの本体部分だけです。しかし、「コンストラクタ」と明記され
> ていますので、以下のように書けます。
> */
> public Sum(String aString, int aNumber){
> setNameAndAmount(aString, aNumber);
> }
> </Java>
> 

ここは、「name:amount:」の定義をしている部分ですね。「setNameAndAmount()」は、
後で登場させて、定義の中身だけ、直訳した方がいいように思います。

    Sum aNewSum = new Sum;
    aNewSum.setName(aString);
    aNewSum.amount(aNumber);

ところで、原文の「Constructor Parameter method」は、どういうものなのでしょう
か?

> 
> <Smalltalk>
> === Page 191 Code 2
> 
> name:aString amount:aNumber
> ^self new
> setName:aString
> amount:aNumber
> </Smalltalk>
> 
> <Java>
> === Page 191 Code 2
> 
> /*
> すでに上述のとおりですが、ファクトリメソッドのほうが意味的
> に近いかもしれません。こんなふうに書けると思います。(でも、
> いかにも「直訳」という感じですね)
> */
> private Sum(){}
> 
> public static Sum createWithNameAndAmount(String aString, int aNumber){
> Sum aNewSum = new Sum();
> aNewSum.setNameAndAmount(aString, aNumber);
> return aNewSum;
> }
> </Java>
> 
> 

さっきの流れから、

    public static Sum createWithNameAndAmount(String aString, int aNumber) {
        Sum aNewSum = new Sum();
        aNewSum.setName(aString);
        aNewSum.amount(aNumber);
    }

の様になります。

> <Smalltalk>
> === Page 191 Code 3
> 
> setName:aString amount:aNumber
> name:=aString
> amount:=aNumber
> </Smalltalk>
> 
> <Java>
> === Page 191 Code 3
> 
> /*
> 「新しいインスタンスを作って初期化する」という処理から「イ
> ンスタンスを初期化する」という処理を分離するのが彼らの流儀
> のようです。
> 
> 直訳すると以下のようになるでしょう。
> */
> public Sum setNameAndAmount(String aString, int aNumber){
> name = aString;
> amount = aNumber;
> return this;
> }
> 
> /*
> しかし、実際にはつぎのようなものでも十分かもしれません。
> */
> private /* or protected */ void setNameAndAmount(String aString, int aNumber){
> name = aString;
> amount = aNumber;
> }
> </Java>
> 
> 
> <Smalltalk>
> === Page 192 Code 1
> 
> name
> ^name
> </Smalltalk>
> 
> <Java>
> === Page 192 Code 1
> 
> // 特に説明は不要だと思います。
> public String getName(){ return name; }
> </Java>
> 
> 
> <Smalltalk>
> === Page 192 Code 2
> 
> amount
> ^amount
> </Smalltalk>
> 
> <Java>
> === Page 192 Code 2
> 
> public int getAmount(){ return amount; }
> </Java>
> 
> 
> <Java>
> 
> /*
> 彼らは、ここまでで一旦``Sum''の実装に一区切りつけています
> から、一応まとめておきます。
> */
> class Sum {
> private String name;
> private int amount;
> 
> public Sum(String aString, int aNumber){ setNameAndAmount(aString, aNumber); }
> 
> public Sum setNameAndAmount(String aString, int aNumber){
> name = aString;
> amount = aNumber;
> return this;
> }
> public String getName(){ return name; }
> public int getAmount(){ return amount; }
> }
> </Java>

「createWithNameAndAmount()」がコンストラクタだったわけですよね。

    public Sum(String aString, int aNumber) {
        Sum aNewSum = new Sum;
        aNewSum.setName(aString);
        aNewSum.amount(aNumber);
    }

ただ、Javaのコンストラクタで自分自身をnewする事はないので、

    public Sum(String aString, int aNumber) {
        name = aString;
        amount = aNumber;
    }

の様になった。

そして、(リファクタリングを行って、)

    public Sum(String aString, int aNumber) {
        setNameAndAmount(aString, aNumber);
    }

となった。

...

-- 
Kaoru Hosokawa
khosokawa@....com