概要
原著者の許諾を得て翻訳・公開いたします。
- 英語記事: Ruby on Rails / Refactoring - speed up your app with frozen constants - Ruby on Rails and Stuff by Paweł Dąbrowski
- 原文公開日:
- 著者: Paweł Dąbrowsk
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』をどうぞお役立てください。