「Rubyによるデザインパターン」の読書メモです。
CoC パターンの主な動機は、設定の負荷を軽減することです。
test.rb
require 'uri'
class Message
attr_accessor :from, :to, :body
def initialize(from, to, body)
@from = from
@to = URI.parse(to)
@body = body
end
end
class MessageGateway
def initialize
load_adapters
end
def process_message(message)
adapter = adapter_for(message)
adapter.send_message(message)
end
def adapter_for(message)
protocol = message.to.scheme
adapter_class = protocol.capitalize + 'Adapter'
adapter_class = self.class.const_get(adapter_class)
adapter_class.new
end
def load_adapters
lib_dir = File.dirname(__FILE__)
full_pattern = File.join(lib_dir, 'adapter', '*.rb')
Dir.glob(full_pattern).each {|file| require file }
end
end
m = Message.new('from', 'ftp://xxxxx?ggg=2', 'bodybody')
mg = MessageGateway.new
mg.process_message(m)
出力結果
$ ruby test.rb
"FtpAdapter:send_message #<Message:0x00007fe951195658>"
注意点
規約に基づいたシステムの構築で危険なことの1つは、利用する規約の出来が不完全な場合、その結果としてシステムにできることの幅を制限するかもしれないということです。