11

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

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

但是,Ruby 没有任何与 Java 的interface. 我如何将他们的技术用于 Rails 项目?

更新

例如,在第 126 页中,作者介绍了Auction接口以实现该bid方法。首先,他们模拟Auction.class使测试通过,然后他们在类中实现了一个Auction类作为匿名内部Main类。最后,他们XMPPAuctionMain(第 131-132 页)中提取了一个新的具体类。

在我看来,这种渐进式方法是本书的症结所在。

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

4

3 回答 3

6

查看这个以前的Stack Overflow 答案,以获得对 ruby​​ 接口的一个很好的解释。

此外,Practical Object-Oriented Design in Ruby是一本与《 Growing Object Oriented Software 》类似的书,但带有 ruby​​ 示例。值得一试。

于 2012-10-28T04:07:31.817 回答
3

由于在 Ruby 中,所有事物都是鸭子类型的,并且接口只是公开公开的一组字段和方法,您可以执行以下一项或多项操作:

测试

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

使用基类

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

于 2012-10-28T03:59:35.043 回答
2

没错,Ruby 没有正式的接口。相反,接口隐含在对象处理的消息中(请参阅鸭子类型)。

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

有关示例,请参阅ActiveModel::Lint::Testsrspec 的共享示例

于 2012-10-29T01:22:16.067 回答