2010-09-01 3 views
7

Checkstyle жалуется следующее:Должны ли скобки всегда располагаться вокруг тройного оператора?

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

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

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

return null 

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

== a ? a : new A(); 

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

Кроме того, я стараюсь делать то же самое всякий раз, когда Я вижу тройного оператора, если он не сгруппирован в parens.

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

+0

мне также более читается с помощью parens. У меня был пример вроде var thing = something.prop1.method2() ....? x: y. Читая его, я впервые ожидал чего-то. Prop1.method2 - это то, что инициализирует мой var. Если бы были парнеры ... я бы подозрительно относился к трёхмерному оператору. – user420667

ответ

6

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

Я думаю, что этот код не нужно больше скобок:

int number = (myBoolean)? 1 : 2; 

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

+0

Почему вы помещаете parens вокруг 'myBoolean' в свой пример кода? Это не та же картина, что и тот, о котором спрашивают. –

+3

Хм, это привычка ... И, я думаю, это делает вещи более ясными. –

+0

Я тоже предпочитаю этот синтаксис. Кажется, что это облегчает чтение и идентификацию условного – sarink

1

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

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

2

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

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

0

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

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

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

4

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

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

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

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

1

В общем, нет.

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

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

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

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

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

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