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


我读 以测试为指导,发展面向对象的软件 由史蒂夫弗里曼和纳特普赖斯,非常感动。我想在使用RSpec的Rails项目中采用本书的思想,尽管它的例子是用Java编写的。

本书的基本原则是我们应该嘲笑 接口 代替 具体课程。他们说我们可以改进应用程序 设计 通过提取接口并命名它们。

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

UPDATE

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

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

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


6876
2017-10-28 02:25


起源

在阅读了普拉卡什和安迪的答案后,我用“语法”取代了“概念”这个词。并删除了“不幸”这个词,以避免给人一种我想念Java的印象 interface。我喜欢Ruby的 鸭子打字。我想要的不是Java方式的强制方法。见后文 UPDATE 为了我的意图。 - Tsutomu


答案:


看看这个 Stack Overflow回答 为了更好地解释ruby中的接口。

也, Ruby中实用的面向对象设计 是一本类似的书 不断发展的面向对象软件 书,但用红宝石的例子。值得一试。


6
2017-10-28 04:07





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

测试

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

使用基类

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


3
2017-10-28 03:59



你是对的。我会小心使用基类来定义接口。部分原因是您可能需要类继承来共享某些实现,部分原因是您可能希望在类中实现多个接口。 - Steve Freeman


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

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

例如,请参阅 ::加载ActiveModel皮棉::测试 和 rspec的共享示例


2
2017-10-29 01:22