【问题标题】:Creating an abstract api over multiple web services在多个 Web 服务上创建抽象 API
【发布时间】:2015-08-09 09:12:37
【问题描述】:

我来自 c#/.net/asp.net mvc/nancyfx,我正在考虑将 Rails 用于即将到来的项目。

该项目涉及创建一个统一/抽象的 api,它将几个相似的 Web 服务拉到一起,允许开发人员提供每个服务的实现,同时还通过单个 api 与它们进行交互。就像 Ruby DBI 对数据库所做的那样。

在 c# 中,我将创建一个接口来定义所有服务实现必须遵守的合同(我以在线文件存储服务为例来解释这个问题):

public interface IStorageProvider
{
    ICollection<string> ListFilenames(string folder);
}

然后我会为每个服务创建实现,例如保管箱:

public DropboxStorageProvider : IStorageProvider
{
    public ICollection<string> ListFilenames(string folder)
    {
        var filenames = service.SomeCodeToGetFilenames(folder);
        return filenames;
    }
}

创建这种抽象的 Ruby 方法是什么?谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    据我所知,在 C#、Java、Objective-C 或 Swift 等静态类型语言中使用的意义上,Ruby 中没有接口之类的东西。在 Ruby 中,不能声明具有一组属性和方法的抽象实体。您也不能强制 Ruby 类符合这种抽象实体。相反,在 Ruby 中,人们通常编写单元测试来确保类的行为符合预期。因此,Ruby 中的单元测试有点像一个接口,它记录类的端点(方法和属性)并确保这些端点正常工作。

    这是我为 iOS 应用程序构建用 Ruby on Rails 编写的 API 时的工作流程。

    1. 我通常做的第一件事是为此 API 编写文档。例如,文档以人类友好的语言编写并托管在 Github wiki 中。对于每个 HTTP 端点,我记录了它的请求 URL 和方法、参数、它们的类型,并提供了一些发送和接收的 JSON 数据的示例。

    2. 接下来,我开始使用 TDD 方法在 Ruby on Rails 中开发此 API,我首先根据我刚刚编写的文档编写单元测试。

    3. 最后,我编写应用程序逻辑,确保测试通过。

    4. 在客户端(在我的例子中是一个 iOS 应用程序)我还编写集成测试,以确保应用程序与服务器 API 和谐相处。

    查看这些 SO 问题:

    Why do Ruby people say they don't need interfaces?

    What is java interface equivalent in Ruby?

    In Ruby, what is the equivalent to an interface in C#?

    【讨论】:

    • 谢谢!我了解到 ruby​​ 没有任何类似接口的功能,我也不是在寻找“接口的 ruby​​ 实现”。我正在为我的情况寻找红宝石方面的最佳实践。有小费吗? :-)
    • 感谢您使用工作流程更新您的答案。那么,我的假设是否正确,因为 Ruby 是鸭子类型的,只需创建具有完全相同的方法和属性的类就可以让我做与在 c# 中使用接口时相同的事情?
    • 是的,您可以使用 ListFilenames 方法创建两个类。然后,您将从这些类中实例化对象并调用 ListFilenames。
    猜你喜欢
    • 1970-01-01
    • 2016-12-14
    • 2017-03-29
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多