Rubyレビュー
Ruby文脈
文字列とシンボルの使い分け
変数のスコープを小さく保つ
ローカルスコープに書き換えることはできないか?
余計なreturnがないか
nilチェックを&で置き換える
obj && obj.method→obj&.method
ぼっち演算
nilチェックで述語メソッド使う
return hoge if nilable→return hoge if nilable.blank?
述語メソッドを使用した方が意図が明確で分かりやすい
unless hoge→if hoge.blank?
host = config[:host].presence || 'localhost'
取得できなければデフォルト
Option.getOrElseみたいなやつのruby版だな
真偽値を返すメソッドで!!を使用する
他のメソッドに応じてif文でnullチェックしている場合とか
多重代入でスッキリ
ブロックは引数として明示的に受け取る def メソッド(&hoge)
メソッドの引数を暗黙で受け取らない
if block_given?での判定がロジックの中にある場合は本当にそれでいいのか考える
hiroki.iconScalaみたいに意図的に暗黙的な引数を受け取る仕組みがある言語でのみ暗黙の引数を使ったメソッド設計を許可するようにする
キャッシュの実装で@hoge ||= ...を使うかどうか
dry
破壊的変更→非破壊的変更
文字列とシンボルとの使い分け
ハッシュのキー
Enum
メソッドの可読性を考慮してキーワード引数
unless obj1.blank? || obj2.blank? →if obj1.present? && obj2.present?
ド・モルガンの法則でifに書き換えるべき
「じゃないなら」って時点で認識しずらいのにor条件も加わるとパッと見理解できない
unless !obj1.blank?→if obj1.blank?
二重否定書くな!
!否定を使うのではなくて、blank? / present?を使う
否定形よりも肯定形の方が読みやすい
ただし、コードの意図的に否定形なドメインロジックを表したいなら積極的に!否定形を使用する
分岐と変数束縛を同時に行っている部分はパターンマッチで置き換える
ヒアドキュメントとかでSQLを書いている時にログ出力で改行されたくない場合は String#squish を使用する
Rails文脈
コントローラーにロジックが入っている場合はなくせないか考える
モデルの責務について考える
キャッシュで問題ないのか?reloadを検討する
検索条件ではプレースホルダーステートメントを利用する
DB永続化するタイミングで問題がなさそうか
更新しない部分ではreadonlyなActiveRecordにする
null制約、unique制約などがアプリケーションの動作と矛盾していないこと
RSpec
コールバックでのデータ作成は不必要な時に呼び出されないようにトレイトの中で行う