斯威夫特:没人犯的常见错误-分解

您好,我亲爱的开发人员,

本文是我最近谈论的主题的延续:

无人问津的常见错误– Swift Bools
您好,我亲爱的开发人员,有时您可以编写一个在语法级别上没有重复的代码… blog.idapgroup.com

最近,我偶然发现了〜sh…〜代码中的一块宝石。

让我向您介绍所有辉煌的代码。 您已经在许多不同的面孔上看到了它,但是它总是归结为以下内容:

现在还为时过早,即使您没有编写这样的代码,也要拭目以待。 您不应该考虑类型和方法,而只考虑代码的思想。 这个想法很简单。 您可以将相同的值设置为具有相同接口的不同对象的多个属性或方法。

首先,代码是计数器DRY,它只是不使用Bool作为Bool 。 这里也有很多重复项。 因此,更好的方法是重构如下代码:

对? 对? 错误! 对于相同的变量,我们已经对isUserInteractionEnabled进行了重复数据删除调用,但是仍然有2个调用isUserInteractionEnabled和2个调用isOn 。 在一个函数的范围内多次调用任何属性本身就是一个缺陷。 即使您的属性在访问期间以最小的开销存储,它也可能在多线程环境中发生变化,或者通过一些复杂的观察代码变得可观察,甚至通过一些困难的计算也可以观察到。 因此,最好的准则是通过正确地分解代码并缓存方法/属性结果,永远不要在函数中多次访问属性或调用方法:

这样做要好得多,但是可以想象,在某个时间点, isUserInteractionEnabled将重命名为userInteractionEnabled 。 搜索代码以查找用法将很麻烦。 让我们尝试避免多次调用isUserInteractionEnabled来实现更好的重复数据删除:

哇 该代码很短。 但这好吗? 在视觉层面上,没有重复。 但是,复制仍然存在。 这是逻辑上的重复,因为我们对每个方法都调用isOn (对于该特定情况为两次)。 所以,让我们缓存它,对吧?

那好多了。 现在,让我们听取我的建议,并考虑将来的用法。 我对YAGNI(您不需要它)原则没有任何意见,我只建议考虑分解,因为小的可链接函数是编写,更改和重用想法的更好方法。 假设我们必须添加另一个要禁用的视图。 假设我们不仅要启用或禁用按钮,还要将其背景色更改为相同的颜色。 假设我们希望能够在完全不同的不相关代码段中启用/禁用视图。 该解决方案的核心是简单且可重用:

让我们分析一下:

  • 我们创建类型别名以使代码更具可读性,并避免编写困难的语法构造。 是的,我认为在代码的多个位置用大括号编写UIView很困难,因为这需要额外的击键,并且自动完成功能无法为您提供帮助;
  • 我们创建视图数组的访问器,如果要更改要处理的视图,则只需在一个访问点中执行此操作,就可以避免重复。
  • 我们创建了enable,可以在代码的不同位置使用它,而无需重写相同的方法或使用继承。

如果属性是一阶函数(它们位于编译器的内部,只需检查AST,但是Swift不会让我们那样使用它们),则可以进一步改进。 我们当然可以通过传递闭包来模拟这种行为:

那只是口味的问题,是一项特殊的任务。 我并不总是使用这种方法,但是我也不能总是避免使用它。 请记住,在这两种情况下,您都必须对视图中的forEach进行重复数据删除,以防以多种方式迭代它们(一个粗略的示例,再次基于该任务,您可能会想出一种更好的方法解决问题):

稍后,我将更详细地讨论高阶函数,现在,只需尝试上面概述的方法,您将对应用它们以简化和​​重复数据删除的方式感到震惊。

就是这样,伙计们。 祝您有美好的一天,无论身在何处,都要保持干燥。