○月△日(月)
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は、
心理的な抵抗が大きいなあと思うのです。
誤読?
-- おおむら