みなさんはプログライング言語Rubyの特有の機能。「module(モジュール)」について、どの程度理解しているだろうか?
私は勉強を始めた当初、クラスとモジュールで混乱した印象が強いです。
二つとも同じような概念ですし、似ている点と異なる点が整理できていなかったと振り返っています。
そこで今回は、自分の知識の整理とみなさんとの知識の共有ということで、モジュールについてまとめていこうと思います。
似ている点や異なる点を知るためには、そもそもモジュールというものの特徴・使い方を抑えなくてはいけないと思います。
したがって、モジュールの特徴的な機能である「Mix-in」と「名前空間の提供」を特に力を入れて書いていこうと思います。
Module(モジュール)とは?
Module(モジュール)とは、オブジェクト指向プログラミング言語Rubyの特徴的な概念の一つです。
Class(クラス)に同じようなメソッドをまとめて他の場所から呼び出したい時、クラスを継承をして使おうと思います。しかしクラスの継承は一つのクラスしか行えないです。
そんな時モジュールのMix-inを使うと、複数のクラスの共有する機能を使うことができるようになるのです。
また、規模の大きなプログラムになる程、同じメソッド名などが出てきて衝突する可能性が高くなるものです。
そんな時、モジュールを使うことで衝突を回避することができるのです。
この機能を 「名前空間の提供」と言います。
このようなものが、モジュールの存在意義になると思います。
もちろん、クラスと同様に定数やメソッドを定義することができます。
クラスとの違いは、「クラスを継承することができない点」と「インスタンスを生成することができない点」です。
Mix-in
「Module(モジュール)とは?」で紹介したように、 モジュールは多重継承を可能にします。
その時に使われるのが、「include」と「extend」です。
両者はとても似ているもので、中級者でもちょっと混同している人がいると思います。
したがって、しっかり違いを確認していきたいと思います。
Mix-inは実際にコードを見ながらの方が、理解できると思うのでコードを載せていきます。
上記のように、includeとextendを使うとMix-inができるようになるのと同時に、エラーになるパターンのコードも書いてみました。
- includeは、クラスのインスタンスメソッドとして取り込む
- extendは、対象のオブジェクトのみに機能追加できる
includeの方は、なんとなく直感的にわかるかもしれませんが、extendの方はちょっと難しい概念ですよね。
extendという言葉通り、「拡張する」という意味を考えてみると今回拡張する対象は、TestBというクラスオブジェクト。
今回は機能を追加する対象がクラスオブジェクトなので、helloメソッドはクラスメソッドとなり、TestBにしか機能が反映しないということになります。
やっぱりちょっと複雑ですかね。。。orz
名前空間の提供
名前空間の提供も「Module(モジュール)とは?」で紹介した通りの機能になります。
こちらも実際にコードを見ながらの方が理解しやすいと思うので、コードを見ていきましょう。
このようにモジュールを使うことで、新たな名前空間を提供することが可能になります。
まとめ
今回はモジュールについて説明してきましたが、いかがだったでしょうか?
私が初学者だった時、苦戦したのがモジュールだったので過去の自分に向けるように書いてみました。
この記事を読んでくださったみなさんが、少しでもRubyのモジュールについて理解が進んでいただけたら、とても嬉しいです。
今はまだ理解できない部分がある方でも、色々なコードを書いてみることで、さらに知識が深まると自然とわかるようになると思います。
コメントを残す