在红宝石中使用成分

时间:2010-05-26 21:35:39

标签: ruby composite composition

我是新Ruby,但多年来一直是.net开发者。我希望在我的几个模型中实现组合,以确保它们尽可能松散耦合,但不知道从哪里开始,或者如果真的需要它,我仍然想要像.net dev。< / p>

任何人都可以给我一些指示,从哪里开始。

干杯 科林G

2 个答案:

答案 0 :(得分:8)

你是说这种事吗?

class Engine
    attr_reader :horsepower, :litres
end

class Gearbox
    attr_reader :manufacturer, :model_no
end

class Car
    def initialize(engine, gearbox)
        raise "Invalid Engine Object" if !engine.kind_of(Engine)
        raise "Invalid Gearbox Object" if !gearbox.kind_of(Gearbox)
        @engine = engine
        @gearbox = gearbox
    end
end


car = Car.new(Engine.new, Gearbox.new) 

答案 1 :(得分:2)

Ruby是一种面向对象但动态类型的语言。作为一种动态语言,rubyists倾向于使用反射和动态修改代码,而不是.net开发人员。当然,因为它是一种面向对象的语言,你可以使用与.net中相同的原则,你也应该这样做,但总是环顾四周,看看如何以更动态的方式实现同​​样的事情。

例如,ActiveRecord ORM使用composition_of method解决合成,该合成将动态地向您的类添加适当的字段和属性。我不是说这是它应该做的方式(例如DataMapper,这是ruby的另一个ORM,选择一个更“保守”的方法,所以更像(Fluent)NHibernate),它只是一个例子如何以不同的方式完成任务。

像AOP或DI这样的东西不是动态语言的外国概念,它们通常只是以另一种方式完成。对语言的动态方面保持开放的态度,但不要过度。