院卒新人サラリーマンのメモ代わり

備忘としてのメモを記載

ダックタイピング

オブジェクト指向設計実践ガイドを読む。
まだこれを読めるレベルまで到達できてないっぽいから読むの終わり。
ただ、ダックタイピングについての例が分かりやすかった。

# はじめの段階
class Trip
  attr_reader :bicycle, :customers, :vehicle

  def prepare(mechanic)
    mechanic.prepare_bicycle(bicycle)
  end
end

class Mechanic
  def prepare_bicycle(bicycle)
    # 略
  end
end
# 上のにTripCoordeinatorとDriverが追加
# 段々とややこしくなっていく
class Trip
  attr_reader :bicycle, :customers, :vehicle

  def prepare(prepares)
    prepares.each do |preparer|
      case preparer
      when Mechanic
        preparer.prepare_bicycle(bicycle)
      when TripCoordinator
        preparer.buy_food(customers)
      when Driver
        preparer.gas_up(vehicle)
      end
    end
  end
end

class Mechanic
  def prepare_bicycle(bicycle)
    # 略
  end
end

class TripCoordinator
  def buy_food(customers)
    # 略
  end
end

class Driver
  def gas_up(vehicle)
    # 略
  end
end
# 上のをダックタイピングでコーディングすると
class Trip
  attr_reader :bicycle, :customers, :vehicle

  def prepare(prepares)
    prepares.each do |preparer|
      prepare.prepare_trip(self)
    end
  end
end

# すべてのpreparerは'prepare_trip'に応答するダック
class Mechanic
  def prepare_trip(trip)
    prepare_bicycle(trip.bicycle)
  end
# 略
end

class TripCoordinator
  def prepare_trip(trip)
    buy_food(trip.customers)
  end
# 略
end

class Driver
  def prepare_trip(trip)
    gas_up(trip.vehicle)
  end
# 略
end