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と言う同じ名前を持つクラスを定義してもモジュール名を上位階層として区別できるのです。
この記事が気に入ったらサポートをしてみませんか?