组合与管理依赖关系。他们是否相互矛盾?

时间:2018-06-15 21:18:48

标签: ruby

我正在阅读Sandi Metz的实用的面向对象的Ruby设计,我很难理解管理依赖关系和组合是如何相互矛盾。比如,他们各自提供的好处如何不妨碍另一方的目的?

例如,这是构建于第180页的组合自行车:

class Bicycle
  attr_reader :size, :parts

  def initialize(args={})
    @size = args[:size]
    @parts = args[:parts]
  end

  def spares
    parts.spares
  end
end

require 'forwardable'
class Parts
  extend Forwardable

  def delegators :@parts, :size, :each
  include Enumerable

  def initialize(parts)
    @parts = parts
  end

  def spares
    select {|part| part.needs_spare}
  end
end


require 'ostruct'

module PartsFactory
  def self.build(config, parts_class = Parts)
    parts_class.new(
      config.collect {|part_config| create_part(part_config)}
    )
  end

  def self.create_part(part_config)
    OpenStruct.new(name: part_config[0], description: part_config[1], needs_spare: part_config.fetch(2, true))
  end
end

road_config = [['chain', '10-speed'], ['tire_size', '23'], ['tape_color', 'red']]
mountain_config = [['chain', '10-speed'], ['tire_size', '2.1'], ['front_shock', 'Manitou', false], ['rear_shock', 'Fox']]

所以自行车依赖于parts。或者更确切地说,composed似乎是parts。但是这个parts是一个额外的依赖。看起来组合对象越大,依赖项的数量就越多。这一定是坏事吗?可以采取哪些措施来改善这种情况?

0 个答案:

没有答案