Является ли это приемлемым вариантом использования тернарного оператора?

Я использовал тернарный оператор для выполнения очень простого условного действия. Это работало хорошо, но моя IDE (PHPStorm) сообщила об ошибке. Ошибка, которую я получил, была:

'void' method 'performAction' result used

Код, который я использовал, таков:

($this->doThis ? $class->performAction() : $class->performDifferentAction());

Ошибка в PHPStorm явно ошибочна; Я нигде не использую результат метода void. Я просто вызываю методы, и это работает, как и ожидалось. Я просто использовал тернарный оператор в качестве сокращения для этого:

if($this->doThis)
{
    $class->performAction();
}
else
{
    $class->performDifferentAction();
}

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

Это все-таки конструктивный недостаток?


person Sherlock    schedule 27.01.2015    source источник
comment
Это не похоже на допустимый случай - предполагается, что условный оператор что-то где-то возвращает.   -  person zerkms    schedule 27.01.2015
comment
И где я могу найти это обязательство?   -  person Sherlock    schedule 27.01.2015
comment
Это не обязанность, это здравый смысл. Выражение должно возвращать значение по определению. Если бы я был рецензентом кода для этой строки - я бы не пропустил ее.   -  person zerkms    schedule 27.01.2015


Ответы (1)


Тернарный оператор — это выражение, которое возвращает результат. Его цель — использовать, когда требуется «встроенное условие», которое в противном случае потребовало бы от вас создания одной или двух дополнительных переменных. Таким образом, всякий раз, когда вы используете тернарный оператор, вы должны использовать его результат.

Например, вы бы не написали это, не так ли?

1 + 2;  // result not used, does nothing

По сути, вы пишете такой код, но добавляете к нему побочный эффект:

1 + someFunc();  // soooo... does this do anything?

Поэтому ваша IDE настоятельно рекомендует вам явно писать код побочных эффектов, используя if..else. Это более прямо выражает то, что вы там делаете.

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

person deceze♦    schedule 27.01.2015
comment
Между вашими двумя примерами и моим есть разница. Ваш код ничего не делает; мой делает. (Ну, someFunc может что-то сделать, но 1 + явно бесполезен. В моем фрагменте нет «бесполезного» кода.) - person Sherlock; 27.01.2015
comment
В том-то и дело, делает 1 + someFunc() делает что-то или нет? Возвращаемое значение не используется, поэтому оно ничего не делает... или делает? Ваш код тот же: $foo ? 1 : bar(). Тааак.... это просто опечатка, и вы забыли использовать возвращаемое значение, или у bar() есть побочный эффект...? Все это станет намного более явным, если вы напишете if ($foo) bar(). - person deceze♦; 27.01.2015
comment
явно бесполезен --- а если бы это был язык программирования, допускающий перегрузку операторов? Будет ли это иметь больше смысла для вас? - person zerkms; 27.01.2015
comment
@Sherlock Не пропустите дополнение в моем последнем абзаце. Эти проверки нужны, чтобы помочь вам писать более качественный код и придираться к вам, когда вы можете совершать ошибку. В этом случае он не может сказать, ошибка это или намеренно, и придирается к вам. Это хорошая идея написать код учебника, который проходит все проверки, они существуют для определенной цели. Быть умным и милым редко приводит к лучшему коду. Написание кода учебника может быть скучным и многословным, но цель кода состоит в том, чтобы делать что-то и быть читабельным, а не в использовании синтаксиса языка. - person deceze♦; 27.01.2015
comment
@deceze я согласен! Вот почему я спрашиваю здесь. Мне это не показалось таким уж неправильным, но, конечно же, IDE сообщает об этом по какой-то причине. Я все еще не совсем уверен, но я уже изменил свой код на более явный вариант, прежде чем публиковать этот вопрос. - person Sherlock; 27.01.2015
comment
@Oli Я до сих пор не понимаю, почему это нечитаемо, а обычная троичная операция - нет. - person Sherlock; 27.01.2015
comment
Потому что так никто не пишет, следовательно, вы не привыкли видеть это таким, поэтому парсинг занимает больше времени. - person Oli; 27.01.2015
comment
@Шерлок, почему бы и нет? Этот код может вызывать побочные эффекты. - person zerkms; 27.01.2015
comment
@Oli: вы не привыкли видеть это таким, поэтому анализ занимает больше времени. --- вдобавок к этой 110% верной фразе: когда видишь что-то странное, начинаешь думать, что это сделано с какой-то особой целью и тратишь еще больше времени на расшифровку. - person zerkms; 27.01.2015