osiire’s blog

ふしぎなそふとやさん

同じロジックを書く

同じロジックのコードを2度以上書くな

2008-09-22 - プログラミング日記より

このテクニックはプログラマーには常識的に信じられている事だと思う。でも、私はあえて同じロジックを書く事が結構ある。特に最上位のアプリケーションレベルのコードの場合に多い。それは、本質的に異なる意味の処理がたまたま同じ処理である事が結構あるから。そういう場合の処理を例えば別関数にしてまとめてしまうと、もし何らかの都合で片方だけ動作を変えたいとなると、せっかくまとめた関数に醜い引数とif文が生まれてしまう。
例えば、異なるデータを管理する異なるウィンドウで、たまたまF9を押したら表示されているデータを印刷する似た機能があったとする。おそらくF9が押された時の動作は、そのとき表示されているデータを拾って印刷フォーマットが記述されたファイルと一緒に印刷命令を出すだけ。同じコードを書かないポリシーに従うと、データのリストと印刷フォーマットファイル名を引数にして、きちんとエラー処理した共通関数を作りたくなる。
でも、そこで片方のウィンドウの場合だけプレビューを出したいという事になったら?簡単、プレビューを表示するかどうかを示すフラグを引数に追加すればいいじゃん。じゃ、片方の印刷物だけ動的にタイトルを変えたくなったら?片方だけ実は2種類の帳票を部まとめで印刷したくなったら?
何が言いたいかというと、開発時に一時的に同じだと思える処理でも「本質的に意味が異なる」最上位ロジックを不用意にまとめると、将来的に本質的でない引数と分岐がプログラムをどんどん壊していくよって事。それに、そういう妙な共通関数を変更すると思わぬ所に影響が出たりして、収拾がつかなくなる。
と言う訳で、私のプログラムはコピペが多いです(言い訳)。