RrailsのソースのActiveSupport::Inflectorあたりを覗いた

ソースコードの整理

Railsのソースには、クラスだけじゃなくてモジュールに関数を組み込むのをよく見かけるのだけど、 golangのパッケージ的な感じで、複数のファイルにまたがって整理されたりしていた。クラス毎、モジュール毎という考えではなく、機能毎的な雰囲気。 普段このような整理はしないので、うっかり見落とすところだった。

rails/activesupport/lib/active_support/inflector at master · rails/rails · GitHub

クラス単位で整理したソースを基本書いてしまうんだけど、こういう整理の仕方もできるといいんでしょうねぇ。 メンテ力がないと酷い感じになる可能性も、予想されますけど、、、(どこに何がわかりづらくなる)

ActiveSupport::Inflectorの使い方

ActiveSupport::Inflectorを直接使うことはアプリ開発者側は基本なくて、String を拡張して使えるように提供されている。

rails/inflections.rb at master · rails/rails · GitHub

irb(main):001:0> "i_love_you".camelize
=> "ILoveYou"
irb(main):003:0> "i_love_you".dasherize
=> "i-love-you"
irb(main):004:0> "dog".pluralize
=> "dogs"

こんな感じで使える。

Concurrent::Map

rails/inflections.rb at master · rails/rails · GitHub

モジュール変数に、Concurrent::Map.new というオブジェクトに変数を格納していってる。

実は一番最初にrubyを触ったのが、マルチスレッドを必要とするバックエンドシステムのデーモンを作ることだったので、 スレッドセーフの処理が必要だったのが、Mutex を利用してlock的なソースを書いて実装していた。 Concurrent::Map を使ってもよかったかもですね。