😿

誤ったDRYには注意

2023/01/05に公開

DRY原則とは

「Don't repeat yourself」

砕けていうと、同じコードを重複させないで

多くのエンジニアが最初に出会う原則ではないのでしょうか。
少なくとも自分の初原則はDRYに捧げました。

誤った使い方

// 名前のバリデーション
function validationName(array $input){
  if (文字列かどうか型を確認 && 文字数が1以上か文字数確認) {
    return true;
  }
  return false;
}

// メールアドレスのバリデーション
function validationEmailAddress(array $input){
  if (文字列かどうか型を確認 && 文字数が1以上か文字数確認) {
    return true;
  }
  return false;
}

共通化できそう!varidation()メソッドにまとます!
一見良さそうに見えますね。

function validation(array $input){
  if (文字列かどうか型確認 && 文字数が1以上か文字数確認) {
    return true;
  }
  return false;
}

しかし今後下記の様なことが起きます。
「メアドは「@」が含まれるか確認したいな。。名前は名字と姓がどちらも含まれているか確認したいな...」

あれあれ、varidation()メソッドの変更がしづらそうです。

何がいけなかった?

上の例では、それぞれ"名前"と"メールアドレス"で確認したいことは今後異なっていくでしょう。
目的は近くて、たまたま偶然同じ処理をしていただけなのです。
そういった場合はDRY原則は適用するべきでないと思います。

また、異なるものを共通化してしまったら、単一責任の法則(SRP)に反してしまいます。
varidation()メソッドは、下記の2つの異なる責務を担ってしまっています。

  • 名前のバリデーションをするという責務
  • メールアドレスのバリデーションをするという責務

まとめ

ある二つのコードが偶然似ているだけなのか、本質的な同じものなのかをしっかり見分ける必要があります。

偶然似ているコードをDRY原則で共通化してしまったら、可読性・保守性・柔軟性が損なわれてしまう。

Discussion