こんにちは、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の全体像がおおよそ見えたところで、この中から比較的取り組みやすそうな文字列系のコア機能拡張を今後順次見ていきたいと思います。
ご期待ください。