LoginSignup
1
1

More than 3 years have passed since last update.

コピペ駆動開発のススメ

Last updated at Posted at 2020-11-30

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_messagesend_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文が更に増えて可読性が大分落ちそうです。
そうなるくらいなら、ある程度はコピペしてしまったほうが可読性も高く、あとからの仕様変更も簡単にできたりします。

つまり

良い例が浮かばなくて、この例だとコピペしなくてもまだ良い感じに正規化できてしまうのですが、要するに一つのクラスや関数になんでもかんでもやらせてしまうと、読みにくいし追加の修正がしにくいから、マイクロサービス化するのが良いよねって話。

1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1