最長不倒関数
仕事で、C++で書いたCOM(Common Object Model)のプログラムにメソッドをひとつ追加しました。(コーディングは、協力会社の人にコーディングしてもらいました。でも、半分ペアプログラミングのような感じです。)
単体ではテストを済ませ、仮リリースまでしてあります。
さて、実際に稼動させるシステムに似せて、周りのプログラムたちといっしょに動かす統合テスト(システムテスト)をしようと思ったのですが、ここでちょっとつまづきました。エラーです。私たちが手を加えたプログラムの通信相手が、その内部処理でエラーになったようです。
ログファイルを見ると、エラーログが出力されています。
そのエラーメッセージをコピーしてソースコードのあるディレクトリ下でgrep(文字列検索)すれば、ソースコード中のどの箇所でエラーが報告されたかはわかるはず。
「えい」とばかりにgrepすると、ありました。ある関数内で、別のある関数 FormHostMessage を呼び出した結果がエラーだったようです。
そこで、次はその FormHostMessage を見てみればいいかと思って覗き込んでみて、驚きました。
関数が、非常に長い。
(関数 FormHostMessage は、C++で書かれたクラスのメンバ関数です。)
むかし読んだことのある「Cプログラミング診断室」という本に「最長不倒関数」という章があって、そこに2458行もある関数 SendToDevice というものが紹介されています。(オンラインでも読めます。*1)
「Cプログラミング診断室」の「最長不倒関数」は、何と2458行もあるそうです。著者の藤原さんは「私は、かれこれ10年もの間、C言語とつきあっていますが、これだけ長い関数を見たのは生まれて初めてです。口うるさい仲間に見せたり、ネットで流したら、"Never Ending Function"とか、「最長不倒関数」とか言われてしまいました。」と書かれています。
私が見た関数 FormHostMessage はそれを超えていました。 SendToDevice と同じ数え方で、コメントや空白行も数えると、2844行です。上位から二桁めで四捨五入すれば3000行です。
おそらく、数々の歴史を経てこれだけ長くなってきたのでしょう。それにしてもと思います。よくもまあこんなになるまでメンテナンスしてこれたものです。あきれるというか、感心してしまいます。
いくらなんでもまともにぶつかる気力がなくなったので、とりあえず空白行とC言語形式のコメント(/* ではじまって */ で終わる)と、C++形式のコメント(// で始まって改行で終わる)を取り除いてみました。
このとき、C言語形式のコメントだけを除去するツールが見当たらず、しかたなく70行ほどのJavaプログラムをちょこちょこと書いて使いました。(中心となる、一番長いメソッドは17行です。あとはそれぞれ数行の小さな関数ばかりです。)
これで、だいぶん短くなりました。それでも刈り込んだ FormHostMessage は1834行です。A4のコピー用紙に8ポイントで印刷しても、21ページになりました。
これから、このコードの内容を把握することを試すつもりです。
嘆息。