Index: [Article Count Order] [Thread]

Date:  Sat, 27 May 2000 14:39:15 +0900
From:  "Ken N." <kenn@....nu>
Subject:  [XP-jp:00410] Re: Refactoring
To:  extremeprogramming-jp@....jp (extremeprogramming-jp ML)
Message-Id:  <200005270538.OAA29534@....nu>
In-Reply-To:  Your message of "Sat, 27 May 2000 13:05:48 +0900".    <B5557156.18EC%khosokawa@....com>
Posted:  Sat, 27 May 2000 14:38:52 +0900
X-Mail-Count: 00410

In <B5557156.18EC%khosokawa@....com> (May.27 2000 13:05 JST),
``[XP-jp:00408] Re: Refactoring Was: Re: 【 4.  Code Formatting  】 (案)'',
khosokawa@....com says:

=   (コメントになっている部分は、訳し
=   かたがわからず、Smalltalkのままです。)

=   >> removeStep
=   >> | stepToRemove |
=   >> stepToRemove := self list selection.
=   >> stepToRemove isNil ifFalse: [stepToRemove isExecutable ifTrue:
=   >> [self list remove: stepToRemove.
=   >> steps remove: stepToRemove]]

=   public void removeStep() {
=       /* type */ stepToRemove;
=   
=       stepToRemove = /* self list selection */;
=       if (! stepToRemove.isNil())
=           if (stepToRemove.isExecutable()) {
=               /* self list remove: stepToRemove */;
=               steps.remove(stepsToRemove);
=           }
=   }

たしか、returnが明示(``^something'' のように)されていないときに
は、implicitlyに``self''を返したと思います。

仮に、問題のクラスを``Foo''とでもしておきます。多分このクラスに
は、``Step''とでも言うべきオブジェクトを集約する属性``steps''が
あるのでしょう。

    public Foo removeStep(){
        Step stepToRemove;

        stepToRemove = this.list().selection();
        if (!stepToRemove.isNil()){
            if (stepToRemove.isExecutable()){
                this.list().remove(stepToRemove);
                steps.remove(stepToRemove);
            }
        }
        return this;
    }

おそらく、こんな感じです。


=   >> removeStep
=   >> self removeStep: self list selection
=   >> 
=   >> removeStep: aStep
=   >> aStep isNil ifTrue: [^self].
=   >> aStep isExecutable ifFalse: [^self].
=   >> self list remove: aStep.
=   >> steps remove: aStep
=   >> Copyright (c) 1999, REJeffries et al. (ronjeffries@....org)

=   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);
=   }

こちらは、

    public Foo removeStep(){
        this.removeStep(this.list().selection());
        return this;
    }

    public Foo removeStep(Step aStep){
        if (aStep.isNil())
            return this;

        if (!aStep.isExecutable())
            return this;

        this.list().remove(aStep);
        steps.remove(aStep);
        return this;
    }

こんな感じになると思います。
(冗長な``this''がありますが。)


=   なるほど。納得、納得。

「removeすべきStepを選択してremoveする」という処理から、「ある
Stepをremoveする」という汎用的な処理が括り出されていますね。ま
た、その「あるStep」というのが満たさなくてはいけない条件も明解
になっています。


 -.- . -. -.
Ken Nakagaki (kenn@....nu is NOT for private E-Mail)
「人は船ではない。人は会社ではない」-- Gerry Spence