はじめに
Rubyでプログラミングをしていると、「クラス」と「モジュール」という2つの構造に出会うことが多いです。どちらもコードの整理や再利用に役立つものですが、それぞれ異なる役割を持っています。本記事では、クラスとモジュールの違いを実例を通して解説し、それらの使い分けについて学んでいきます。
クラスとは?
クラスは、オブジェクト指向プログラミングにおいて「物(オブジェクト)」を作り出すための設計図です。クラスを使ってオブジェクト(インスタンス)を生成し、そのオブジェクトに対して振る舞い(メソッド)を持たせることができます。
クラスの基本的な例
次に、クラスを使ったシンプルな例を見てみましょう。
class Animal
def initialize(name)
@name = name
end
def speak
"#{@name} says hello!"
end
end
dog = Animal.new("Dog")
puts dog.speak # => "Dog says hello!"
ポイント:
-
Animal
クラスを定義し、initialize
メソッドで名前をインスタンス変数に格納しています。 -
speak
メソッドは、インスタンスに対して呼び出され、動作します。 - クラスを使うことで、実際のデータを持つオブジェクトを生成し、そのオブジェクトに関連する動作を定義できます。
モジュールとは?
モジュールは、クラスとは異なり、インスタンスを生成することはできませんが、複数のクラスに共通する機能をまとめるために使われます。また、名前空間を提供する役割もあります。
モジュールの基本的な例
モジュールを使って、複数のクラスに共通の機能を提供する方法を見てみましょう。
module Walkable
def walk
"#{@name} is walking."
end
end
class Animal
include Walkable
def initialize(name)
@name = name
end
end
dog = Animal.new("Dog")
puts dog.walk # => "Dog is walking."
ポイント:
-
Walkable
モジュールを定義し、walk
メソッドを追加しています。 -
Animal
クラスにこのモジュールをinclude
することで、walk
メソッドをクラスに追加しています。 - モジュールはインスタンスを持たないため、クラスに機能をミックスインして共有します。
クラスとモジュールの違い
特徴 | クラス | モジュール |
---|---|---|
インスタンスの生成 | できる | できない |
メソッドの定義 | 可能 | 可能(ミックスインとして利用) |
継承 | 可能 | できない |
名前空間としての使用 | 使用不可 | 使用可能 |
1. インスタンス化できるかどうか
クラスはnew
メソッドを使ってインスタンスを生成できますが、モジュールはできません。クラスを使うことで実際のオブジェクトを生成し、そのオブジェクトが持つデータやメソッドを操作します。
dog = Animal.new("Dog") # クラスを使ってインスタンスを生成
puts dog.speak # => "Dog says hello!"
一方、モジュールはインスタンスを生成できないため、単独で機能を持つことはできません。モジュールはクラスに機能を追加するための仕組みです。
2. 継承 vs. ミックスイン
クラスは他のクラスを継承できますが、モジュールは継承できません。代わりに、モジュールはクラスにミックスインすることで、その機能を再利用します。
class Dog < Animal
def bark
"Woof!"
end
end
dog = Dog.new("Dog")
puts dog.speak # => "Dog says hello!"
puts dog.bark # => "Woof!"
このように、クラス同士は継承を通じて機能を引き継ぐことができます。一方、モジュールはミックスインとしてクラスに機能を追加します。
module Swimmable
def swim
"#{@name} is swimming."
end
end
class Fish
include Swimmable
def initialize(name)
@name = name
end
end
fish = Fish.new("Fish")
puts fish.swim # => "Fish is swimming."
3. 名前空間としての利用
モジュールは、名前空間を提供するためにも使われます。これにより、クラスやメソッド名が他のコードと衝突するのを防ぐことができます。
module Animals
class Dog
def speak
"Woof!"
end
end
class Cat
def speak
"Meow!"
end
end
end
dog = Animals::Dog.new
cat = Animals::Cat.new
puts dog.speak # => "Woof!"
puts cat.speak # => "Meow!"
ポイント:
- モジュールは、関連するクラスやメソッドをグループ化して、名前空間として機能します。
- これにより、例えば
Dog
クラスが他の場所で定義されていても、Animals::Dog
として別の意味で利用できます。
モジュールの別の使い方:拡張モジュール
モジュールは単に機能を共有するためだけでなく、extend
を使ってクラスメソッドを追加することもできます。
module Greetable
def greet
"Hello!"
end
end
class Person
extend Greetable
end
puts Person.greet # => "Hello!"
このように、extend
を使うとクラスメソッドとしてモジュールのメソッドを利用できます。これにより、インスタンスではなく、クラスそのものにメソッドを追加することができます。
まとめ
Rubyのクラスとモジュールには、明確な役割の違いがあります。クラスはオブジェクトを生成し、そのオブジェクトに振る舞いを持たせることができますが、モジュールは機能を共有するために使われます。クラスは継承を使って機能を拡張できますが、モジュールはミックスインを使ってクラスに機能を追加します。
これらを適切に使い分けることで、コードをより効率的かつ整理されたものにできます。モジュールを使って共通の機能を整理したり、名前空間として活用することで、Rubyの開発がさらにスムーズになるでしょう。
参考文献
Ruby 3.3 リファレンスマニュアル: Classクラス
Ruby 3.3 リファレンスマニュアル: Moduleクラス