ホームページ目次前の話次の話

プログラム集中治療室で行う緊急処置(4)細分割

2008年3月25日

昨日は、プログラムの整理について書いたが、整理だけで済む場合は非常に少い。 今日は、整理は整理でも、クラス、メソッド/関数などに手を入れる、 メスを入れて血が出てしまうような整理について紹介しよう。

まず、長大なネバーエンディングなクラス、メソッド/関数にお目にかかることがある。 5000行を越えるクラスが存在したり、500行を超えるメソッド/関数があったりするものだ。 せいぜい、1000行のクラス、100行のメソッド/関数にしてもらいたい。 というか、そうでなければ、一体何を行っているのか、プログラムを書いた本人も理解できていないのではないだろうか。

このくらい長大になってしまうと、常に砂浜(もしかして砂漠)に落したコインを探すような情況になっている筈だ。 まして、作者以外の人にとって、理解しようという気にすらならないであろう。 でも、仕事だから、何とかしなくちゃいけないので、何とかする訳である。

ということで、この長大さを無くすことに全力を注ぐことになる。 手を沢山入れることになりそうな個所が長大だと、とんでもなく大変な作業になることが予想される。

まず、長大なクラスの場合、privateなんて呪文がいくらちりばめられていても、 全部がpublicであるのと何の違いもない。 各部分毎に、つまり機能、概念毎に別のクラスが用意されているから、 オブジェクト指向が開発に適することがあるわけだが、 長大なクラス、ましてプログラム全体が1つの長大なクラスになっていたりしたら、 とにもかくにも、切り刻もう。

切り刻むときに、意味のある切り分け方をしなければいけない。 これが結構面倒で、ある程度内容を見ながら行なわなければいけない。 1つのクラスを2つに分ける場合、そとに追い出したい部分を新たなクラスとし、 新旧のクラスの間をうまく縫い合わせる必要がある。

たとえば、JavaでEclipseを使っていれば、比較的簡単にできる。 というより、Eclipseのような優れた開発ツールがないと、とても面倒である。 新しいクラスをでっちあげ、そこへ、移動したい変数やメソッドを移動してしまう。 すると、エラーがいっぱい出て、直すべき個所を教えてくれる。

移動する前に、移動した場合にどのくらいの影響がでるかも確認できる。 移動したい変数やメソッドを一瞬、コメントアウトしてみるのである。 すると、エラーが沢山出て、あちこちが赤くなる。 このエラーの量があまりにも多い場合には、その移動はとりあえず諦めた方が賢明だろう。

この作業は、エラーが途中で必ず出るし、 ソースプログラムに直接手を入れることになるので、 動作確認はしっかりしなければいけない。 直接、クラスやメソッドが利用されている場合は簡単だが、 イベントやスレッドなどが関係し、微妙に絡んでいる場合がある。

中には、どう複数のクラスに分けるかが理解できていないために、 無理矢理1つのクラスになっているというか、 1つのクラスにしてしまっているから何とか動いている場合もある。 こういう場合は、goto文であちこち飛びまくっているプログラムと同じで 非常に始末に悪い情况になっていることがある。 あまり酷い場合には、プログラムを捨てよう。 プログラムを捨てる勇気は、最後まで常に保持することを忘れてはならない。

意味のまとまり毎に新しいクラスをでっちあげ、クラスを細分化していくわけだが、 頑張りすぎるのは無駄なので、適当なところで止めなければいけない。 どこで中止すれば良いだろうか。 理想的なクラス分け、メソッド分けなど決して望んではいけない。

止めるのは、何とか当初の目的のプログラムの改造が可能と思われる段階である。 このプログラムを切り刻む作業はとても時間がかかるが、この作業を通して、 プログラムの構造がずいぶん把握できるようになる。 もちろん、「なんでこんな作り方をするんだ」と思う場合がほとんどなのだが、 それでも、プログラムの構造、そしてプログラマの頭の構造が分るようになる。


Tシャツ製作ファクトリー

役に立つ!面白い!
ニュース&リンク
総合サイト Okazaki.gr.jp


ホームページ目次前の話次の話