👯‍♀️

DRY原則適用の主目的は可読性でも保守性でもなく同一性の強制である

2023/09/06に公開

何故人類はDRY原則を適用すべきない場面で適用してしまうのか。「これらの処理は偶然似ているだけで本質的に同一ではないので共通化すべきではない」というレビューコメントを打ち続ける日々はいつまで続くのだろうか。

プログラミングに慣れていない人々にとって「抽象化」や「直行性」等といった概念を理解するのは難しい。難解な言葉を使わずに共通化すべきか否かの判断基準になる考え方を短く簡潔に説明する方法はないだろうか。そこで私が辿り着いたのは「DRY原則の適用に可読性や保守性の向上を期待するな」という考え方である。

多くの初心者が処理を共通化する時に考えているのは「短くて読みやすくなる」や「今後の修正が1箇所で済む」といった可読性や保守性に対する効用であり、これは本来間違ってはいない。しかし、「これらの効用は単なる副作用でありDRY原則適用の主目的であってはならない」と敢えて強く言うべきではないかと私は考え始めた。

それではDRY原則適用の主目的は何であるべきなのか。それは「今後の同一性を強制する」ということだ。「読みやすくなりそうか」や「今後メンテしやすそうか」といった考え方は捨て去り「今後も同一であり続けることを強制したいか」という考え方にパラダイムシフトするのだ。ただ言い方を変えただけだが、この視点の違いは重要だ。DRY原則適用失敗の多くのパターンは「偶然似ているだけ」の処理を共通化することだ。「これらは本質的に同一なのか偶然似ているだけなのか」と問われると判断が難しいかもしれないが、「これらが今後も似続けることを強制したいか」と問われると一歩踏み止まる機会になるのではないか。この答えに迷うようであれば基本的に多くの場合はまだ共通化すべきではない。

似たようなコードを見て共通化すべきか迷った時は「共通化することで可読性や保守性が向上するか」を判断基準にせず「今後も似続けるべきか」を判断基準にしてみると誤ったDRY原則の適用事故が減るかもしれない。

Discussion