Index: [Article Count Order] [Thread]

Date:  Sat, 27 May 2000 13:05:48 +0900
From:  Kaoru Hosokawa <khosokawa@....com>
Subject:  [XP-jp:00408] Re: Refactoring Was: Re: 	【 4.  Code Formatting   】 (案)
To:  extremeprogramming-jp@....jp (extremeprogramming-jp ML)
Message-Id:  <B5557156.18EC%khosokawa@....com>
In-Reply-To:  <B5309200.1273%khosokawa@....com>
Posted:  Sat, 27 May 2000 13:05:33 +0900
X-Mail-Count: 00408

ホソカワです。

一ヶ月前の話題ですが、自己レスです。

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