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)
でインスタンス変数name
とage
にそれぞれ"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のクラスとモジュールは、それぞれ異なる目的と役割を持っています。
クラスはオブジェクトを作成し、そのオブジェクトにデータとメソッドを結びつけるために使用されます。
一方、モジュールは名前空間の整理や、コードの再利用を促進するために利用され、インスタンス化されることはありません。
これらを理解しておくことで、プログラムの可読性や保守性を向上させ、効率的な開発を進めることが可能です!
最後まで読んでくださりありがとうございます。お疲れ様でした!
コメント