使用结果扩展编写声明性代码

最近,我读了Benedikt Terhechte的精彩文章,他在其中扩展了optionals的API。 在标准银行,我们非常广泛地使用结果类型,因此我采用了相同的想法并将其应用于结果类型。 在这篇文章之后,我们将获得可组合的代码和声明性的API,类似于下面的代码片段。

您可以在以下Playground文件中找到一个工作示例。

TYRONEMICHAEL /结果扩展
result-extensions –使用结果扩展 github.com 编写声明性代码

虚构的摘要

假设我们正在为客户构建一个简单的应用程序。 与域名专家坐在一起后,他通知我们任何人都可以浏览该应用程序,但是要成为注册用户,您需要满足以下要求:

  • 注册用户必须具有有效的 标识符
  • 注册用户必须具有有效的电子邮件地址,并且该电子邮件地址必须是Gmail地址。
  • 注册用户必须是千禧一代X一代
  • 我们需要向用户展示为什么尝试后无法注册

用应用程序扩展结果类型

要求之一是向用户显示为什么他们不能成为注册用户。 通过使用应用程序,我们可以非常漂亮地实现这一目标。

在编写我们的应用程序之前,我们需要定义一个称为半组的协议。 布兰登·威廉姆斯(Brandon Williams)对半群是什么以及为什么要使用半群有很好的解释。 出于本文的目的,我们只需要一个Array即可符合协议。

现在,我们可以编写扩展结果类型的应用程序。

这允许编写以下代码。

如果在上面打印用户对象的内容,将得到以下内容:

  失败:3个要素 
  -“无效的ID” 
  - “不合规电邮” 
  -“无效的千禧一代” 

斯蒂芬·塞利斯(Stephen Celis)的精彩视频详细介绍了上述应用程序和Swift。 一块很棒的手表。

用AND扩展结果类型

要求之一是用户必须具有有效的电子邮件地址和有效的Gmail地址。 让我们使用和的以下代码扩展结果类型。

现在,我们可以执行以下操作。

如果打印结果,将得到以下输出。

  失败:1个元素 
  -“无效的Gmail地址” 

用OR扩展结果类型

最后一个要求是用户是千禧一代或X代。我们可以通过使用or扩展结果类型来满足此要求。

现在我们有以下内容。

如果打印结果,将得到以下输出。

  失败:2个要素 
  -“无效的千禧一代” 
  -“无效的gen x” 

放在一起

下面的代码段满足了我们所有的要求。

如果您打印registeredUser ,您将获得成功的结果,具体取决于我们的输入或输出,详细说明了无法注册用户的原因。 在上述情况下,结果将打印以下内容。

  失败:4个要素 
  -“无效的ID” 
  -“无效的Gmail地址” 
  -“无效的千禧一代” 
  -“无效的gen x” 

奖金

让我们使用andor自定义运算符扩展结果类型。

现在,我们可以将RegisteredUser.create方法更新为以下内容。

结论

通过具有易于组合的小功能,可以实现高度的灵活性。 最后,您将获得易于维护,易于阅读和易于测试的代码。

您可以在以下游乐场文件中找到一个工作示例。

TYRONEMICHAEL /结果扩展
result-extensions –使用结果扩展 github.com 编写声明性代码

在Twitter上关注我,我经常喜欢在这里发布诸如此类的有趣话题。

泰隆·阿芙妮(@tyroneavnit)| 推特
Tyrone Avnit(@tyroneavnit)的最新推文。 爸爸,丈夫和多语言程序员。 专门从事iOS… twitter.com