【Ruby】クラスの書き方と使い方の基本
開発環境
- Ruby version: ruby 3.1.2
Rubyのクラス(class)とは
Rubyのクラス(class)とは、オブジェクトの設計図に相当するものです。 クラス(class)を定義して関連するデータやメソッドをクラス内にまとめることにより、コードをより効果的に構造化することができるだけでなく、再利用可能なコードを作成しやすくなります。 公式リファレンス:https://docs.ruby-lang.org/ja/latest/class/Class.html
Rubyのクラス(class)の書き方
Rubyのクラス(class)の書き方をご紹介します。
1# クラスの定義 2class クラス名 3 def インスタンスメソッド名 4 実行したい処理 5 end 6end 7 8# インスタンスの生成 9変数名 = クラス名.new() 10 11# インスタンスメソッドの実行 12変数名.インスタンスメソッド名
Rubyのクラスは「class」から始まり「end」で終わりとなります。 クラスからオブジェクトを作成するためには「newメソッド」を使用してインスタンスを生成し、生成したインスタンスに対してドット(.)の後にインスタンスメソッド名を記述することでインスタンスメソッドを実行することができます。
Rubyのクラスの命名規則
Rubyのクラスの命名規則にはいくつかルールがあります。
- 英文字の大文字で始める
- 2単語以上の場合はキャメルケース(各単語の先頭を大文字にして区別する)にする
英文字の小文字や2単語以上の場はスネークケース(各単語をアンダースコアで連結する)にすることもできますが、クラス名はクラスを識別するために英文字の大文字でキャメルケースで記述されることが一般的です。
Rubyのメソッド名の慣習
Rubyのメソッド名にはいくつか慣習があります。
- 真偽値を返すメソッドには「?」をつけることが多い
- 破壊的なメソッドには「!」をつけることが多い
また、メソッド名は「動詞のみ」または「動詞 + 目的語」で命名することにより、さらに可読性を高めることができます。
Rubyのメソッドの使い方
Rubyのメソッドのよくあるパターンをサンプルコードを用いて使い方の解説をしていきます。
Rubyのクラスでインスタンスメソッドを実行するパターン
Rubyのクラスでインスタンスメソッドを実行するパターンです。
1# メソッドの定義 2class Person 3 def info(name, age, gender) 4 "#{name}さんは#{age}歳の#{gender}です。" 5 end 6end 7 8# インスタンスの生成 9person = Person.new() 10 11# インスタンスメソッドの実行 12info = person.info("山田太郎", 30, "男性") 13 14# インスタンスメソッドの実行結果を出力 15puts(info) 16 17# => 山田太郎さんは30歳の男性です。
インスタンスメソッドは、クラスのインスタンス(オブジェクト)に対して呼び出されるメソッドです。 インスタンスメソッドは通常、オブジェクトの状態を変更するための操作や、オブジェクトの情報を取得するための操作などに使用されます。 また、インスタンスメソッド内では、そのインスタンスに関連するインスタンス変数(@変数名)にアクセスできます。 サンプルコードでは、変数「person」には生成されたインスタンスが代入されており、インスタンスが代入された変数「person」に対してドット(.)の後にインスタンスメソッド名を記述することにより、「Personクラス」の「infoメソッド」を実行しています。
Rubyのクラスでイニシャライズメソッドを実行するパターン
Rubyのクラスでイニシャライズメソッドを実行するパターンです。
1# メソッドの定義 2class Person 3 def initialize(name, age, gender) 4 @name = name 5 @age = age 6 @gender = gender 7 end 8 9 def info 10 "#{@name}さんは#{@age}歳の#{@gender}です。" 11 end 12end 13 14# インスタンスの生成 15person = Person.new("山田太郎", 30, "男性") 16 17# インスタンスメソッドの実行 18info = person.info() 19 20# インスタンスメソッドの実行結果を出力 21puts(info) 22 23# => 山田太郎さんは30歳の男性です。
イニシャライズメソッドは、新しいオブジェクトが生成される際に自動的に呼び出されます。 オブジェクトを生成する際に、必要な情報や初期値を提供するための手段として使用されることが多いため、オブジェクトの初期化を行うのに適しています。 サンプルコードでは、「Personクラス」を「newメソッド」でインスタンス生成する際に「initializeメソッド」に値を渡し、インスタンス変数に値がそれぞれ代入されてオブジェクトの初期化をしています。
Rubyのクラスを継承するパターン
Rubyのクラスを継承するパターンです。
1# メソッドの定義 2class Person 3 def initialize(name, age, gender) 4 @name = name 5 @age = age 6 @gender = gender 7 end 8 9 def info 10 "#{@name}さんは#{@age}歳の#{@gender}です。" 11 end 12end 13 14# クラスの継承 15class User < Person 16 17end 18 19class Admin < Person 20 21end 22 23# インスタンスの生成 24user = User.new("山田太郎", 30, "男性") 25admin = Admin.new("鈴木一郎", 40, "男性") 26 27# インスタンスメソッドの実行 28user_info = user.info() 29admin_info = admin.info() 30 31# インスタンスメソッドの実行結果を出力 32puts(user_info) 33# => 山田太郎さんは30歳の男性です。 34puts(admin_info) 35# => 鈴木一郎さんは40歳の男性です。
スーパークラス(親クラス)が持つプロパティやメソッドをサブクラス(子クラス)が継承することで、同じ機能やデータを複数のクラスで再利用できます。 似たような機能を持つクラスを新たに作成する際に、ゼロからコードを書く必要がなくなるだけでなく、共通の基盤となるクラスを定義できるためコードの一貫性と統一性を保つことができます。 また、サブクラスで新しい機能を追加できるため、アプリケーションの要件が変更された際にも容易に対応できる拡張性が高くなります。 サンプルコードでは、親クラスの「Person」から子クラスの「User」と「Admin」へ継承しているため、共通のイニシャライズメソッドを使用することができます。
Rubyのクラスでオーバーライドするパターン
Rubyのクラスでオーバーライドするパターンです。
1# メソッドの定義 2class Person 3 def initialize(name, age, gender) 4 @name = name 5 @age = age 6 @gender = gender 7 end 8 9 def info 10 "#{@name}さんは#{@age}歳の#{@gender}です。" 11 end 12end 13 14# クラスの継承 15class User < Person 16 def info 17 "ユーザーの#{@name}さんは#{@age}歳の#{@gender}です。" 18 end 19end 20 21class Admin < Person 22 def info 23 "管理者の#{@name}さんは#{@age}歳の#{@gender}です。" 24 end 25end 26 27# インスタンスの生成 28person = Person.new("佐藤大輔", 35, "男性") 29user = User.new("山田太郎", 30, "男性") 30admin = Admin.new("鈴木一郎", 40, "男性") 31 32# インスタンスメソッドの実行 33person_info = person.info() 34user_info = user.info() 35admin_info = admin.info() 36 37# インスタンスメソッドの実行結果を出力 38puts(person_info) 39# => 佐藤大輔さんは35歳の男性です。 40puts(user_info) 41# => ユーザーの山田太郎さんは30歳の男性です。 42puts(admin_info) 43# => 管理者のの鈴木一郎さんは40歳の男性です。
スーパークラス(親クラス)で定義されているメソッドをサブクラス(子クラス)で再定義することオーバーライドといいます。 サンプルコードでは、親クラスの「Person」から子クラスの「User」と「Admin」へ継承しているため、どちらも「infoメソッド」がありますが、子クラス側でユーザーと管理者に適した出力結果になるように上書きをしています。
おわりに
Rubyのクラスの使い方を解説してきました。 関連した処理をクラスにまとめることにより、コードの再利用がしやすくなり、コードの一貫性や統一性、拡張性がかなり高くなります。 オブジェクト指向プログラミングにおいてクラスの概念はとても重要なポイントになるため、最初は難しいかもしれませんがしっかりとクラスを使いこなしていきましょう。