Googleに存在するコードを読みやすく保守しやすい形に保つ取り組みを行うグループ「Code Health」が、「DRYを早まって適用しないこと」と題した記事を公開しました。

Google Testing Blog: Don't DRY Your Code Prematurely

https://testing.googleblog.com/2024/05/dont-dry-your-code-prematurely.html



DRYは「Don't Repeat Yourself」の略称で、コードを重複させないことを重視する考え方です。重複するコードが存在していると、特定の機能を変更しようとした時に同じ機能を持つ部分を全て探して同時に変更する必要があり、見落としやミスが発生する危険性が高まります。一方、コードの重複を防げていれば一カ所だけを変更すればOKというわけ。

一見DRYを厳しく適用するとコードの保守性が向上して良さそうに見えますが、GoogleのCode Healthグループはブログに「DRY原則の適用を厳格にしすぎると抽象化が早まってしまい、将来の変更が必要以上に複雑になる」と時期尚早なDRYの適用を避けるべきと述べました。

例えば下記の左側はDRYに沿って「deadlineの判定」を一つの関数にまとめたコードで、右側はDRYに反して二つに分かれているコードです。「ValueError」のチェック内容が同一であり、現時点ではDRYが適用できてしまうものの、Code Healthグループは「タスクと支払いの締め切りは異なるロジックを持つ異なる概念で、偶然チェック内容が同一になっているだけ」としてDRYを適用すべきでないとしています。



実際、支払いに関して追加の検証が必要になった場合、右側のコードであれば簡単に検証を追加できますが、左側のコードに「支払いに関する追加の検証」を導入するのは非常に難しいもの。「コードが本当に冗長なのか、それとも表面的に似ているだけなのかを慎重に検討する必要がある」と述べられています。

コードの要件は時間とともに変化することが多いため、開発の初期段階や小規模な開発では多少の重複を許容しておき、DRYを適用するべきだとはっきり判別できる十分な共通パターンが出現してから抽象化を始める方が開発を簡単に進められるとのことです。