クラスメソッドでインスタンスを作らずにメソッドを使おう

学習の目標

本章では、以下の内容を学習します。

  • クラスメソッドの概念と基本的な定義方法を理解する
  • インスタンスメソッドとクラスメソッドの違いを学ぶ
  • クラスメソッドの実用的な使い方を習得する
  • クラスメソッドを使ったファクトリーメソッドのパターンを理解する

はじめに

これまでの章では、クラスからインスタンスを作成し、そのインスタンスに対してメソッドを呼び出す方法を学んできました。これらのメソッドはインスタンスメソッドと呼ばれ、特定のインスタンスに対して動作します。

しかし、Rubyにはクラスメソッドという、インスタンスを作成せずに直接クラス自体から呼び出せるメソッドもあります。クラスメソッドは、インスタンスの個別の状態に依存しない処理や、新しいインスタンスを作成する処理などに便利です。

今回は、このクラスメソッドについて詳しく学んでいきましょう。

ファイルの準備

まずは、class_method.rbというファイルを作成しましょう。VS Codeで新しいファイルを作成し、これから書いていくコードを保存していきます。

クラスメソッドとインスタンスメソッドの違い

まずは、インスタンスメソッドとクラスメソッドの基本的な違いを見てみましょう。

class Character
# インスタンスメソッド
def hello
puts "こんにちは"
end
# クラスメソッド
def self.info
puts "これはRPGのキャラクタークラスです"
end
end
# インスタンスメソッドの使い方
hero = Character.new
hero.hello # こんにちは
# クラスメソッドの使い方
Character.info # これはRPGのキャラクタークラスです

上のコードでは、helloメソッドはインスタンスメソッド、infoメソッドはクラスメソッドとして定義しています。

クラスメソッドの定義方法

クラスメソッドを定義するには、メソッド名の前にself.をつけます。このselfは、クラス自身を指しています。

インスタンスメソッドとクラスメソッドの呼び出し方の違い

インスタンスメソッドとクラスメソッドの呼び出し方には明確な違いがあります。

  • インスタンスメソッド

    • newでインスタンスを作成してから使う
    • インスタンス名.メソッド名の形式で呼び出す
    • 例:hero.hello
  • クラスメソッド

    • インスタンスを作らずに直接クラスから呼び出せる
    • クラス名.メソッド名の形式で呼び出す
    • 例:Character.info

クラスメソッドは、特定のインスタンスに依存しない処理や、クラス全体に関わる機能を提供するのに適しています。

クラスメソッドの便利な使い方

クラスメソッドは、様々な場面で活用できますので、例を見ていきましょう。

ここでは、RPGのキャラクターを表すCharacterクラスを例に、クラスメソッドの使い方を説明します。

以下の例では、職業ごとに決まった設定のキャラクターを作成するためのメソッドをクラスメソッドとして定義しています。

class Character
def self.create_warrior
puts "戦士を作成します"
new("戦士", 200)
end
def self.create_wizard
puts "魔法使いを作成します"
new("魔法使い", 100)
end
def initialize(job, hp)
@job = job
@hp = hp
end
def status
puts "職業:#{@job}"
puts "HP:#{@hp}"
end
end
warrior = Character.create_warrior
warrior.status # 職業:戦士、HP:200と表示
wizard = Character.create_wizard
wizard.status # 職業:魔法使い、HP:100と表示

この例では、create_warriorcreate_wizardというクラスメソッドを定義しています。これらのメソッドは、それぞれ戦士と魔法使いのキャラクターを作成します。

仮に、クラスメソッドを定義していない場合、キャラクターの職業やHPを指定しながらインスタンスを作成する必要があります。

# クラスメソッドを使わない場合
class Character
def initialize(job, hp)
@job = job
@hp = hp
end
def status
puts "職業:#{@job}"
puts "HP:#{@hp}"
end
end
warrior = Character.new("戦士", 200)
wizard = Character.new("魔法使い", 100)

もちろんこれでもキャラクターを作成できますが、毎回職業やHPを指定する必要があります。これだと毎回同じようなコードを書くことになりますし、入力ミスの原因にもなります。

一方、クラスメソッドを使うことで、create_warriorcreate_wizardを呼び出すだけで、決まった設定のキャラクターを簡単に作成できます。

このように、クラスメソッドは特定のインスタンスに依存しない処理や、決まった設定でインスタンスを作成する処理などに便利です。ちなみに、このようにインスタンスを作成するためのクラスメソッドをファクトリーメソッドと呼ぶことがあります。

クラスメソッドの活用例

実際のプログラミングでは、クラスメソッドが活躍する場面がたくさんあります。

Ruby on Rails のプログラミングにおいてよく使われるクラスメソッドの例をいくつか挙げてみましょう。

日付や時間の処理

Rubyの標準ライブラリであるDateTimeクラスでは、現在の日付や時刻を取得するためのクラスメソッドが提供されています。

Ruby では require を使って標準ライブラリを読み込むことができますので、最初に読み込んでいます。

require 'date'
today = Date.today # 今日の日付
now = Time.now # 現在の時刻

上記の例では Date クラスの today メソッドと、Time クラスの now メソッドを使って、今日の日付と現在の時刻を取得しています。

文字列の変換や処理

次は、自分で定義したクラスの例です。文字列を変換するためのクラスメソッドを定義しています。

ここでは、文字列を大文字に変換するto_uppercaseメソッドと、小文字に変換するto_lowercaseメソッドを定義しています。

class StringConverter
def self.to_uppercase(str)
str.upcase
end
def self.to_lowercase(str)
str.downcase
end
end
upper = StringConverter.to_uppercase("hello") # "HELLO"
lower = StringConverter.to_lowercase("WORLD") # "world"

これらの例のように、クラスメソッドは特定のインスタンスに依存しない、汎用的な処理を提供するのに適しています。

上記のようなクラスを定義することで、色んなクラスから共通の処理を呼び出すことができ、コードの重複を避けることができます。

まとめ

本章では、クラスメソッドについて学びました。以下の内容を理解できたことと思います。

  • クラスメソッドは、メソッド名の前にself.をつけて定義する
  • クラスメソッドは、インスタンスを作成せずに直接クラスから呼び出せる
  • インスタンスメソッドは特定のインスタンスに対して動作するが、クラスメソッドはクラス全体に関わる機能を提供する

クラスメソッドを適切に活用することで、より読みやすく、メンテナンスしやすいコードを書くことができます。特に、インスタンスの状態に依存しない処理や、決まった設定でインスタンスを作成する処理などは、クラスメソッドとして定義すると便利です。

いまは難しく感じるかもしれませんが、実践的なアプリ開発ではよく登場しますので、頭の片隅に留めておきましょう。

このセクションは有料サブスクリプションへの登録、またはログインが必要です。完全なコンテンツにアクセスするには、料金ページ(/pricing)をご覧ください。購入済みの場合は、ログインしてください。

Starterプランでより詳しく学習

この先のコンテンツを読むにはStarterプラン以上が必要です。より詳細な解説、実践的なサンプルコード、演習問題にアクセスして学習を深めましょう。

作成者:とまだ
Previous
アクセサメソッドでインスタンス変数を簡単に読み書きしよう