最長不倒関数

 仕事で、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ページになりました。
 これから、このコードの内容を把握することを試すつもりです。

 嘆息。