rubyオブジェクト指向(5)モジュール

rubyのモジュールは、オブジェクト間の横断的共通処理をまとめる機能です。どこからでも呼ばれる共通処理の置き場所と考えていいです。

★ミックスイン
クラスでは継承をサポートして、1つの親クラスを継承して複数の子クラスを作成することが出来ます。これによって同じような機能を持つクラスを別々にゼロから作成する手間を省きます。
ただこの継承は同類の上下関係を持ったクラス間で行うもので、別の異なった種類のクラスが継承によって共通化する部分を一箇所に持たせることが相応しくないとき、その共通となる機能をモジュールとして定義し、各クラスにインクルードして利用(これをミックスインと言います)します。
ミックスインすることでオブジェクトの独立性を高めます。

モジュールは次のような書き方です。

module モジュール名 
  ・・ここにクラスやメソッドを書く・・ 
end

モジュールの具体例は、

module Heikin
  def heikin(x, y)
    (x + y) / 2 
  end
end
class Test
  #平均を計算するメソッドをインクルードして機能を追加することをミックスインという
  include Heikin
  def dispHeikin(x, y)
    kekka = heikin(x, y)
    puts("#{x} and #{y} : avg = #{kekka}")
  end 
end
test = Test.new 
test.dispHeikin(10, 8)

平均を計算するメソッドが属するモジュールをincludeし、いろんなところから呼び出します。

例えばログ処理などがモジュールに入れるメソッドとして相応しいです。ログ処理はどのクラスのどのメソッドでも使いますから。

また、こんなミックスイン(機能追加)もできます。
既成のStringオブジェクトに対して空文字のときに"???"を返す独自のメソッドを追加してみましょう。

module Dokuji
  def what
    self == "" ? "???" : self
  end
end
s = ""
s.extend(Dokuji)
s.what

これによって変数sが再代入されない限りs.whatでsの内容が空のときは"???"が返ってきます。Stringオブジェクトの機能を拡張したことになります。

★名前空間としてのモジュールの役割
モジュールはその定義が所属を示すため、モジュール内に書いたクラスは

モジュール名::クラス名

と言うようなコロン(:)2つの区切りで属している場所をパスのように階層構造で持たせられます。

module Amod
  class Acls
    def aa
      puts "aa"
    end
  end
end
module Bmod
  class Acls
    def aa
      puts "bb"
    end
  end
end
a = Amod::Acls.new
a.aa
b = Bmod::Acls.new
b.aa

上の例のようにAmodとBmodのモジュール内でAclsと言う同じ名前を持つクラスを定義してもモジュール名を上位階層として区別できるのです。

この記事が気に入ったらサポートをしてみませんか?