モジュールと名前空間

モジュールには名前空間を分けて、名前の衝突を防ぐ機能がある。

例えば、「ポイント履歴」と「活動履歴」という意味で2つのHistoryクラスが作成されたとする。

class History
 def initialize(payment, used_point, user_id)
    @payment = payment
    @used_point = used_point
    @user_id = user_id
 end
end
class History
 def initialize(action, user_id)
    @action = action
    @user_id = user_id
 end
end

この状態で、Historyクラスからインスタンスを生成しようにもどっちのHistoryなのか判断できない。そこで、moduleを使って名前空間を分ける。以下のようにすると、名前の衝突はなくなる。

module Point
   class History
     def initialize(payment, used_point, user_id)
       @payment = payment
       @used_point = used_point
       @user_id = user_id
     end
  end
end
module Action
   class History
     def initialize(action, user_id)
       @action = action
       @user_id = user_id
     end
  end
end

モジュールに属すクラスを生成するときは「モジュール名::クラス名」で生成。

Point::History.new(payment, 20, 101)
Action::History.new("buy", 101)

より大きなプロジェクトでは、単に衝突だけではなく、グループやカテゴリーを分けるのにも使われる。例えば以下は「ActiveRecordディレクトリのAssociationsディレクトリのAliasTrackerクラス」を意味している。

module ActiveRecord
   module Associations
      class AliasTracker
          ・・・・