DRY原則にはあまりこだわらないほうが良いという話
DRY原則はDon't Repeat Yourselfの略で要するに**「コードをコピペすな」**という意味なのは皆様ご承知おきとは思いますが、あまりこだわり過ぎも良くないという話。
コピペしないほうが良いとき
例えば以下のようなコードがあったとき
example.rb
def send_start_message()
member = getMember
put_message(message: 'Start!', to: member.id)
end
def send_finish_message()
member = getMember
put_message(message: 'Finish!', to: member.id)
end
send_start_message
とsend_finish_message
違いはmessage
の内容だけなので、そこだけ引数で渡した方がスッキリしますね。
example1.rb
def send_message(message)
member = get_member
put_message(message: message, to: member.id)
end
def send_start_message
send_message('Start!')
end
def send_finish_message
send_message('Finish!')
end
コピペしたほうが良いとき
ここで仕様変更が入って、以下のような要件が増えた場合に
- Start messageのときは、ログも出力
- Finish messageのときは、親IDにもmessageを送る
- Warning messageのときは、member.statusも更新
send_message
関数だけで解決すると以下のような感じでしょうか
example2.rb
def send_message(message: '', logging: false, do_send_parent: false, do_update_status: false)
logger(message) if logging
member = get_member
put_message(message: message, to: member.id)
put_message(message: message, to: member.parent_id) if do_send_parent
member.update_status if do_update_status
end
send_message
がいろんな役割を担い過ぎな気がしますね。
この程度なら問題ないですが、さらに仕様が増えていくとパラメータとif文が更に増えて可読性が大分落ちそうです。
そうなるくらいなら、ある程度はコピペしてしまったほうが可読性も高く、あとからの仕様変更も簡単にできたりします。
つまり
良い例が浮かばなくて、この例だとコピペしなくてもまだ良い感じに正規化できてしまうのですが、要するに一つのクラスや関数になんでもかんでもやらせてしまうと、読みにくいし追加の修正がしにくいから、マイクロサービス化するのが良いよねって話。