Tech Racho エンジニアの「?」を「!」に。
  • 開発

Rails tips: 定数をfreezeして高速化するリファクタリング(翻訳)

概要

原著者の許諾を得て翻訳・公開いたします。

Rails tips: 定数をfreezeして高速化するリファクタリング(翻訳)

国コードを1つ受け取って国名を返す、非常にシンプルなRubyメソッドで考えてみましょう。多くの人、特にRubyを始めて間もない方は以下のようなコードを書くでしょう。

class SampleClass
  def country_name(country_code:)
    mappings = {
      'us' => 'USA',
      'de' => 'Germany'
    }

    mappings[country_code]
  end
end

対応付けをメソッドの外に移動することで、コードがより読みやすくなります。または別のメソッドに切り出しても構いません。定数化しておくとさらによくなりますが、定数をfreezeしておけばメモリ使用量も少し節約できるので完璧です。

class SampleClass
  COUNTRY_CODES_MAPPINGS = {
    'us' => 'USA',
    'de' => 'Germany'
  }.freeze

  def country_name(country_code:)
    COUNTRY_CODES_MAPPINGS[country_code]
  end
end

定数をfreezeしないと値が変更されてしまう可能性がありますが、freezeすることで変更を防止できます(RuntimeErrorが表示されます)。一般に、freezeすることでメモリアロケーションが削減されるため、メモリ使用量を節約できます。

Ruby 2.2で興味深いのは、ハッシュのキーに使われる文字列リテラルが自動的にfreezeされる点です。

このトリックを教えてくれた同僚のDarekに感謝いたします。


RSpec & TDDの電子書籍を無料でダウンロード

もっと稼ぎたい方や会社をさらに発展させたい方へ: テスティングのスキルの重要性にお気づきでしょうか?テストを正しく書き始めることが、唯一のファーストステップです。無料でダウンロードいただける私の書籍『RSpec & Test Driven Developmentの無料ebook』をどうぞお役立てください。

関連記事

ベテランRubyistがPythonコードを5倍速くした話(翻訳)

Rubyのシンボルをなくせるか考えてみた(翻訳)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。