ホソカワです。
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