【问题标题】:Is using static methods to access an API a bad idea?使用静态方法访问 API 是个坏主意吗?
【发布时间】:2015-04-13 21:09:47
【问题描述】:

假设我在一个名为 MPWidget 的类中有以下代码。

// Get list of widgets from server
+ (void) getWithSuccess:(void(^)(void))success failure:(void(^)(void))failure
{
    HttpClient *httpClient = [[HttpClient alloc] init];
    [httpClient GET:@"http://example.com/widgets.json" success:^(void) {
        NSLog(@"Great success!");
    } failure:^(void) {
        NSLog(@"Boo, fail!");
    }];
}

上面的方法会被调用如下:

[MPWidget getWithSuccess:^(...) failure:^(...)];

我使用静态方法是为了简单起见,如果我想从网络中获取一个(或多个),则不必实例化 MPWidget。但是,我刚刚阅读了static calls are bad for testability。网络数据获取方法是这种情况吗?或者这是一个边缘案例?

【问题讨论】:

    标签: objective-c unit-testing static static-methods


    【解决方案1】:

    类方法只有在保持某种静态状态时才对可测试性不利。另一方面,无状态类方法为在其他方法之间共享过程逻辑提供了一种很好的方法,并且可以简单地测试。它们为编写“辅助方法”(例如您的getWithSuccess:failure:)提供了默认选择。无状态类方法绝对没有错。

    [如果我想]注入getWithSuccess:failure的替代实现?

    系统“边缘”的方法不同,这些方法负责与其他系统交换信息、访问数据和产生其他副作用。这些是您经常希望替换以进行测试的方法 - 例如,为您的系统提供“罐装” JSON 消息而不是访问服务器。

    尽管就您的代码而言,此类方法可能是无状态的,但它们并非完全无状态,因为它们要么随环境而变化,要么对环境做出改变。这种“外部状态”使得这些方法不利于可测试性。

    【讨论】:

    • 感谢您的保证。我同意,这种方法非常容易测试。与此相反,当其他调用 getWithSuccess:failure 的静态方法不能(容易?)注入 getWithSuccess:failure 的替代实现时,我已经阅读了有关问题的论点。
    • @MattPotts 为位于应用程序边界上的东西注入不同实现的能力是另一回事。让我编辑以将其包含在答案中。
    猜你喜欢
    • 2016-03-22
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 2010-10-19
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多