我们正在开发一个Swift项目。那里有一个功能,
fun getSleepAmmount() -> Int {
// calculate sleep time
// return value when valid
// else
return -1
}
我的团队成员更喜欢上面的功能,其中呼叫者需要使用-1
进行查询,这是我不满意的。我的建议是使用nil
return(尽管调用者仍需要检查可空性)进行重新设计,例如
fun getSleepAmmount() -> Int? {
// calculate sleep time
// return value when valid
// else
return nil
}
但是我的同事们不想重新设计。哪个版本的功能更干净?为什么?
答案 0 :(得分:4)
很显然,nil
更干净。因为-1
毫无意义。这只是一个魔术字。这种情况很难得到支持,重构和处理。
答案 1 :(得分:2)
第二是更好的选择
if let v = getSleepAmmount() {}
但是先有了
let v = getSleepAmmount()
if v > 0 {}
返回nil表示这不是有效的返回值,而-1可能意味着另一件事将被检查代码的新开发人员所误解
答案 2 :(得分:2)
返回nil
是一个更好的解决方案,而不是使用任何垃圾或默认值。
返回任何默认值将来可能会与实际结果发生冲突。
此外,可能还有其他开发人员在处理相同的代码。因此,使用nil
比使用-1
有更好的解释。
答案 3 :(得分:2)
如果调用方中只有在存在有效睡眠量的情况下才应运行的代码,则可选方法是更好,更清晰的方法。这正是guard let
和if let
设计的目的:
guard let sleepAmount = getSleepAmount() { else return }
// do something with sleepAmount
更好的方法是在函数内部抛出错误:
func getSleepAmmount() throws -> Int {
// calculate sleep time
// return when valid
// else
throw InvalidSleepAmount
}
然后
do {
let sleepAmount = try getSleepAmount()
// do something with it
} catch InvalidSleepAmount {
// error processing
}
(如果需要,您的函数可能会引发不同的错误,因此调用方会知道为什么睡眠量无效,SleepTooShort
,SleepTooLong
,{{1} }等)