😿
誤ったDRYには注意
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