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

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

ご期待ください。

参考:

関連記事


CONTACT

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