在 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,即更改方法之外的某些内容。

虽然这对代码来说不是问题,而且一切正常,但我想从测试的角度来看,你们在自己的代码中对这样的事情有什么看法?您通常在自己的代码中遵循哪些模式/更改来避免它?

再次道歉,如果这是一个太基本的问题,但我认为这将帮助我填补我的知识空白,以便能够编写更漂亮的代码,而不是在下次进行小更新时正常工作和中断的东西。 :)

谢谢

所以如果你的函数被调用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
}
}

最新更新