🌟
【Ruby】FactoryMethodパターンを使用してDI対象のクラスを判定する
※実装メモ的な記事です
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