『Cプログラミング診断室』目次次(第2章 これでもプロ 構造的欠陥)

第2章 これでもプロ

関数分解


関数 keyinput_sub は結構長く、かつgoto文も含んだ、汚い関数の代表選手です。では、これを きれいに整形していきましょう。

■goto文をなくす■

長い関数は、ふつういくつかのまとまった処理部分に分かれています。この関数の場合に難しい のは、長いだけではなく、goto文が「流れ」を乱していることです。

まず、変なgoto文とラベルを無くします。

ラベル get は使われていないので、無条件に取り除けます。(こんなもの、絶対に残しておく なよな!)

ラベル again は、関数の最初から再実行しています。したがって、for文で関数全体をくくると 良いでしょう。このfor文の繰り返し制御変数を使って制御してみます。forの初期化部分と、goto again の部分でこの制御変数に0以外をセットしなければいけません。

ラベル nextは、より下位のループです。ここはdo−while文で書き換えてみましょう。

■どこで分ける■

長い関数は、内部がいくつかの処理に分かれているものです。この関数の中ですぐ目につくのは、 173行からのswitch文です。この部分が約 70行あるので、これを別関数にします。特殊キーに関連 する処理をしているようなので、関数名をspecial_keycodeにします。実際には、その前後の一部 も含めています。

残り部分は246行からのif文で、特殊キー以外の処理をしています。これも関数にしてしまいま しょう。普通のキーの処理だから、関数名をnormal_keycodeにします。関数名はできるだけその実 態を表すようにしましょう。

■分ける■

分ける時には、いろいろな問題がでてきます。

  1. 関数名の決定
  2. 引数の決定
  3. 元の関数の内部変数の使われ方
  4. 戻り値の決定

実際の作業手順は、エディタで、次のようにすると良いでしょう。

  1. とにかく切りだし、もとの個所に関数名を書く。
  2. 切り出した部分を、無理矢理でも関数の形に整形する。
  3. コンパイルして、エラーを出して、未宣言変数を調べる。
  4. 局所的なら関数内部に、でなければ引数に加える。
  5. 3.4.をエラーがなくなるまで繰り返す。

プログラムを順次改良していく作業は、エディタでどのように変更し、コンパイルし、またエディ トする経過そのものを、私の隣で観察するとか、ビデオ取りして見てもらうのが最善なのですが、 これはなかなか難しい。

O'Reilly Japan刊

3/14発売
増刷:第3刷決定♪

オープンソース
Scheme言語処理系
Gaucheの愛好者団体

詳細はブログで



Copyright1996 Hirofumi Fujiwara. No reproduction or republication without written permission
『Cプログラミング診断室』目次次(第2章 これでもプロ 構造的欠陥)