拥有许多全球功能是不是很糟糕?

Ski*_*not 5 xcode cocoa swift

我对软件开发比较陌生,而且我正准备完成我的第一个iPhone应用程序.

在学习Swift的过程中,我了解到我可以在类定义之外添加函数,并且可以在所有视图中访问它.过了一会儿,我发现自己创建了很多全局函数来设置应用程序首选项(注册默认值,UIAppearance等).

这是不好的做法吗?我能想到的唯一替代方法是创建一个自定义类来封装它们,但是这个类本身不会用于任何目的,我不得不考虑将它传递给视图的方法.

Air*_*ity 7

全球职能:好(恕我直言,尽管有些人不同意)

全球国家:糟糕(相当普遍认同)

我的意思是,分解代码以创建大量小实用程序函数,使它们成为通用代码并重用它们可能是一种很好的做法.只要它们是" 纯粹的功能 "

例如,假设您发现自己正在检查数组中的所有条目是否都具有某个属性.您可以在数组上编写for循环来检查它们.您甚至可以重复使用该标准reduce来执行此操作.或者你可以编写一个可重用的函数,all它接受一个检查元素的闭包,并针对数组中的每个元素运行它.当你阅读代码let allAboveGround = all(sprites) { $0.position.y > 0 }而不是for…in循环执行同样的事情时,它很好而且清晰.您还可以专门为您的all函数编写单独的单元测试,并确信它可以正常工作,而不是对包含其中包含all其他业务逻辑的版本的函数进行更多参与测试.

将代码分解为更小的函数也可以帮助避免需要使用var这么多.例如,在上面的示例中,您可能需要var跟踪循环结果,但all可以使用分配函数的结果let.支持声明的不可变变量let有助于使程序更容易推理和调试.

正如@drewag在他的回答中指出的那样,你不应该做的是编写改变全局变量的函数(或者访问相同的东西的单例).您编写的任何全局函数都应仅对其输入进行操作,并且每次都会生成完全相同的结果,无论它们何时被调用.改变全局状态的全局函数(即对全局变量进行更改(或通过引用更改传递给它们的变量的值)可能会因为可能导致的意外副作用而令人难以置信地进行调试.

编写纯全局函数有一个缺点,*就是你最终"污染命名空间" - 也就是说,你有所有这些函数可能与程序的特定部分有特定的相关性,但可以在任何地方访问.说实话,对于中型应用程序,具有良好编写的通用功能,这可能不是问题.如果函数纯粹用于特定的结构或类,可能使它成为静态方法.如果你的项目真的太大了,你可能会把你最常用的功能分解成一个单独的框架,虽然这是一个非常大的开销/学习练习(并且Swift框架还没有完全成熟),所以如果你刚刚开始,所以我建议现在离开这个,直到你变得更自信.

*编辑:确定两个缺点 - 成员函数更容易被发现(当你点击时通过自动完成.)