我正在阅读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
是一个额外的依赖。看起来组合对象越大,依赖项的数量就越多。这一定是坏事吗?可以采取哪些措施来改善这种情况?