Index: [Article Count Order] [Thread]

Date:  Sun, 3 Dec 2000 00:26:09 +0900
From:  Kaoru Hosokawa <khosokawa@....com>
Subject:  [XP-jp:01231] Re: 単純な設計
To:  extremeprogramming-jp@....jp (extremeprogramming-jp ML)
Message-Id:  <B64F433A.2DA8%khosokawa@....com>
In-Reply-To:  <20001130094319omura@....jp>
Posted:  Sun, 03 Dec 2000 00:24:27 +0900
X-Mail-Count: 01231

ホソカワです。

> 
> ○月△日(月) 
> 173 と 984の積を計算しなくてはならなくなったので関数を作りました。
> 
> int times173and984(){ return 170232; }
> 
> ○月△+1日 (火)
> 728と734の積を計算しなくてはならなくなったので関数を作りました。
> 
> int times728and734(){ return 534532;}
> 
> ○月△+2日(水)
> 今日は、173と42の積を計算しなくてはなりませんでした。
> 月曜に、よく似た関数を作っていたので、それを改造することにしました。
> リファクタリングというものです。
> 
> int times173and(int x){
> if ( x == 984 ) { return 170232; }
> elseif( x == 42 ){ return 7266; }
> }
> 
> ○月△+3日(木)
> 今日は 173と734の積を計算する必要がありました。
> 火曜と水曜に作った関数に似ているのでまとめました。
> リファクタリングの醍醐味ここにありです。
> 
> int times[1000][1000];
> 
> int times( int x, int y ){
> times[173, 984] = 170232;
> times[728, 734] = 534532;
> times[173, 42] = 7266;
> times[173, 734] = 126982;
> return times[x, y];
> }
> 
> ★
> これ以上続けるとどういう関数を作ればいいのかわからなくなるのでここで終わりです
> 。
> 
> これは、「既に存在する関数(この場合は演算子 * ですが)を使いなさい」と
> いう教訓のお話ではなくて、一般化って何? 単純な設計って何?
> ということです。
> 我々がよく知っている掛け算のほうが、一般化のことについて見通しよく考えられるか
> な
> と思った上での狼藉です。
> 
> 
> 一般化したらだめだっていうことは、△日に times()を作らないということですよね。
> 何週間か後にやってくる△+ω日に、任意のxとyについて積が必要になったら、
> そのときはじめてtimes()を作るんですよね。
> 
> 一般化するほうが問題が簡単になる場合もあるとどこかで読んだしそう思うのですが、
> XPでははっきりとそれを禁止していますよね。
> 
> これは、ある意味、設計のセンスみたなのが否定されてるみたいで、
> DoTheSimplestThingThatCouldPossiblyWorkは、
> 心理的な抵抗が大きいなあと思うのです。
> 
> 誤読?
> 
> -- おおむら

私は、

    int times728and734() { ... }
    int times173and984() { ... }
    int times173and42() { ... }
    int times173and734() { ... }

と永遠に関数を増やすのが、DoTheSimplestThingThatCouldPossiblyWork だと思いま
す。この4つの関数で、顧客のストーリーが満足されるのであれば、いいのではない
でしょうか?例が単純なため実感がわきませんが…

で、このような関数を10個(辻さんの場合は3個)も書けば、そろそろリファクタリ
ングかなと思います。

この例ですと設計センスを否定されているのように感じますが、積の計算ではなく、
めちゃくちゃ複雑な計算だったら、どうでしょうか?

-- 
Kaoru Hosokawa
khosokawa@....com