使用三元运算符只是为了副作用——好还是坏?
Using ternary operator just for the side effect - Good or Bad?
假设我们正在使用 AVKit
并且我们在 play/pause 按钮中添加了一个 target
来处理 playing/pausing的轨道。仅仅为了副作用而使用三元运算符通常是不好的做法吗,如下所示?
// (AVPlayer definition omitted)
@objc fileprivate func handlePlayPause() {
(player.timeControlStatus == .playing) ? player.pause() : player.play()
}
我问这个问题的主要原因是副作用会改变程序的状态,我相信我可能听说过在我第一年的课程中你应该小心处理副作用。
对于这种逻辑,基于 enum
,我会选择 switch
,或者 if/else
而不是三元,因为将来我可能需要放更多代码在里面
例如
if player.timeControlStatus == .playing) {
player.pause()
// set a button
} else {
player.play()
// un set a button
}
现在您也可以在三进制中执行此操作,但我担心这会降低代码的可读性。
就个人而言,当我想根据条件为变量设置值时,我会使用它们。
例如,如果x == 42
,我希望变量y
为true
。如果 x
不等于 42 ,那么变量 y
的值是 false
.
那么,我该怎么写呢?就这样……
let y = (x == 42) ? true : false
对于if-else
,我会争论并反对它。
为什么?看看这段代码:
var y = false
if (x == 42) {
y = true
}
所以我们可以有这样的东西,假设你希望它在一行中:
var y = false if (x == 42) { y = true }
这是丑陋且不必要的,因为我们可以这样写:
let y = (x == 42) ? true : false
干净多了!我们将七 (4) 行代码减少到一 (1) 行。
三元运算符很棒,但并不总是需要它们。假设你只想执行一个函数,或者做多个操作。不要使用三元组。
- 使用三元运算符为变量设置值,或在必要时减少代码。
- 对其他一切使用 if-else 语句。
假设我们正在使用 AVKit
并且我们在 play/pause 按钮中添加了一个 target
来处理 playing/pausing的轨道。仅仅为了副作用而使用三元运算符通常是不好的做法吗,如下所示?
// (AVPlayer definition omitted)
@objc fileprivate func handlePlayPause() {
(player.timeControlStatus == .playing) ? player.pause() : player.play()
}
我问这个问题的主要原因是副作用会改变程序的状态,我相信我可能听说过在我第一年的课程中你应该小心处理副作用。
对于这种逻辑,基于 enum
,我会选择 switch
,或者 if/else
而不是三元,因为将来我可能需要放更多代码在里面
例如
if player.timeControlStatus == .playing) {
player.pause()
// set a button
} else {
player.play()
// un set a button
}
现在您也可以在三进制中执行此操作,但我担心这会降低代码的可读性。
就个人而言,当我想根据条件为变量设置值时,我会使用它们。
例如,如果x == 42
,我希望变量y
为true
。如果 x
不等于 42 ,那么变量 y
的值是 false
.
那么,我该怎么写呢?就这样……
let y = (x == 42) ? true : false
对于if-else
,我会争论并反对它。
为什么?看看这段代码:
var y = false
if (x == 42) {
y = true
}
所以我们可以有这样的东西,假设你希望它在一行中:
var y = false if (x == 42) { y = true }
这是丑陋且不必要的,因为我们可以这样写:
let y = (x == 42) ? true : false
干净多了!我们将七 (4) 行代码减少到一 (1) 行。
三元运算符很棒,但并不总是需要它们。假设你只想执行一个函数,或者做多个操作。不要使用三元组。
- 使用三元运算符为变量设置值,或在必要时减少代码。
- 对其他一切使用 if-else 语句。