
DRY WET コーディングについて
目次
概要
DRY と WET について解説します。
DRY とは
Don’t Repeat Yourself の略です。
同じコードは重複で書くべきではないということです。
例えば、以下のコードを例に見ていきましょう。
def get_cat_name(x):
return f"cat name is {x}"
def get_dog_name(x):
return f"dog name is {x}"
def get_bird_name(x):
return f"bird name is {x}"
上記のコードだと name is
が重複しています。DRY 実践するなら以下のように書きます。
def get_name_is(animal, name):
return f"{animal} name is {x}"
def get_cat_name(x):
return get_name_is("cat", x)
def get_dog_name(x):
return get_name_is("dog", x)
def get_bird_name(x):
return get_name_is("bird", x)
命名を name is
ではなく、 is called
にしたい場合は get_name_is
を変更すれば良いです。
メリット
-
メンテがしやすい あらゆるところに行くことなく、一箇所で変更を適用することができる
-
読みやすい 一度、理解すれば後は全体のコードを見た時に、同じ処理だと認識できる
デメリット
- 他の処理に対して予測し得ない変更を起こすことになる(影響範囲が大の可能性)
WET とは
Write Everything Twice です。
同じコードは重複して書くことです。
上記の逆です、
メリット
- 処理が独立しているため、他の実装箇所に影響しない・しにくい
デメリット
- 重複した修正が必要
- 場合に読みにくさが生じる
必ず DRY であるべき?
ここまで DRY, WET について解説しました。
よく DRY を強く推奨する記事は見かけるかと思います。
だけど、必ずしも DRY であるべきあかというと、答えは No です。
DRY だと、確かに保守性のメリットはそれなりにありますが、やりすぎると特定の関数が大きな影響範囲を持つ可能性があります。
また、アーキテクチャも何も考えないで、ただ DRY 実装すると、ただのパスタ化したコード集になります。
どの時に?
では、どんな時がいいでしょうか。以下、自分なりに考えた結論です。
- DRY: 抽象化して、2度と変更を加えない時
- WET: 抽象化して、後に変更加わる可能性がある時
アーキテクチャが決まっている場合は以下のように考えます。
ステークホルダー(エンティティ・データベース)が以下の場合は以下のように DRY, WET と考えます。
- DRY: 複数存在しない時
- WET: 複数存在する時
他にもあルカもしれませんが、上記がよく考える基準です。
まとめ
以上が、WET と DRY についての解説でした。
また、 DRY は必ずしも正解ではない、場合によって WET も必要だと書きました。
今後とも参考にしていただけると幸いです。