【Ruby】モジュールとクラスの違いを理解しよう!

Rails

Rubyにおける重要な概念に「クラス」があると思います。クラスがあることによって、まとまりが作られ、可読性などが向上します。

クラスと似たような役割にモジュールというものがありました。クラスとモジュールは似たような役割ですが、全く同じものではありません。

今回は、Rubyのモジュールとクラスの違いについてわかりやすく解説します

キーワード:Ruby, モジュール, クラス

クラスとは?

そもそも、クラスとは何か復習していきましょう。

クラスは、オブジェクト指向プログラミング(OOP)における中心的な概念です。Rubyにおけるクラスは、オブジェクトの設計図のような役割を果たし、データやメソッドを定義します

クラスを使うことで、実際に動作するオブジェクトを生成し、そのオブジェクトに共通のメソッドやデータをまとめて管理できます。

クラスの特徴

・インスタンス化が可能
・継承が可能
・データとメソッドの組み合わせ

クラスの特徴として、上記の3つがあげられます。

Personという以下のクラスを例に解説します。

class Person
  def initialize(name, age)
    @name = name
    @age = age
  end

  def introduce
    "My name is #{@name} and I am #{@age} years old."
  end
end

person1 = Person.new("John", 30)
puts person1.introduce  # => "My name is John and I am 30 years old."
インスタンス化が可能

クラスを使ってオブジェクトを作成できます。例えば、Personというクラスを定義して、とある人を表すインスタンスを作ることが可能です。

Person.newとすることで、Personクラスのオブジェクトが生成できます。また、オブジェクトが新しく生成されたときに呼び出されるinitializeメソッドが定義されているため、引数も用意してあげます。

Person.new("john", 30)でインスタンス変数nameageにそれぞれ"John"30が代入された状態のオブジェクトが生成されました。

継承が可能

クラスは他のクラスを継承し、既存の機能を再利用することができます。子クラスは親クラスのメソッドや属性を受け継ぎつつ、独自の振る舞いを追加できます。

上記プログラムには継承に関する記述はありませんが、class 子クラス名 < 親クラス名で継承することができます。

データとメソッドの組み合わせ

クラスには、データ(インスタンス変数)と振る舞い(メソッド)を組み合わせて持たせることができます。これにより、個々のオブジェクトが固有の状態を持ちながらも、共通の機能を利用することが可能になります。

上記プログラムにおける、person1.introduceはintroduceメソッドを呼び出している記述になります。

オブジェクトを生成した際に、インスタンス変数である@name@ageに値を代入しました。これがintroduceメソッドによって、追加の文字列とともに出力されます。

モジュールとは?

次は、モジュールについて確認していきましょう!

モジュールはクラスとは異なり、インスタンス化できません。そう、これが大きな違いです!!

モジュールの主な目的は、メソッドや定数をまとめ、再利用可能なコードを提供することです。Rubyでは、モジュールには大きく分けて2つの主な用途があります。

・ミックスイン
・名前空間の衝突を避ける

では、それぞれについて説明します。

ミックスイン

モジュールをクラスに取り込む(includeまたはextend)ことで、クラスに追加の機能を付与します。共通の機能を複数のクラスで使いまわせる手法です。

例えば、「歩く」動作を表すWalkableモジュールを定義し、それを動物クラスに適用できます。

module Walkable
  def walk
    "I am walking."
  end
end

class Dog
  include Walkable
end

class Cat
  include Walkable
end

dog = Dog.new
puts dog.walk  # => "I am walking."

cat = Cat.new
puts cat.walk  # => "I am walking."
名前空間の衝突を避ける

モジュールを名前空間として利用すると、同じ名前のメソッドや定数が異なる場所で競合するのを防げます。

例えば、MathHelperモジュールを作成し、その中に数学的な定数やメソッドを定義できます。

module MathHelper
  PI = 3.1416

  def self.circle_area(radius)
    PI * radius ** 2
  end
end

puts MathHelper.circle_area(10)  # => 314.16

モジュールとクラスの違いについて

改めて、モジュールとクラスの違いについて確認しましょう。

項目クラスモジュール
インスタンス化可能不可能
継承可能できない(ミックスインで可能)
名前空間使うことができる主に名前空間として機能
用途オブジェクトの作成、データとメソッドの定義メソッドや定数の共有、名前空間の整理

使い分けはどうする?

クラスとモジュールの違いについて理解しました。では、その使い分けはどのようにすればよいでしょうか?

クラスを使う場合は、複数のインスタンスを作成する必要がある場合です。理由は、クラスはオブジェクトの作成ができ、その管理ができるからです。

あるお店の在庫管理システムを作ることを例に考えます。在庫管理ということは、商品が存在するはずです。商品にチーズケーキとショートケーキがあった場合、どちらも商品(あるいはケーキ)という概念であるはずです。しかし、ショートケーキとチーズケーキは同じではありません(当たり前)。

つまり、クラスが商品(またはケーキ)で、クラスのインスタンスがチーズケーキとショートケーキに対応します。

概念は同じだけど、その概念の中に別々の実体が存在しているときに、クラスを使いましょう。

一方、モジュールを使うときは、名前空間を整理したり、複数のクラスで共通の機能を再利用する際です

特定の機能(メソッドなど)を複数のクラスに柔軟に追加したい場合にモジュールを使うと便利です。モジュール内にあるメソッドを、一行の記述でクラスに追加できます。

まとめ

この記事のまとめ

Rubyのクラスとモジュールは、それぞれ異なる目的と役割を持っています。

クラスはオブジェクトを作成し、そのオブジェクトにデータとメソッドを結びつけるために使用されます

一方、モジュールは名前空間の整理や、コードの再利用を促進するために利用され、インスタンス化されることはありません

これらを理解しておくことで、プログラムの可読性や保守性を向上させ、効率的な開発を進めることが可能です!

最後まで読んでくださりありがとうございます。お疲れ様でした!

コメント

タイトルとURLをコピーしました