依赖注入并非是一种美德 已翻译 100%

oschina 投递于 2013/01/07 08:00 (共 7 段, 翻译完成于 01-10)
阅读 2671
收藏 14
3
加载中

很少能有比Ruby更加灵活的编程语言了,因为‘硬编码’类的引用关系会使测试变得非常困难.如果你把Date date = new Date();隐藏在了Java代码的内部,那么在测试中你怎么将它和一个已知的值进行比较呢? 好吧,你当然不能了。所以你的替代方案是将date作为参数传入你的方法中。你注入了Date的依赖关系。哇,多么具有可测试性的代码啊!

叫我蝴蝶吧
叫我蝴蝶吧
翻译于 2013/01/07 14:58
2
如同不幸发生在从Java一类严格语言( rigid languages)中衍生出的各种模式上的一样,依赖注入广为流传并且作为一个最佳实践在不同语言间提倡使用,这得益于所谓的( trumped up)在灵活性和可伸缩性上的优势。然而如果你的代码不知道它将和谁对话,那它可以和任何人对话!测试桩、模拟对象,甚至未知的对象。太糟糕了!
gangzz
gangzz
翻译于 2013/01/08 00:12
2

Ruby就像Play-Doh not LEGO一样,令人印象深刻的是它会最大限度的抽取出硬编码部分。看一下Adam Keys' Design for test vs design for API中的例子:

def publish!
  self.update published_at: Time.now
end

在那些较为封闭的语言中,测试是个明显的问题,但是对于Ruby来说,这很简单:

Time.stub(:now) { Time.new(2012, 12, 24) }
article.publish!
assert_equal 24, article.published_at.day



缪斯的情人
缪斯的情人
翻译于 2013/01/08 11:22
2

这是一种有用模式,所以Traivs Jefferey把它收录到the popular Timecop gem。但是如果你已经接纳了Java的依赖注入模式,你会觉得这很恶心。这是基于模式匹配的直接反应。大脑中不断冒出“这是硬编码!”“这是硬编码!”。这是使用模式的危险之处:它们会迅速地从仅仅是工具进化成一种习惯(这里是taste对应上面的design taste)。

gangzz
gangzz
翻译于 2013/01/08 23:06
2
Adam Keys'提出了一个很好的问题——到底为测试还是为API设计(Lloyd Kupchanko 也分享了“API是如何忍受依赖注入的”的 一些告诫)。在Ruby语言中我认为这两者之间没有多大分歧。如同上面展示的,我们即可以保留硬编码(hard code reference)带来的清晰和简单,同时也可以使代码容易测试。
gangzz
gangzz
翻译于 2013/01/10 00:09
2

这显然又与另一条java规则相违背了——只仿造你拥有的类型(only mock types you own)。再加上与依赖注入的紧密结合,原本可以工作的简单东西已不再是不够好,简直是令人厌恶。它违反了精心构制的信条(指Java的)。

gangzz
gangzz
翻译于 2013/01/10 22:30
3

这才是最关键的:留心你到底在与谁分享的你编程思想(intellectual foundation)。“我不是Ruby程序员,我只是个程序员”——这句话很时髦。但是语言影响着我们的思考方式。虽然有些理念我们可以跨越语言传递,但是更多的是不能。而且更糟糕的是这种不相容性不是显而易见的——特别当他们(两门语言)看起来都是面向对象。

我是个 Ruby 程序员。

gangzz
gangzz
翻译于 2013/01/10 22:40
2
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(5)

modrich
modrich
这翻译比较难懂,求高手二次解说
unnamed
unnamed
这翻译的有点差啊。。。最少得把句子弄通顺了吧。。
小恶魔的面具
小恶魔的面具
Ruby灵活的语法就是把双刃剑
D
D-dragon
单比语言特性的话,java差ruby之类的动态语言太远,如果动态语言用得多的话,基本上再也不想用静态语言了。
但静态语言相对来说,更稳定,更利于协作,再聪明的人写出来的代码差别也不大,但动态语言就跟个人能力有比较大的关系了。
gangzz
gangzz
好吧,翻译晚后面几段觉得翻译的很不好。这篇文档的作者的意思应该是要论述Dependence Injection(依赖注入)并非放之四海而皆准,不是要否定依赖注入。作者举了Java和Ruby两种语言作对比,说明明明在java中奉为圣旨的一些编程规范、设计模式在Ruby中不光不管用,而且造成障碍——很多思想无法跨语言传递兼容。(While we can cross-pollinate some ideas between languages, there are many we cannot. And worse, the incompatibility is not immediately apparent — especially when they both seem to just be Objective Oriented.)
这是我的理解,不足之处欢迎指正。
返回顶部
顶部