Swift编程入门第10部分-代码结构,可读性和原理

在上一篇文章中,我们介绍了基本协议,扩展和下标。

开始进行Swift编程第9部分-基本协议,扩展和下标

在上一篇文章中,我们介绍了类型转换,安全展开可选内容和访问控件。

medium.com

协议具有更强大的功能,扩展功能更是如此,但是将来我们将介绍这些功能。 既然您现在知道了Swift中常用的顶级实体,我认为现在是时候讨论代码结构和可读性了。

如果您像我希望的那样一直在练习,您可能已经编写了一个相当大的程序,吃过晚饭或出去了,而当您回来时,您会觉得自己的代码有些失落。

刚开始时,这种情况经常发生。 如果分心,您会感到沮丧,因为您忘记了5分钟前写下的内容。 别担心,这发生在我们大多数人身上。 我有一个好消息,随着时间的推移,它确实变得越来越容易,需要多长时间取决于您练习的次数。

对我来说,每天大约要花6个月的编码时间。 从我醒来直到上床睡觉的时间,甚至在周末,我总是在写代码。 不要误会我的意思,这并不意味着我没有生活,我仍然出去玩得开心。 有时我会筋疲力尽,不得不停止编写代码一两天。 即便如此,我仍在阅读文章,并试图做得更好。

所以继续练习。

前几天,我开始思考,Swift中的代码结构真的没有任何东西。 一切似乎都是道听途说或遵循教程的结构。 每个人的写作风格都有自己的怪癖,没有标准化的东西。 我不是要规范代码结构 。 我想说清楚。 我只是将我所看到的所有内容和我自己的代码样式进行汇总,以帮助您提供一个起点,使您可以组织代码并轻松地理解以后再返回代码时的情况。

话虽这么说,让我们高谈一下应用程序的各个部分如何在您的Swift文件中显示。

类,协议和扩展仅是顶级实体。 最高层,我是说它们没有被花括号包围。 可以这么说,他们坐在裸露的文件上。

结构和枚举几乎总是顶级实体,但是它们也可以出现在其他结构或枚举中。

函数可以是顶级对象,但我只建议在控制台程序中执行此操作。 对于macOS,iOS,tvOS和watchOS程序,我会坚持将功能保留在类中。

常量和变量应在尽可能小的范围内声明,这意味着如果只需要在if语句中存在一个变量,则在if语句内声明它。 如果将在整个文件中使用其中任何一个,请在文件顶部声明它并提供适当的访问控制。

综上所述,我将为您提供一个示例,说明如何以代码格式布置文件,我的示例将基于放置在所有新View Controller文件中的View Controller代码段。

对于您自己以及其他阅读您代码的开发人员而言,可读性比对用户而言更为重要。 您应该努力在所有代码中都具有出色的可读性。

分手

如您所见,当您写入大量功能时,这些文件会变得很长。 因此,我倾向于将这些文件分解为同一文件夹组下的单独文件。 我见过的命名约定如下:
ViewController+NameOfDelegate.swiftViewController+NameOfDataSource.swift

这样,我知道要单击的文件应包含哪些代码,这有助于我确保该文件仅包含与其相关的代码。

使用上面的示例代码,我将提取枚举并将它们放在自己的文件中,如果我想为全局枚举创建一个名为Enums.swift文件,我可以使用//MARK:将其拆分为几个部分,以便稍后可以跳入进行更新。 如果文件中的枚举仅用于此视图控制器,则将访问控制设置为internal,但将文件与ViewController类放在同一组下。

除非协议是在模型中定义的,并且打算供其他类使用,否则我可能会取出协议及其扩展名并将其放置在自己的文件中。 如果协议具有类或结构特定的扩展名,我将使用//MARK:通过Protocols.swift文件将其逻辑上分开。 同样,我将以与Enums.swift相同的方式放置文件。

我还会撕掉该结构并将其用作名为House.swift 。 我还将它分成名为Models的组,因为它是房屋的模型。

该类及其所有方法将保持不变,但是我可以取出特定于类的扩展,并将其放置在新文件ViewController+Extensions.swift 。 只要确保将需要由扩展程序调用的ViewController.swift中的任何方法都设置为internal ,对不起,但是privatefileprivate将阻止您在扩展程序放置在另一个文件中时从扩展程序中看到这些方法。

常数很特殊。 我看到人们做的一个技巧是创建一个Constants.swift文件,并将所有在整个应用程序中使用的常量放置在其中。 这样,如果您的应用程序需要的URL发生更改,则只需要在一个位置进行更改,就可以立即知道该位置。 然后,如果在5个不同的地方使用它,它们仍然可以继续引用常量文件,并且可以确保它们是最新的。 一改五。 听起来对我来说也已经完成了。

之前,我们谈论过DRY(不要重复自己),关注点分离和单一责任原则。

我想对此进行扩展,并谈论其他一些话题。

首先, “如果没有破裂,就不要修复”。 这应该是一个非常简单的原则。 如果您编写的代码有效,即使您不知道它是如何工作的,也不要管它。 如果您尝试修复它,可能会破坏它,却不知道如何将其恢复原状。

信息隐藏 。 这只是确保对可写性(由访问控制定义)在您编写的每段代码上都尽可能严格。 如果没有其他人可以看到mySuperSecretFunction()请不要使其公开。 如果您具有为您构建URL的联网代码,则让联网类构建URL,不要让您的视图控制器执行该操作,在联网类中将该方法设置为private或fileprivate。

松耦合 。 这听起来很抽象,但实际上不是。 当一个类使用另一个类的一部分时,仅从该类中获取所需的内容,不要在原始类中实例化该类,否则您将获得强大的参考。 松散耦合只是保持类之间的依赖性较低的结果。 使用结构, 委托或协议有助于减轻对象之间的耦合。 委托尚未涵盖,但总而言之,它允许类通过允许某些函数暴露给委托类而成为另一个类的委托或代表另一个类采取行动。

得墨meter耳定律 。 我直接从Wikipedia提取了此信息。 对于您用代码编写的所有内容,您都应该希望如此。

  • 每个单元对其他单元的知识应该有限:只有与当前单元“紧密”相关的单元。
  • 每个单位只能与朋友交谈; 不要和陌生人说话。
  • 只与您的直系朋友交谈。

最后,现在, 打开/关闭原则 。 所有实体都应开放以进行扩展,但应封闭以进行修改。

  • 可以使用class关键字之前的final关键字关闭类的继承。
  • 可以在可能的情况下将变量转换为常量,然后如果需要更改该值,则可以在变量中使用该值。 该常数将仍然是相同的值。
  • 使用扩展功能为特定功能创建自定义逻辑,而不是使用自定义逻辑更新原始实体。

我们研究了如何布置您的代码,以便您稍后可以重新使用它,而不会完全丢失。 我们还研究了如何使用新的文件,空格和描述性命名约定来采用该代码结构或您自己的代码结构,以使其更具可读性。

代码的可读性甚至进一步扩展,包括方法的命名方式。 但我想我会在以后某个时间将其保存为命名约定部分,因为有很多不同的情况。

最后,我们用其他一些原则总结了您可以记住的原则。 我想与您谈谈更多内容,但这将在以后的文章中介绍,因为我们尚未涵盖其涵盖的所有主题。

下一步是中央车站调度和关闭。

现在是时候了,对于所有坚持使用我的系列的人来说,下一篇文章将成为使您成全或因封闭而使您失望的文章。 封闭件在其工作方面令人赞叹。 它们通常用于异步事务,这就是为什么我包括Grand Central Dispatch和self的原因,这是我们需要在闭包旁边学习的两件事,以使这一切有意义。

该网站名称存在的原因是:

http://www.goshdarnclosuresyntax.com

URL的原始名称被许多工作内容阻止程序阻止,因此他们不得不提出第二个域。 我只是说他们没有使用天哪。 无论哪种方式,它都是闭包的良好参考。 如果您爱管闲事,并且想知道什么是typealias ,那只是引用一些代码而不必键入太多代码的一种方式。 当我们开始使用闭包时,我将讨论这一点。

与Closures相比,Grand Central Dispatch(GCD)在大多数情况下都是轻而易举的。 不提起GCD谈论异步闭包有点困难。

我只想说,下一篇文章对我们俩都很难。 如果您只是学习,对您来说很辛苦,而对我来说,用某种方式来教您就很困难,直到您学完为止。

在此之前,请观看该视频并练习您今天所学的内容。

如果您喜欢这个故事,则可以在我的第5部分系列中获得有关代码结构和可读性的更深入的信息。

代码结构和可读性第1部分—变量,数据结构和函数

如果您来自我的有关结构和可读性的Swift编程文章,那么您已经知道一些基本知识……

medium.com

入门Swift编程第11部分-大型中央调度和关闭

以前,我们了解了代码结构,可读性和其他一些原理。 是的,不是很技术,但是…

medium.com