ios - 在 ios swift 代码中更新属性同时保持函数尽可能纯净和可测试的方法?
问题描述
长期在这里的 IOS 开发人员/修补程序。我主要是自学编程,过去是 OBJ-C,现在是 Swift。所以如果我问的东西太基础了,请提前道歉,部分原因是我可能不精通一些基础知识。
我目前正在开发一个应用程序。除此之外,我一直在阅读有关编写可测试代码和一般测试的大量内容。我不是在谈论纯粹的 TDD,但我希望我为应用程序创建的库有一个好的测试集可用。部分原因是它的良好做法,部分原因是我想学习做得更好。
所以在这里,在我的应用程序类中,我有许多函数可以接收参数并给出输出(就像你做的那样!)。然而,这些函数中的一些也会对类属性进行更改,因为这些属性中的数据将在其他类函数中使用。例如:
class SomeClass() {
var someArrayProperty: [String] = []
var someInputParameter: String
init(input: String) {
//some initialisation code
self.someInputParameter = input
//Call function to build object
let object = self.buildObject(inputParameter: self.someInputParameter)
}
func buildObject(inputParameter: String) -> SomeObject {
let objectToReturn = SomeObject(withInputParameter: inputParameter)
let stringToAddToArray = "Object 1 created"
self.someArrayProperty.append(stringToAddToArray)
return objectToReturn
}
}
根据我对测试的了解,理想情况下,代码应该完成一项工作,并且不会更改代码之外的某些内容,因为它对于复杂的代码变得不可测试。在这里,我遇到的问题是我直接someArrayProperty
在方法内更改 from,即在方法之外更改某些内容。
尽管这对代码来说不是问题并且一切正常,但我想从您自己的代码中的测试角度了解你们对此类事情的感受?您通常在自己的代码中遵循哪些模式/更改来避免它?
再次道歉,如果它是一个太基本的问题,但我认为这将帮助我填补我的知识空白,以便能够编写更漂亮的代码,而不是在下次某个地方完成小更新时正常工作和中断的东西。:)
谢谢
解决方案
因此,如果您的函数被调用buildObject
,它应该在其中完成工作并且没有任何return
价值。但是如果你调用它buildedObject
,它应该返回构造对象。您可以在Apple 命名方法文档中了解更多信息。
所以你的代码应该是这样的:
class SomeClass() {
var someArrayProperty: [String] = []
var someInputParameter: String
init(input: String) {
//some initialisation code
self.someInputParameter = input
//Call function to build object
let object = self.buildedObject(inputParameter: self.someInputParameter)
// Other code which modifies data
let stringToAddToArray = "Object 1 created"
self.someArrayProperty.append(stringToAddToArray)
}
func buildedObject(inputParameter: String) -> SomeObject {
let objectToReturn = SomeObject(withInputParameter: inputParameter)
return objectToReturn
}
}
推荐阅读
- ssl - Traefik+Swarm+LetsEncrypt = acme:错误:400 无法为域生成证书
- python - 我如何使用 PyInstaller 来转换同时导入脚本或包的 python 脚本
- mariadb - MariaDB SphinxSE 不接受权重参数
- sql - Postgres jsonb 查询动态值
- grails - 如何使用 shiro 在 grails 2.0 中实现 BasicHttpAuthentication?有什么亮眼的例子吗?
- firefox - 我在哪里可以下载 Firefox 调试器显示的所有文件?
- reactjs - 如何有条件地告诉 TypeScript 使用哪种数据类型?
- linux - 格式化脚本输出
- jenkins - 我如何使用更新的 JenkinsFile 重新启动 jenkins 管道
- dictionary - 如何更改字典中的每个键