Использование троичного оператора только для побочного эффекта - хорошо или плохо? - PullRequest
0 голосов
/ 26 марта 2019

Предположим, что мы используем AVKit и добавили target к нашей кнопке воспроизведения / паузы для управления воспроизведением / приостановкой дорожки.Является ли вообще плохой практикой использование троичного оператора только для его побочного эффекта, например, приведенного ниже?

// (AVPlayer definition omitted)

@objc fileprivate func handlePlayPause() {

    (player.timeControlStatus == .playing) ? player.pause() : player.play()

}

Основная причина, по которой я спрашиваю это, заключается в том, что побочные эффекты изменяют состояние программыи я полагаю, что, возможно, я слышал, что вы должны внимательно относиться к побочным эффектам во время одного из моих курсов первого курса.

Ответы [ 2 ]

1 голос
/ 26 марта 2019

Лично я использую их, когда хочу установить значение переменной, в зависимости от условия.

Например, допустим, что если 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) строки.

Тернарные операторы потрясающие, но они не всегда нужны.Предположим, вы просто хотите выполнить функцию или выполнить несколько операций.не используйте троичные.

  1. Используйте троичные операторы для установки значения переменной или для уменьшения кода при необходимости.
  2. Используйте операторы if-else для всего остального.
1 голос
/ 26 марта 2019

Для такой логики, основанной на enum, я бы выбрал switch, или if/else, а не троичную, поскольку в будущем мне может понадобиться добавить туда больше кода.

Например,

if player.timeControlStatus == .playing) {
   player.pause() 
   // set a button 
} else {
   player.play()
   // un set a button 
}

Теперь вы можете сделать это и в троичном формате, но я боюсь, что это сделает код менее читабельным.

...