[Rails5] Active Supportの概要をつかむ

こんにちは、hachi8833です。 今回は、Rails 5の広大なActive Support世界のおおまかな地図を知るための記事です。[Rails5] Railsの主要なライブラリ構成を先にご覧ください。 以下、特記ない限りRails 5を対象とします。 Active Supportとは Active Supportの位置づけ Active Supportは、数値や日付や文字列などさまざまなライブラリの集まりです。Railsの広い範囲で共有されている重要なものもあれば、ちょっとした便利メソッド的なものもあります。こうした区分はよくmisc(miscellaneous)と名付けられますが、Railsではおそらく命名統一のためにあえて「Active Support」と呼んでいるのでしょう。 その中でCore Extensions(コア拡張機能)と呼ばれるものの多くは、Railsで使うためにRubyの標準ライブラリに含まれるクラスを拡張しています。 その他に、Active Recordほど大きくないもの、たとえば国際化(i18n)のライブラリもActive Supportに置かれています。 Active SupportはRails開発者が直接呼び出すこともあれば、Railsの他のライブラリで使われることもあります。 また、Rails以外のソフトウェアでも使いたくなるようなメソッドも多数見当たります。そのためか、最近Active SupportのメソッドがRubyの標準ライブラリに昇格する例をちょくちょく見かけます(参考: Enumerable#sum)。 Rails以外でActive Supportを使う 実際、たまにRailsを離れて純粋なRubyプログラムやpryを触っていると、欲しいメソッドがActive Supportにしかないことに気付いてrequire ‘active_support/core_ext/object/blank’などと追加することがよくあります。 そこそこ大きなRubyプログラムを書くなら、使いもしないライブラリは読み込まないようにしましょう。require ‘active_support/core_ext/object/blank’のように個別に指定すれば、Active Supportの他のライブラリは読み込まれません。 逆に、pryでちょっと使う程度なら特定のActive Supportをちまちま指定するより全部まとめてrequireする方が楽です。 Active Supportの機能の中にはauto_loadされるものも多いので、/allを指定してもその場でメモリにすべて読み込まれるのではなく、多くは使うときにはじめて読み込まれます。パフォーマンスチューニング中でもなければメモリを気にすることはそれほどないかもしれません。 ただし、Active Supportをすべてrequireする場合は、以下のように/allを付ける必要があります。 require ‘active_support/all’ # OK つい忘れがちですが、以下のように指定しても何も読み込まれません。 require ‘active_support’ # NG Active Supportの構成 Rails APIサイトで現時点のActive Supportの全ファイルを表示してみると、ファイルだけでかなりの数にのぼります。 とにかく広大かつ膨大です。これをいきなり把握するのは大変なので、全体像をつかむ手がかりを見つけましょう。Active Supportを大きく分けると、コア拡張機能とそれ以外のライブラリがあります。 分類 説明 コア拡張機能 Rubyの機能をRails用に拡張する(Railsでは必須) それ以外 上におさまらないもの(必須なものもある) Active Supportの構成を少し詳しく見てみると、そんなにきれいに分かれているとも限らないような印象を受けます。上の区分はあくまで目安としてご理解ください。 1. コア機能拡張 それでは、コア拡張機能の機能をもう少し分類してみましょう。 分類 例 全オブジェクトで使えるもの json.rb、try.rbなど モジュールやクラスの拡張用 module/aliasing.rb、class/attribute.rbなど 数値関連 integer/inflections.rb、big_decimal/conversions.rbなど 文字列関連 string/inquiry.rb、string/multibyte.rb 列挙/ハッシュ/配列関連 enumerable.rb、hash/indifferent_access.rb、array/access.rbなど 日付・時刻関連 date_and_time/zones.rb、time/calculations.rbなど その他 正規表現、ファイル、マーシャル、NameError/LoadError こうやって分類することで、だいぶ見通しがよくなりました。規模が小さいものはひとまず「その他」に押し込めてみました。 2. それ以外 続いてコア拡張以外のライブラリを見てみましょう。実はこちらの方がはるかにファイルがたくさんあります。 分類 例 キャッシュ cache/mem_cache_store.rb、cache/strategy/local_cache_middleware.rbなど 並列・並行処理(concurrency) concurrency/share_lock.rbなど 依存関係(dependencies) dependencies/autoload.rbなど 非推奨(deprecated)ライブラリ処理 deprecation/behaviors.rbなど 期間(duration) duration.rbなど 英単語の活用(inflection) inflector/inflections.rbなど JSON json/decoding.rbなど ログ log_subscriber.rb、logger_thread_safe_level.rbなど 暗号化・署名 message_encryptor.rb、message_verifier.rbなど マルチバイト multibyte/unicode.rbなど 通知・監視 notifications/instrumenter.rbなど 数値変換 number_helper/number_to_currency_converter.rb、number_helper/number_to_phone_converter.rbなど テスト testing/assertions.rb、testing/file_fixtures.rbなど 時間 time_with_zone.rb、values/time_zone.rbなど XML・Nokogiri xml_mini/libxml.rb、xml_mini/nokogirisax.rbなど その他 array_inquirer.rb, backtrace_cleaner.rb, benchmarkable.rb, , callbacks.rb, concern.rb, configurable.rb, , descendants_tracker.rb, evented_file_update_checker.rb, execution_wrapper.rb, executor.rb, file_update_checker.rb, gem_version.rb, gzip.rb, hash_with_indifferent_access.rb, i18n_railtie.rb, , key_generator.rb, lazy_load_hooks.rb, , option_merger.rb, ordered_hash.rb, ordered_options.rb, per_thread_registry.rb, proxy_object.rb, railtie.rb, reloader.rb, rescuable.rb, security_utils.rb, string_inquirer.rb, subscriber.rb, tagged_logging.rb, , version.rb 機能の整理は大変だということを痛感させられます。 今後について Active Supportの全体像がおおよそ見えたところで、この中から比較的取り組みやすそうな文字列系のコア機能拡張を今後順次見ていきたいと思います。 ご期待ください。 参考: Rails API: Active Support Railsガイド: Active Support コア機能拡張 関連記事 [Rails5] Railsの主要なライブラリ構成