1. ホーム
  2. スクリプト・コラム
  3. ルビートピックス

Rubyのモジュールに関する基礎知識

2022-02-03 08:37:34

モジュールはクラスと非常によく似ており、インスタンス化できないクラスと表現することができます"quot;。ClassクラスはModuleクラスのサブクラスなので、class = module + instantiation capability"と表現した方がよいでしょう。

モジュールは具体的にどのようなことに使われるのですか?モジュールには大きく分けて2つの種類があります。ミックスインと名前空間です。

ミックスインとは、実は多重継承を制限したものです。継承関係は、実際には特定のクラスに多少の "embellishment" を許容するために作られています。実際、ミックスインという言葉は、アイスクリームの上にクッキーやナッツを乗せるという発想からきています。

多重継承の仕組みが引き起こす問題は、オブジェクト指向設計の歴史においてよく知られている。そのため、現代の多くのオブジェクト指向設計言語は、Rubyが採用している単一継承のアプローチのみをサポートしています。

しかし、多重継承には切り離せない魅力があります。そこでRubyはMix-inを採用することで、多重継承のメリットの多くを導入しています。

一度に複数のクラスを継承するクラスは、オブジェクト指向の設計において多くの問題を引き起こしやすい。そこで、Rubyでは以下のような制限を加えている。

1. 継承できるクラスは1つだけ

2. いわゆる "クラスっぽいけどクラスっぽくない" モジュールを複数継承することができる

また、Rubyでは、"モジュールをクラスに追加する動作"をincludeと呼びます。

モジュールのもう一つの機能は、名前空間を提供することです。

大規模なプログラム開発では、ネーミングの衝突の問題がしばしば発生する。例えば、読者はプログラム中にServiceというクラスを作る必要があるが、Serviceという名前はすでにプログラムライブラリで使われており、命名上の競合が発生する。

最近の多くのプログラミング言語では、名前の衝突の問題を避けるために、基本的に名前空間やパッケージが用意されています。異なる名前空間に存在するサービスクラスは、同じクラス名であっても異なるオブジェクトとして扱われます。

Rubyでは、このような名前空間を提供するために、モジュールを利用することが一般的である。

class Service; end
module Library
  class Service; end
end


 一番最初のServiceクラスはTop Levelネームスペースに属し、それ以降のServiceクラスはLibraryモジュールに属します。

これは、実際には、Top LevelモジュールとLibraryモジュールでそれぞれ定義されたServiceという名前の定数です(クラス名は実際にはクラスオブジェクトを指す定数です)。

そのため、あたかも定数であるかのように使用される。

Service for ::Service #Top Level
Service for Library::Service #Library