🌟

【Ruby】FactoryMethodパターンを使用してDI対象のクラスを判定する

2023/11/07に公開

※実装メモ的な記事です

open/closedの原則に基づいてダックタイピングを実装し、依存クラスを取り付け可能な実装を行う。
この時、下記のユースケースに合う実装パターンを解説する。

  • 条件によって抽象クラスにdiするクラスを取り替えたい

サンプルコード

class Animal
  attr_reader :animal

  def initialize(animal)
    @animal = animal
  end

  def echo
    animal.echo
  end
end

class Dog
  def echo
    p 'wann'
  end
end

class Cat
  def echo
    p 'nyaaa'
  end
end

class AnimalFactory
  attr_reader :type

  def initialize(type)
    @type = type
  end

  def animal_generator
    case type
    when :dog
      Dog.new
    when :cat
      Cat.new
    else
      raise "unkown animal #{type}"
    end
  end
end


animal_factory = AnimalFactory.new(:cat).animal_generator
Animal.new(animal_factory).echo

# => "nyaaa"
  • ダックタイピングで特定クラスに依存しないAnimalクラスを実装
  • 外部から与えられた条件(:dog or :cat)を基に生成するクラスを判定するAnimalFactoryを実装
  • デルメルの法則に従い、振る舞いに依存するようattr_readerを使用

AnimalFactoryにより「生成に関する責務」を与えるクラスを実装し、動物を増やす仕様変更時は具象クラスの追加とFactoryMethod内の条件を増やすのみになっている。

Discussion