Следует ли всегда ставить скобки вокруг тернарного оператора?

Checkstyle жалуется на следующее:

return (null == a ? a : new A());

и говорит, что скобки не нужны.

В то время как заявление, безусловно, отлично работает без них, кажется, гораздо более читаемым с ними присутствует---в противном случае, как я читаю его, я склонен видеть:

return null

сначала, а затем нужно сделать паузу, чтобы рассмотреть оставшиеся

== a ? a : new A(); 

часть, так как мой мозг уже пошел по одному пути.

кроме того, я склонен делать то же самое вещь , когда я вижу тернарный оператор, если он не сгруппирован в parens.

итак: должны ли родители вокруг троицы быть стандартом де-факто? Есть ли хоть одна причина не класть их туда?

6 ответов


ну, checkstyle прав, скобки бесполезны для выполнения. Но бесполезно для выполнения не означает бесполезно для хорошего чтения кода. Оставь их, если есть смысл читать.

Я думаю, что этот код не нуждается в скобки:

int number = (myBoolean)? 1 : 2;

но в вашем случае return ключевое слово и тот факт, что логическое выражение может изменить то, как Вы читаете инструкции.


при чтении оператора return я знаю, что все между "return " и"; " - это то, что будет возвращено, поэтому я не могу прочитать ваш образец кода как return null, за которым следуют некоторые символы, как вы утверждаете, что прочитали его.

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

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

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


нет, это не должно быть стандартом де-факто. Я предпочитаю жить без родителей.

Я думаю, что единственная причина поставить их там, чтобы заставить порядок оценки или прояснить запутанную строку.


оба варианта верны, используйте то, что использует ваша команда или что вам нравится, если вы работаете в одиночку.

IIRC по умолчанию checkstyle использует Sun'S (r.Я. p) рекомендации по стилю, поэтому, если вы хотите соответствовать стандартному стилю, послушайте его и удалите parens.


В общем, нет.

скобки не требуется вокруг троичных (также известных как условные) операторов или их разделов, потому что их приоритет настолько низок в порядке операций (чуть ниже логических операторов и выше назначений). См. ссылку ниже для полной таблицы.

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

исключения, которые могут потребовать использования паренов в троичных или вокруг них, будут:

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

  • Если ваша троица вложена в другую Троицу.

Смотрите также на MDN:


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

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

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