capsctrldays

2008-01-31 (木) [長年日記]

[Ruby] Writing Effective Ruby Code - Patterns(2)

続き

よくある条件を上にする

  • if や case では、よくある条件を上にする。

グローバル定数のアクセス最適化

  • 定数の参照はアクセスするたびに解決される(動的に変更される可能性があるから)
  • 定数は身近なスコープから解決していくので、 :: を明示的につけて呼び出すと安い

インスタンス変数にデータをキャッシュ

  • 何度も使うならインスタンス変数にする

クラス変数にデータをキャッシュ

  • ある程度のサイズだったらクラス変数にしてもいい

変数のキャッシュを効率的に

  • ||=

変数はnilで初期化されるよ

  • だよ

.nil?を使う

  • if x.nil? とかメソッド呼び出しするなら unless x でいい

nil? または empty? vs blank?

  • ActionPackが追加したblank?
  • x.blank? == (x.nil? || x.empty?)

まーでも、x.to_s == "" とかしちゃうよ(kdmsnr)

returnを使う

  • メソッドの最後の式を勝手にreturnしてくれる。
  • 1.8だとreturnつけるよりも速いけど、1.9だと直ってるよ。

returningの使用

  • ActiveSupportには returning メソッドがある
class Object
  def returning(value)
    yield(value)
    value
  end
  :
  • 何かの値とブロックを渡して評価して返ってこさせる

any?を使う

  • any?遅いよany?
  • 1.9だとString.any?はなくなってる

ブロックの引数

  • ブロックローカルとメソッドローカルの速さは1.8と1.9で逆転してる

平行代入

irb(main):001:0> a, b = 1, 2
=> [1, 2]
  • なので、パフォーマンスが問題となるところではあまり使わないほうがいいかも