記事情報殿堂入り

[初心者向け] RubyやRailsでリファクタリングに使えそうなイディオムとか便利メソッドとか

[初心者向け] RubyやRailsでリファクタリングに使えそうなイディオムとか便利メソッドとか

はじめに: 遠回りせずに「近道」を探すRubyやRailsを始めたばかりの人は、もっと短く書く方法や便利な標準ライブラリの存在を知らずに遠回りした書き方をしてしまいがちです。そこで、RubyやRails初心者の人によく見かける「遠回り(または車輪の再発明)」と、それを回避する「近道」をいろいろ集めてみました。2013.11.06 追記この投稿を書くに至った経...

更新日: 2016-12-16
記事の見出し
  • [初心者向け] RubyやRailsでリファクタリングに使えそうなイディオムとか便利メソッドとか
  • はじめに: 遠回りせずに「近道」を探す
  • 2013.11.06 追記
  • Ruby編
  • 後置ifで行数を減らす
  • if + notではなく、unlessを使う
  • 三項演算子を使って行数を減らす
  • 代入してからifで存在を確認、をまとめて書く
  • 子どものオブジェクトが存在する場合にのみ、そのプロパティやメソッドを呼び出して条件を確認する、をひとつのifで書く
  • メソッドの戻り値を返すときにreturnを使わない
  • 「初期化、プロパティセット、戻り値として返す」の代わりにObject#tapを使う
  • "+”ではなく"#{ }"で文字列を連結する
  • 複数行にわたる文字列はヒアドキュメントを使う
  • 定数はfreezeさせる
  • 文字列の場合
  • 配列の場合
  • 整数の場合
  • 配列やハッシュを初期化する際、最後の要素をあえてカンマ付きで書いておく
  • 配列を作るとき、[ ]の代わりに%w( )、%i( )を使う
  • 配列を順番に処理するとき、"object.method"の代わりに"&:method"を使う
  • nilか配列かを区別せず、Array( )で処理してしまう
  • 大きな数値を宣言する場合、"_"を入れて読みやすくする
  • 単純なgetterメソッドを定義する代わりに、attr_readerを使う
  • 要素の順番に意味がある配列は、同時に別々の変数で受け取る
  • 配列を連結するのに+ではなく、*(splat)を使う
  • nilだったら初期化、の代わりに ||= を使う
  • ハッシュのキーには文字列ではなくシンボルを使う
  • メソッド全体rescueの対象にするときはbegin/endを省く
  • Exceptionをrescueするのではなく、StandardErrorをrescueする
  • 一度rescueした例外をもう一度再raiseする
  • private 以下の行にクラスメソッドを定義して、privateなクラスメソッドを作ったと勘違いしない
  • privateメソッドはそのクラスでしか呼び出せない、と勘違いしない
  • size - 1ではなく、マイナスのインデックスで最後の文字や要素を指定する
  • 配列の便利なメソッドいろいろ
  • find: 最初に見つかったものを返す
  • select: 条件に合うものすべてを返す
  • count: 条件に合う要素の数を返す
  • map: ある配列から別の配列を作る
  • flat_map: mapの結果をネストしないフラットな配列として受け取る
  • compact: nil以外の要素を集める
  • any?: 最低でも1つ条件に合う要素があればtrueを返す
  • empty?: 1件もなければtrueを返す
  • first/last: 最初と最後の要素を返す
  • sample: 任意の要素を返す
  • each_with_index: eachでループしつつ、カウンタも同時に取得する
  • ループ処理系のメソッド + with_index: カウンタ付きで元のループ処理を実行する
  • join: 配列を1つの文字列として返す
  • max/max_by: 最大の要素を返す
  • each_with_object: ループを回しつつ、別のオブジェクトを組み立ててそれを返す
  • その他の情報源
  • 英語の文法や品詞を意識する
  • 配列の変数名や配列を返すメソッド名は原則複数形にする
  • プロパティや変数名、クラス名は原則名詞や形容詞に、何かを操作するメソッドは原則動詞にする
  • Rails編
  • nilチェックの代わりにObject#try(:method_name)を使う
  • 「nil、もしくは空っぽい値」のチェックにblank?/present?を使う
  • 「空なら別の値を代入」の代わりにpresenceを使う
  • 存在の有無を確認する場合はblank?/present?を積極的に使う
  • 文字列の存在チェックはnil?ではなく、blank?を積極的に使う
  • ロジックではなく、クエリでフィルタリングする
  • mapではなく、pluckを使う
  • tap の代わりに new + ブロックを使う
  • Railsにおけるタイムゾーンの扱いを理解する
  • 日付や日時の便利メソッドを活用する
  • システム日付から見た昨日/明日を求める
  • システム日時から見たxx年前/後、xxヶ月前/後、xx週間前/後、xx日前/後、etcを求める
  • 特定の日付/日時から見た昨日/明日、先週/来週、xx日前/後、etcを求める
  • ある日付/日時から見た始まりと終わりの日付/日時を求める
  • 1日の初めから終わりまで、月の初めから終わりまで、といった範囲を求める
  • ある日付から見た先週/来週のxx曜日を求める
  • その他の情報源
  • 語形やフォーマットを変える (2013.11.14追記)
  • その他の情報源
  • 余分なスペースや改行を取り除く (2013.11.14追記)
  • まとめ: 良いコードを書くために
  • 魚ではなく、「魚の釣り方」を覚える
  • チーム内でコードレビューをする
  • おまけ: トリビア的なテクニック
  • 「1文字」を表すのに「?+文字」を使う
  • 配列を順番に処理するとき、直接メソッドを呼ぶ代わりに"&method(:name)"を使う
  • 配列を順番に処理するとき、ブロックを直接書く代わりにlambdaを使う
  • 何が何でもtrueかfalseで条件分岐させたいとき、!!を使う
テックブログ情報
[初心者向け] RubyやRailsでリファクタリングに使えそうなイディオムとか便利メソッドとか
ブログ株式会社ソニックガーデン - Qiita
ブログ概要「お客様に無駄遣いをさせない受託開発」と「習慣を変えるソフトウェアのサービス」に取り組んでいるソフトウェア企業
QiitaQiita::sonicgarden
会社名株式会社ソニックガーデン
会社概要