Swift:使用接口协议就像Objc中的“ .h”文件一样

与Swift一样,我也是Objective-C语言的忠实拥护者。 我完全同意使用Swift,我可以像小说一样在语法上创建代码,这对于代码可读性方面具有很大的优势。

但是,Objective-C中我最喜欢的功能之一是,它具有分离的头文件,该文件解释了特定类如何工作并提供功能。 因此,每当我需要使用3rd party模块时,我要做的第一件事就是打开头文件并浏览所有功能。 不幸的是,在Swift中,我经历了很多次,尽管所有的巨大代码都集中在一个类文件中。 我必须知道的一些代码,但是大多数代码是可忽略的。

对于那些想使用它的人,我该如何设计一个具有较高可读性的类? 这是一些建议; 使用// MARK:符号和接口协议。

我们开始做吧

假设我正在做一个ScheduleReminder,它使我想起每天早晨的整个时间表。 我可以设置一个带有两个整数值的小时和分钟的AlarmingTime。 这是一个简单的代码示例;

有两个属性,日程表将属性列表设置为public(实际上,默认访问范围为Internal,但在这里说是public),alarmingTime为私有。 它还具有用于添加,修改和删除计划的三种公共方法,以及两种作为私有的实用程序方法。

现在,我完成了并将这个模块传递给我的同事。 当我的同事第一次提供此模块时,可以期望采取什么措施? 当然,他会仔细阅读所有代码并找出可以使用的可用功能。

幸运的是,这个ScheduleReminder类只有很少的属性和方法,不需要花很长时间阅读所有代码,但是如果模块有成千上万行代码,该怎么办? 我很确定我们要在5分钟后才开会给他。

从可读性的角度来看,有一种可能的解决方案。 put // MARK:公共和私有功能之间的表示法。

这种方法有几个优点。 将具有相同访问范围的所有功能放在一起,其他开发人员可以轻松地找出该模块提供的功能,而无需阅读和理解所有代码。 这种方式的另一个优点是,您可以使用面包屑菜单一目了然地了解模块结构。

但是,使用// MARK:符号作为维护方面太脆弱了。 如果其他开发人员在代码末尾添加了公共功能怎么办? 如果在重构过程中将Modify函数更改为private函数怎么办?如果开发人员忘记将“ private”表示法放在必须私有的函数前面怎么办? 我们是否也每次都固定表示法的位置? 因为// MARK:表示法是一种COMMENT,所以它是维护自身的成本。

我可以选择的另一个选项是,使用协议在协议文件中指定所有功能。 我更喜欢将其命名为接口; 在此示例中,可以将其命名为ScheduleReminderInterface。

对于用例,将属性声明为ScheduleReminderInterface并对其进行初始化。

现在,我可以创建一个新的Swift文件并将协议代码放在其中,它将像Objc头文件一样工作。

使用接口协议的最大好处是,其他开发人员无需关心模块的时间和复杂程度,而只需弄清楚他们需要什么。 另外,由于ScheduleReminderInterface是协议,因此具有此接口的类完全不受ScheduleReminder类的代码更改的影响。

结论

提供接口协议是提高代码可读性和维护性的一种方法。 著名的话说“没有灵丹妙药”,这种方法不能完美解决所有问题,但可以认为,我们拥有更多的架构卡,可以更好地找到我认为的问题。