有人可以帮我解决我的问题,我不熟悉依赖注入。 我考试了。问题是:使用依赖注入删除Car对Engine的显式引用。
class Car
attr_reader :engine
def engine
@engine ||= Engine.new(4)
end
def move
engine.accelerate
end
end
class Engine
attr_reader :cylinders
def initialize(cylinders)
@cylinders = cylinders
end
def accelerate
end
end
有人可以帮助我吗?谢谢
答案 0 :(得分:1)
它应该是这样的:
class Car
attr_accessor :engine
def initialize(engine)
@engine = engine
end
def move
@engine.accelerate
end
end
现在,您已将Engine.new(4)
从Car
类的方法engine
移出到类构造函数本身。这就是为什么依赖注入在Ruby中很简单。
所以,现在你可以这样做:
Car.new(Engine.new(4))
Car.new(Engine.new(8))
我建议您在此处详细了解DI:http://solnic.eu/2013/12/17/the-world-needs-another-post-about-dependency-injection-in-ruby.html和https://sporto.github.io/blog/2013/09/25/simple-dependency-injection/
答案 1 :(得分:0)
问题是如何将Engine.new
移出class Car
块,并在Car
或Engine
之外添加额外的代码行,以创建带有正确实例化的引擎。
您可以阅读dependency injection on Wikipedia.这是一项非常有用的技术 - 如果您在应用中选择适用于您的类 - 请允许对应用程序进行重大的重新配置,例如:测试。
我的建议是向initialize
添加Car
方法,该方法接受设置属性的engine
参数(删除现有的def engine
块)。然后在末尾添加一行代替Car.new( Engine.new(4) )
P.S。不要让dependency injection和dependency inversion感到困惑。