Rubyのモジュールに関するいくつかの基礎知識

1411 ワード

モジュールはクラスに似ており、「インスタンス化できないクラス」とも言える.ClassクラスはModuleクラスのサブクラスなので、「クラス=モジュール+インスタンス化能力」と言った方が良いかもしれません.
モジュールとは、一体何のために使われているのでしょうか.その役割には主にMix-inとネーミングスペースの2つがあります.
Mix-inは実際には制限された多重継承である.実際に作られた継承関係を利用して、いくつかのクラスを「飾る」目的を実現することができます.実際、Mix-inという言い方はアイスクリームの上にあるビスケットやナッツから来ています.
オブジェクト向け設計の歴史において,多重継承メカニズムによる問題はすでに知られている.したがって,多くの現代のオブジェクト向け設計言語は単一継承方式のみをサポートしている.Rubyはこの方式を採用しています.
しかし、多重継承メカニズムには切り離せない魅力もある.したがってRubyはMix−in方式を採用することによって多くの多重継承の利点を導入した.
1つのクラスが複数のクラスを同時に継承すると、オブジェクト向けの設計に多くの問題が発生しやすくなります.そのため、Rubyには以下の制限が加えられています.
1、1つのクラスしか継承できない
2、いわゆる「クラスではあるがクラスではない」という複数のモジュールを継承できる
またRubyは「クラスにモジュールを入れる」動作をincludeと呼ぶ.
モジュールのもう一つの機能は、ネーミングスペースを提供することです.
大規模なプログラム開発では,ネーミング競合の問題がしばしば発生する.たとえば、読者はプログラムでServiceというクラスを作成する必要がありますが、Serviceという名前はライブラリで使用されています.これがネーミング競合の問題です.
多くの現代のプログラミング言語では、ネーミング競合の問題を回避するために、基本的にネーミングスペースやパッケージの機能が提供されています.異なるネーミングスペースに存在するサービスクラスはクラス名は同じですが、異なるオブジェクトとして扱われます.
Rubyでは、通常、このようなネーミングスペースを提供するためにモジュールが利用されます. 

class Service; end
module Library
  class Service; end
end

最初のサービスクラスはTop Levelのネーミングスペースに属し、後のサービスクラスはLibraryモジュールに属します.
これは、Top LevelモジュールとLibraryモジュールでそれぞれServiceという定数(クラス名は実際にはclassオブジェクトを指す定数)が定義されています.
そのため、定数のように使用されます. 

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