对可选值与默认值 -1 感到困惑
Confused about Optional vs Default value -1
我们正在 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
}
但是我的同事不想重新设计。哪个版本的功能更干净,为什么?
显然,nil
更干净。因为 -1
没有任何意义。这只是一个神奇的词。很难支持、重构和处理这种情况。
第二个更好,如你所愿
if let v = getSleepAmmount() {}
但是有了第一个
let v = getSleepAmmount()
if v > 0 {}
返回 nil 意味着这不是有效的 return 而 -1 可能意味着检查代码的新开发人员会误解的另一件事
返回 nil
是比使用任何 垃圾值或默认值 更好的解决方案。
返回任何 默认值 将来可能会与实际结果发生冲突。
此外,可能还有其他开发人员在处理相同的代码。所以,使用 nil
会比使用 -1
.
有更好的解释
如果调用者中的代码只应 运行 如果有有效的睡眠量,那么可选是更好、更清晰的方法。这正是 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
, NoSleep
等)
我们正在 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
}
但是我的同事不想重新设计。哪个版本的功能更干净,为什么?
显然,nil
更干净。因为 -1
没有任何意义。这只是一个神奇的词。很难支持、重构和处理这种情况。
第二个更好,如你所愿
if let v = getSleepAmmount() {}
但是有了第一个
let v = getSleepAmmount()
if v > 0 {}
返回 nil 意味着这不是有效的 return 而 -1 可能意味着检查代码的新开发人员会误解的另一件事
返回 nil
是比使用任何 垃圾值或默认值 更好的解决方案。
返回任何 默认值 将来可能会与实际结果发生冲突。
此外,可能还有其他开发人员在处理相同的代码。所以,使用 nil
会比使用 -1
.
如果调用者中的代码只应 运行 如果有有效的睡眠量,那么可选是更好、更清晰的方法。这正是 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
, NoSleep
等)