轻松构建URLRequest

在本文中,我将向您展示一种简单的方法,以简化开发人员在应用程序的开发过程中必须执行的最长且最无聊的任务之一。

如今,大多数应用程序都需要某种类型的网络。 在iOS中,这意味着我们必须在某个时候与URLRequest类作斗争。 如果我们不小心的话,这并不总是那么容易,并且可能导致各种各样的错误和问题。

首先,为了更好地理解示例,我们需要了解以下定义:

https://gist.github.com/Juanpe/8c902c8c0c5f342767a67ee62308d5e2

想象一下,我们有一个执行网络请求的APIClient 。 此类具有构建URLRequests的方法。 我们的代码可能是这样的:

https://gist.github.com/Juanpe/58439c60e7d63d605ad06427a6fa0caf

如您所见,此方法很长,并且有多个责任。 因此,我们增加了测试的复杂性,并且不符合SRP原则。

是时候到建造者了

使用Builder模式是一个完美的方案:

Builder是一种创新的设计模式,可让您逐步构造复杂的对象。 该模式使您可以使用相同的构造代码生成对象的不同类型和表示形式。

尽管我认为很清楚,但是基本上这种模式可以帮助我们以更简单的方式构建复杂的对象。

该模式将对象构造组织为一组步骤。 要创建对象,请在构建器对象上执行一系列这些步骤。 重要的部分是您不需要调用所有步骤。 您只能调用产生对象的特定配置所必需的那些步骤。

现在,我们知道了模式的定义,因此我们将创建URLRequestBuilder

https://gist.github.com/Juanpe/e8b3cd2c5a17a14d68ccc01d79aa553b

每个方法的顶部都有一个关键字disableableResult,以避免警告未使用的结果。

此类具有创建URLRequest所需的所有属性,其中一些是可选的,而其他则是必需的。 然后定义步骤,每个set方法就像创建对象所需的步骤。

最后,我们有一个编译方法,该方法收集所有信息并生成最终对象。

多亏了Swift,我们可以使用方法链接,所以方法看起来像这样:

https://gist.github.com/Juanpe/6707fc371d0a496910d1a9bd008c29e4

结果是一种更具可读性的方法,仅需5行代码,并且只需承担一项责任。 因此,我们已将请求创建与APIClient隔离开了。

奖金

很多时候,在发送请求之前,我们必须进行一项或多项更改才能满足API的要求。 例如,如果我们使用OAuth2对请求进行身份验证。

使用Alamofire 方法,我们可以创建一个RequestAdapter 。 其目标是接收请求,进行必要的更改,然后再次返回。

RequestAdapter将是:

https://gist.github.com/Juanpe/d953000cc55522c0f5f2312cd2a1d662

使用OAuth2示例,他的适配器如下所示:

https://gist.github.com/Juanpe/e877f96aaaac1c7e1c122dd6e96ca80c

要将这个新元素包括在我们的构建器中,我们只需要添加带有所有必要适配器的新属性,并在编译方法中添加逻辑即可:

https://gist.github.com/Juanpe/721a2198bed905becd0cc859628895e4

结论

也许看到了我们添加到项目中的所有代码,我们认为我们增加了复杂性,但这不是事实。 在最初的示例中,我们的APIClient负责创建请求,这是不正确的,因为唯一要做的就是发送请求。 因此,我们将打破SRP原则。

另外,现在我们的代码更具可扩展性,可读性和可测试性。 在实际的项目中,API的规范会不断变化,因此我们必须修改请求的创建。 使用我们的代码,我们只需要修改构建器,而不必修改结构的任何其他元素。

最后,我们了解了Builder模式的工作方式。 我可以告诉您,您很有可能最终会在应用程序的其他部分中使用它。 例如,通常在寄存器中使用一个以上的步骤就可以使用它。