無駄なコードは本当にないですか...?
RoRをさわり始めて9ヶ月ほど経ちました。未だによくわからないことがいっぱいで、自分がプロダクトのあちこちに無駄なコードをばらまいてしまっていることに最近やっと気付き始めた模様です。ちょっとしたことだとすぐ忘れてまた同じことを繰り返してしまうかもしれないので、気づいたことはメモっておこうと思います。
今回の「無駄」
controllerにてstatusを変更するとき
「もしHogeがbarじゃなかったらbarに変更」
の「もしHogeがbarじゃなかったら」が無駄!
環境
Ruby: 2.2.3
Rails: 4.2.0
gem enum_help: 0.0.16, 0.0.15
思うがままに書いてみる
とりあえず、何も考えずに「もしHogeがbarじゃなかったらbarに変更」できるように書きました。
model↓
# == Schema Information
# Table name: hoges
# id :integer not null, primary key
# status :integer default(0), not null
# created_at :datetime not null
# updated_at :datetime not null
class Hoge < ActiveRecord::Base
enum status: %i(foo bar)
end
controller↓
class HogesController < ApplicationController
#patch method
def bar
@hoge = Hoge.find(params[:id])
@hoge.bar! unless @hoge.bar?
e =>
redirect_to fugas_path, alert 'bar error'
end
end
どこが無駄??
...冗長なのはどこかというと、まさに冒頭で書いた通りで
unless @hoge.bar?
の部分。自分では全く気付かずただ「動くしロジック通りに表記してるから大丈夫でしょ」っていう感覚でプルリク出したら先輩から指摘されたポイントです。
「いや、でも、これ書かないと既にbarになってるものも更新しちゃって無駄なんでないの??」と思ったアナタ。僕と同じですね〜w(失礼)
Railsが発行したSQLを確認してみると...なんと、上の条件式を書いても書かなくても、SELECTが走って「hogeの中の、barじゃないヤツ」を取ってきてくれたのでした!ほぉ〜。なるほど〜。Rails優秀。しゅごい。
結論
「もしHogeがbarじゃなかったらbarに変更」という動作を実装するとき、条件式は書かなくてもいいということがわかりました。心もコードもちょっとスッキリしましたね!d( ̄  ̄)グッ
...まぁでも「もしHogeがfooだったらbarに変更」とかだとちゃんと条件書かなきゃいけないので、無駄が生じることって実はあんまりないのかもしれませんが...。