ホソカワです。
一ヶ月前の話題ですが、自己レスです。
on 2000/04/29 11:16 PM, Kaoru Hosokawa at khosokawa@....com wrote:
> ホソカワです。
>
> on 2000/04/29 0:58 AM, firo@....jp at firo@....jp wrote:
>
>> 矢崎です。
>>
>> 4. Code Formattingの翻訳案です。
>> 間違いのご指摘等お待ちしております。
>>
>
> …
>
> 以下の refactoring 部分に興味があるのですが、Smalltalk が読めないので理解で
> きません。どなたか Smalltalk のコードを Java か C++ に訳していただけないでしょ
> うか?
>
>> 今まで述べたようなルールを使った結果が、醜いコードになって
>> しまったら、本当に必要なことは、メソッドをリファクタすることであ
>> るという状況にきています。フォーマッティング・ルールに疑問を
>> 抱かないように。コードに疑問を持つようにしましょう。以下はそ
>> の例です。
>>
>> removeStep
>> | stepToRemove |
>> stepToRemove := self list selection.
>> stepToRemove isNil ifFalse: [stepToRemove isExecutable ifTrue:
>> [self list remove: stepToRemove.
>> steps remove: stepToRemove]]
>>
>> 上のコードは正しくフォーマットされています。しかし、醜いコード
>> です。私たちは、フォーマッティング・ルールを破って、余分なリタ
>> ーンやタブを追加して、醜さを取り除こうとするかもしれません。
>>
>> removeStep
>> | stepToRemove |
>> stepToRemove := self list selection.
>> stepToRemove isNil ifFalse:
>> [stepToRemove isExecutable ifTrue:
>> [self list remove: stepToRemove.
>> steps remove: stepToRemove]]
>>
>> 見てみましょう。まだ醜いコードです。よりよい解決は、リファクタす
>> ることです。例えば次のように。
>>
>> removeStep
>> self removeStep: self list selection
>>
>> removeStep: aStep
>> aStep isNil ifTrue: [^self].
>> aStep isExecutable ifFalse: [^self].
>> self list remove: aStep.
>> steps remove: aStep
>>
>> メソッドがよく見えるようにするために、フォーマッティングのルール
>> を破りたい気持ちになった時には、ほとんど全ての場合で、リファク
>> タリングを行って、よいコードを得ます。やってみましょう。
>>
>> ---
>> オリジナル http://www.xprogramming.com/
>> Copyright (c) 1999, REJeffries et al. (ronjeffries@....org)
上手さんのホームページ
(http://www.kk.iij4u.or.jp/~y-kamite/SmalltalkNotationForJavaProgrammer.htm
l)を参考にしてJavaに書き換えてみました。(コメントになっている部分は、訳し
かたがわからず、Smalltalkのままです。)
public void removeStep() {
/* type */ stepToRemove;
stepToRemove = /* self list selection */;
if (! stepToRemove.isNil())
if (stepToRemove.isExecutable()) {
/* self list remove: stepToRemove */;
steps.remove(stepsToRemove);
}
}
Jeffries氏は、if文のネストが汚いと言っているようですね。refactor後は、二つの
メソッドに分解された、if文のネストのない形式になっています。
public void removeStep() {
/* self removeStep: self list selection */;
}
public /* return type */ removeStep(/* type */ aStep) {
if (aStep.isNil())
return /* self */;
if (! aStep.isExecutable())
return /* self */;
/* self list remove: aStep */;
steps.remove(aStep);
}
なるほど。納得、納得。
Jeffries氏の「XP Installed」もコードサンプルはSmalltalkで書かれていますが、
JavaかC++で書いてほしかった。残念。
--
Kaoru Hosokawa
khosokawa@....com