作成日: 2023/04/26
0

Rubyでよく使うデザインパターン

Rubyには、オブジェクト指向プログラミングのデザインパターンを実現するための便利な機能が数多く用意されています。これらの機能をうまく活用することで、簡潔で効率的なコードを書くことができます。本記事では、Rubyでよく使われるデザインパターンとその使い方について解説します。

1. Iterator (反復子)

Iteratorは、リストなどのデータ構造の要素に順番にアクセスするための方法を提供するパターンです。Rubyでは、「Enumerable」というモジュールを使うことで簡単に実現することができます。Enumerableモジュールは、eachメソッドを定義することでリストなどの要素にアクセスすることができます。

# Enumerableを使った反復子の例
class Book
  include Enumerable

  def initialize(title, author)
    @title = title
    @author = author
    @pages = []
  end

  def <<(page)
    @pages << page
  end

  def each
    @pages.each { |page| yield page }
  end
end

book = Book.new("Ruby on Rails", "David Heinemeier Hansson")
book << "Page 1"
book << "Page 2"
book << "Page 3"

book.each do |page|
  puts page
end

2. Factory Method (ファクトリーメソッド)

Factory Methodは、オブジェクトの生成方法をカプセル化するパターンです。Rubyでは、クラスメソッドを用いてFactory Methodを実現することができます。クラスメソッドを使うことで、オブジェクト生成のロジックをクラス内部に封じ込めることができます。

# Factory Methodの例
class Person
  def self.create(name)
    if name == "Tom"
      return Man.new(name)
    elsif name == "Lisa"
      return Woman.new(name)
    end
  end
end

class Man < Person
  def initialize(name)
    @name = name
  end

  def gender
    "Male"
  end
end

class Woman < Person
  def initialize(name)
    @name = name
  end

  def gender
    "Female"
  end
end

person1 = Person.create("Tom")
person2 = Person.create("Lisa")

puts person1.gender
puts person2.gender

3. Observer (観察者)

Observerは、オブジェクトの状態変化を監視し、変化があったときに通知するパターンです。Rubyでは、「Observable」というモジュールを使うことで簡単にObserverを実現することができます。Observableモジュールは、add_observerメソッド、delete_observerメソッド、notify_observersメソッドを定義しています。

# Observableを使ったObserverの例
require 'observer'

class Data
  include Observable

  def add_data(data)
    @data = data
    changed
    notify_observers(self, @data)
  end
end

class Display
  def update(data, message)
    puts "Data changed: #{message}"
  end
end

data_object = Data.new
data_object.add_observer(Display.new)

data_object.add_data("Data 1")
data_object.add_data("Data 2")
data_object.add_data("Data 3")

4. Singleton (シングルトン)

Singletonは、クラスが唯一のインスタンスしか持たないようにするパターンです。Rubyでは、「Singleton」というモジュールを使うことで簡単にシングルトンを実現することができます。このモジュールは、クラスメソッド「instance」を定義しています。

# Singletonを使ったシングルトンの例
require 'singleton'

class AppConfig
  include Singleton

  def initialize
    @properties = {}
  end

  def set_property(key, value)
    @properties[key] = value
  end

  def get_property(key)
    @properties[key]
  end
end

config1 = AppConfig.instance
config1.set_property("key1", "value1")

config2 = AppConfig.instance
puts config2.get_property("key1")

5. Strategy (ストラテジー)

Stratgeyは、アルゴリズムをカプセル化し、それぞれを独立に切り替えて使えるようにするパターンです。Rubyでは、ブロックを使うことでStratgeyを実現することができます。ブロックを引数として受け取るメソッドを定義することで、異なるアルゴリズムを簡単に切り替えることができます。

# ブロックを使ったStrategyの例
class Printer
  def perform(&strategy)
    strategy.call
  end
end

printer = Printer.new
printer.perform { puts "Method 1" }

printer.perform { puts "Method 2" }

以上、Rubyでよく使われるデザインパターンとその使い方について解説しました。これらのパターンを使うことで、プログラムの拡張性、再利用性、保守性を高めることができます。Rubyの機能を活かして、より効率的で簡潔なコードを書けるようになりましょう。

参考リンク:
Rubyでよく使われるデザインパターン
目からウロコのRubyにおけるデザインパターン
Rubyのシングルトンクラス(Singleton class)


フルスタックエンジニア。徒然なるままに記事を投稿していきます。日々学習。