0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Rubyのモジュールとクラスの違いを徹底解説!実例で学ぶ使い分け

Posted at

はじめに

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クラス

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?