Можно ли использовать простой троичный случай для использования в потоке программ, если он не ухудшает читабельность? - PullRequest
2 голосов
/ 24 ноября 2011

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

if ($success) {
    $database->commit();
} else {
    $database->rollback();
}

Я рефакторинг до

$success ? $database->commit() : $database->rollback();

И я был очень доволен этим ... но что-то внутри меня заставило меня прийти сюда для информации. Исключение исключает, вы считаете это хорошим вариантом использования? Интересно, это нормально, потому что я никогда не делал этого раньше, или потому что это действительно плохая практика? Это не кажется сложным для меня, но может ли это быть трудно понять для кого-то еще? Зависит ли это от языка ... как это было бы более / менее неправильно в C, C ++ или Java?

Ответы [ 3 ]

2 голосов
/ 24 ноября 2011

Нет, все не в порядке. Вы превращаете что-то, что должно выглядеть как утверждение, в нечто, похожее на выражение. На самом деле, если commit() и rollback() возвращают void, это не скомпилируется в Java по крайней мере (не уверен насчет других упомянутых).

Если вам нужен однострочник, вам лучше создать еще один метод для объекта $database, такой как $database->endTransaction($success), который выполняет оператор if внутри.

1 голос
/ 24 ноября 2011

Я был бы более склонен использовать его в случае, если два действия являются взаимоисключающими и / или противоположными (но связаны друг с другом), например:

$success ? go_up() : go_down();

Для двух несвязанных действий я был бы менее склонен использовать его, потому что существует большая вероятность того, что одна из ветвей будет нуждаться в расширении в будущем. Если это так, вам снова нужно будет переписать его как оператор if-else. Представь, что у тебя есть:

$success ? do_abc() : do_xyz();

Если в какой-то момент вы решите, что первая ветвь также нуждается в do_def(), вам нужно будет снова переписать все это в оператор if-else.

Однако чаще используется троичный оператор:

$var = $success ? UP : DOWN;

Таким образом, вы оцениваете его как выражение, а не как утверждение.

0 голосов
/ 26 ноября 2011

Реальный вопрос: «Является ли троичная форма более или менее читаемой, чем форма if?».Я бы сказал, что нет.Но это вопрос стиля, а не функции.

...