includeとextendその1

Rubyにはモジュールという機能があり、クラスの機能を分割、再利用できます。モジュールの機能をクラスに追加するにはincludeを使います。

module Fuga
    def execute
        puts "fuga"
    end
end

class Hoge
    include Fuga
end

hoge1 = Hoge.new
hoge1.execute

hoge2 = Hoge.new
hoge2.execute

これをミックスインといいます。モジュールはどのクラスにでも追加できます。

モジュールはクラスの前に宣言しなくてはなりません。Rubyのクラス宣言は実行文であるためです。コンパイル時のリンクも自動でやってくれるJavaのユーザは注意です。

インスタンス変数は以下のコードのようにモジュールとクラスどちら側からでもアクセスできます。しかし、特に意図がなければ、インスタンス変数をモジュール間で共有するのはお勧めできません。コードが非常に読みにくくなります。また、モジュールは他のモジュールやクラスから独立しているべきです。同一のインスタンス変数を使うということは、結合密度の高い機能であり、同一クラス、同一モジュールにまとめるべき機能です。

# これには注意して - インスタンス変数@aがモジュールとクラスに分かれている
module Fuga
    def a
        return @a
    end
end

class Hoge
    include Fuga
    def a=(val)
        @a = val
    end
end

追記:一律禁止するには根拠薄弱すぎるため削除