Code Complete1人読書会 その8

第8回目。

まだまだ全然書ききれてないけど、読む方は一応1周しました。
記録が追いつかん*1。。

さてさて。
今回はルーチンの話。

 効果的なルーチンを作成するうえで最大の悩みの種は、単純な目的のために単純なルーチンを作成するのは気が進まないことである。
《Code Complete 第2版 上, 2005/03/28, 日経BPソフトプレス, p.204》より

確かに、ルーチンにしたとしても行数が減らないような場合って、ルーチン化しないでそのまま書いてしまうことも多いような。
でも言われてみればルーチン化することもメリットは確かにあるわな。

例えばこんなソースがあったとして。

points = deviceUnits * (POINTS_PER_INCH / DeviceUnitsPerInch());

これはまぁ、読めばなんとなくやりたいことはわかる。だけど、これを例えばこんな風にルーチン化してみて、

private int DeviceUnitsToPoints (int deviceUnits) {
    return deviceUnits * (POINTS_PER_INCH / DeviceUnitsPerInch());
}

そんでもって、こんな風に使ってみると。

points = DeviceUnitsToPoints(deviceUnits); 

こうやった方が可読性が増すし、コードの意図が伝わりやすいもんね。


次はルーチンの名前に関する話。

 ルーチンの名前にすべての出力と副次効果を反映させる。ルーチンがレポートの総数を計算して、出力ファイルを開くとしたら、ComputeReportTotals()という名前は適切ではない。ComputeReportTotalsAndOpenOutputFile()なら十分だが、長すぎるし稚拙である。
《Code Complete 第2版 上, 2005/03/28, 日経BPソフトプレス, p.210》より

うーむ。続きを見てみよう。

ルーチンに副次効果があると、名前はどうも長くて稚拙なものになる。だからといって、説明不足の名前を付けても解決にはならない。解決策は、副次効果のない直接的な処理を行うプログラムを作成することだ。
《Code Complete 第2版 上, 2005/03/28, 日経BPソフトプレス, p.210》より

うーむ。
言ってることはすごくわかるんだけど、実際問題頭を悩ますことは多々ありそう。
”直接的な処理を行うプログラム”は処理の塊を小さくすれば出来ると思うんだけど、例えば直接的な処理であるA、B、Cってルーチンがあったとして、それらのルーチンをまとめたより上位のルーチンがいる場合、名前はAandBandCとかになるんだろーか。
まー、これは例えが稚拙すぎてなんとも言えないけど結局そのあたりは悩むんだろうな。まだ若いし、悩んどくか。そだね。


明日で今年は仕事納めっす。

*1:この時期、忘年会シーズンデスカラ