在Ruby on Rails中采用“不断增长的面向对象软件”技术

时间:2012-10-28 02:25:19

标签: ruby interface rspec mocking

我读过Steve Freeman和Nat Pryce的Growing Object-Oriented Software, Guided by Tests并给我留下了非常深刻的印象。我想在使用RSpec的Rails项目中采用本书的思想,尽管它的例子是用Java编写的。

本书的基本原则是我们应该模拟接口而不是具体类。他们说我们可以通过提取接口并命名它们来改进应用程序 design

但是,Ruby没有任何与Java interface等效的语法。我如何利用他们的技术进行Rails项目?

更新

例如,在第126页中,作者引入了Auction接口以实现bid方法。首先,他们嘲笑Auction.class以使测试通过,然后他们在Auction类中实现了Main类作为匿名内部类。最后,他们从XMPPAuction(第131-132页)中提取了一个新的具体课程Main

在我看来,这种增量方法是本书的关键。

如何在Ruby开发中采用或模仿这样一系列代码转换?

3 个答案:

答案 0 :(得分:6)

查看以前的Stack Overflow answer,了解ruby中接口的详细说明。

此外,Practical Object-Oriented Design in Ruby是一本与Growing Object Oriented Software书类似的书,但有红宝石的例子。值得一试。

答案 1 :(得分:3)

因为在Ruby中,所有内容都是鸭子类型,界面只是公开暴露的字段和方法集,您可以执行以下一项或多项操作:

<强>测试

设计测试以测试接口并适当地命名和评论您的测试 - 然后您可以通过相同的测试套件传递“接口”的所有“具体实现”。只要您的测试套件涵盖了应用程序的边缘情况,应用程序中任何具有这些具体类的实例的任何内容都将能够处理任何其他具体类的实例。

使用基类

定义一个基类,所有具体类将继承自所有方法抛出NotImplemented错误的基类。这为您提供了可以可视化的层次结构 - 但是,它确实需要额外的类,并且可能会鼓励生产代码中的许多is a测试,而不是依赖于has a的代码。

答案 2 :(得分:2)

Ruby没有正式的接口你是对的。相反,接口隐含在对象处理的消息中(请参阅duck typing)。

如果您仍在寻找一种更加正式的方法来“强制”使用Ruby中的接口,请考虑编写一套自动单元测试,如果对象正确符合接口,则为绿色,否则为红色。

例如,请参阅ActiveModel::Lint::Testsrspec's shared examples