はじめに
今回はオブジェクト指向でプログラミングを考える上でも大切になってくるモジュールについてまとめていきたいと思います。
初学者ゆえに解釈違いな部分などもあるかもしれないですが、何卒よろしくお願いいたします!
モジュールとは何か
モジュールを使うと、メソッドを共同利用できます。また、クラスにてモジュールをインクルードすることで、モジュールに定義したメソッドをあたかもクラス自身に定義されたメソッドとして使えるようにします。
クラスとの違いは何か
モジュールとクラスの違いは以下の2点が挙げられます。
・インスタンスが生成でき、モジュールはインスタンスが生成できない
・クラスは継承でき、モジュールは継承できない
モジュールを使うメリットは何か
メリットとしては、モジュールをクラスに組み込むことで、クラス定義にメソッドをコピー&ペーストしたのと同じようにモジュールのメソッドをクラスで利用できるようになることです。
これは、特定のクラスで再利用したいメソッドがあり、それを一カ所に集めておきたい場面で非常に便利です。
複数のクラスでメソッドを共同利用するには次の3つの手順を行います。
- モジュールを作る
- モジュールにメソッドを定義する。
- モジュールのメソッドをクラスで使う。
ホイップクリームのトッピングを例として考えていきます。
このような場面でモジュールを使うと、ドリンクでもケーキでもトッピングできる部品を作る事ができます。ホイップクリームをトッピングするメソッドを作り、メソッドを共同利用してみます。
それでは書いていきましょう。
1. モジュールを作る
まず初めにモジュールを作ります。ホイップクリームをトッピングするWhippedCreamという名前のモジュールにします。
module WhippedCream
end
ruby module.rb
(何も表示されません。)
module モジュール名
end
2. モジュールにメソッドを定義する
次にモジュールにメソッドを定義します。モジュールはクラスと同じようにメソッドを定義できます。引数や戻り値も同じように可能です。
WhippedCreamモジュールにインスタンスメソッドを定義してみましょう。
ここでは、ホイップクリームをトッピングるすことを想定したwhipped_creamメソッドを定義します。
module WhippedCream
def whipped_cream
@name += "ホイップクリーム"
end
end
ruby module.rb
(何も表示されません。)
module.rbを実行しても何も表示されないのは定義された上げではメソッドは実行されないからです。ここはクラスとの類似点ですね。
3. モジュールのメソッドをクラスで使う
それではモジュールを使用する側であるDrinkクラスを実装します。
class Drink
def initialize(name)
@name = name
end
def name
@name
end
end
drink = Drink.new("モカ")
puts drink.name
ruby module.rb
モカ
このDrinkクラスにて、WhippedCreamモジュールのwhipped_creamメソッドが使用でき、@nameの末尾に"ホイップクリーム"を加えるのがゴールです。
モジュールのメソッドをクラス使用できるようにするには、includeメソッドが必要です。
class クラス名
include モジュール名
end
module WhippedCream
def whipped_cream
@name += "ホイップクリーム"
end
end
class Drink
include WhippedCream
def initialize(name)
@name = name
end
def name
@name
end
end
drink = Drink.new("モカ")
drink.whipped_cream
puts drink.name
ruby module.rb
モカホイップクリーム
include WhippedCream
を実行すると、DrinkクラスのオブジェクトはモジュールWhippedCreamのメソッドであるwhipped_cream
が利用できるようになります。
そのためdrinkオブジェクトの@nameを表示すると、その前の行で追加されたwhipped_cream
メソッドが実行されるので、@nameは末尾にトッピングが追加された"モカホイップクリーム"となっています。
まとめ
最後に@nameの動きとこのプログラムの流れをもう一度整理しましょう。
- Drink.rewメソッドの引数で"モカ"が渡され@nameに代入される。
- ここで作られたDrinkクラスのオブジェクトは変数drinkに代入される。
- 次の行でdrinkオブジェクトのwhipped_creamメソッドが呼び出され、@nameの末尾に"ホイップクリーム"が追加されます。
- @nameを取得すると、"モカホイップクリーム"となっています。
最後に
結構Rubyの基礎学んでる時はスラスラ覚えられて楽しかったんですが、どうしてもクラスとかモジュールとか継承とか...etcの話になってくると、初学者にとって途端に難しくなるのでその点も踏まえて今回復習がてら書かせていただきました!
やはり記事に起こすことでササっと見直せますし、何がわかってなかったかが明確にされていいですね✨
今後もアウトプット中心の学習を心がけていきたいと思うのでどうぞ応援よろしくお願いいたします🙇
引用文献