DRY(Don’t Repeat Yourself)は絶対的に有効なのか

DRYという言葉はプログラマーであれば一度は聞いたことがあると思います。
これは機能やコードの重複をなくすという考え方です。
確かに、同じ処理であればそれを共通化することでメンテナンスも楽になります。
ただ、この考えに固執しすぎると大変なことになるケースがあります。
以下は例えばのお話です。
Aという処理にはXという処理がありました。
そして、ある日、Bという処理にもXという全く同じ処理があることがわかりました。
これまではAの中にXがあり、Bの中にXがあった状態でしたが、Xを切り出して共通の処理にし、AとBからはこれを呼び出すようにしました。
まさにDRYの考え方です。とても良いです。
問題はこの後発生します。
共通化に取り憑かれたプログラマーは、Cという処理の中にもXに似た処理があることに気がつきました。
ほとんどがXと同じですが一部だけ違います。
DRYの法則に従い、彼はCの中のその処理をXに含めようとしました。結果、Xの処理はすこしいびつになります。
後日、彼はDの処理の中にもXに似たものを見つけました。これはCの中にあったものとも少し違っています。
同じように、Xの処理を少し変えて、DからXを呼び出すようにしました。
この時点でXの中には、CやDにのみ特有の処理が入っていました。
これに気づいた彼は、この特有の部分をパラメータで渡すように変更しました。
Xが受け取るパラメーには、CやDにのみ特有のものが含まれるようになり、これらはもともとあったAやBの処理とは関連がありません。
ここまできてしまうと、Xに似たような処理があった場合に、なんでもXとして共通化したくなります。
もはやXは何者かわからない化け物になり、複数の特有のパラメータや条件分岐を内側に持つようになりました。
最近のコメント