はじめに
現在、railsを使う現場で働いてますが、コードレビューでうけた指摘を定着し、記憶に残すために投稿します!
【結論】ガード節を使った書き方
要件
ある特定のユーザー名param[:name]
が渡される。
-
users
テーブルに情報がある場合
さらにpurchases
テーブルを検索し、当該ユーザーの購入記録を取得する。 -
users
テーブルに情報がない場合
処理を終了する。
ガード節を使わない書き方
def index
if param[:name].present?
@user = User.find_by(user_name: param[:name])
if @user.present?
@purchases = Purchase.find_by(user_id: @user.id)
if @purchases.present?
# 購入記録がある場合の処理
else
# 購入記録がない場合の処理
end
else
return
end
end
end
ガード節を使う書き方
※ 学習のため、あえてif
とunless
どちらも使っています。
def index
return if param[:name].blank?
@user = User.find_by(user_name: param[:name])
return unless @user.present?
@purchases = Purchase.find_by(user_id: @user.id)
if @purchases.present?
# 購入記録がある場合の処理
else
# 購入記録がない場合の処理
end
end
メリット
上記の例でいうと、メインの処理となるのはユーザーの購入データの取得と結果に応じた処理の部分。
エラーなどを防ぐためにパラメータやデータの存在の有無を確認する処理をはさむことは多いがこれらはメインの処理でないし、データが存在しない場合は先の処理を行わない仕様となるはずである。
ガード節を用いて早期リターンを行うことで
- 不要な処理を行うことがなくなる。しかもそれが視覚的に伝わる。
- ifの重ねがけによるネストが軽減される。
参考
https://zenn.dev/adverdest/articles/16a698200fd872
https://zenn.dev/kingdom0927/articles/2b9d8ec1becf8b