第18章 Convention over Configuration
Ruby
Published: 2019-07-05

「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つは、利用する規約の出来が不完全な場合、その結果としてシステムにできることの幅を制限するかもしれないということです。