Стандартная легальность в стиле скобок Android - PullRequest
5 голосов
/ 24 июня 2011

Чтение этой информации гласит:

Нам нужны брекеты по всему заявления для условного. Кроме, если все условно (то состояние и кузов) подходят по одному линия, вы можете (но не обязаны к) положить все это в одну строку. То есть, это законно:

if (condition) {
    body(); 
}

и это законно:

if (condition) body();

но это все еще незаконно :

if (condition)
    body();  // bad!

Почему последнее упомянуто плохо? Это смесь двух вышеперечисленных, но какова мотивация для , а не , используя такой стиль? ИМО, он самый читаемый (или равный для первого).

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

Ответы [ 6 ]

10 голосов
/ 24 июня 2011

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

if (condition)
    body();  // bad!

Я решил добавить к нему строку, чтобы сделать это:

if (condition)
    body();  // bad!
    myconditionalfcn(); // Will always execute

Два других стиля, которые у вас есть, предотвращают эту ошибку: один делает все условное условие одной строкой, а другой - вводит новую функцию в фигурные скобки.

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

3 голосов
/ 24 июня 2011

Стили кодирования являются руководящими принципами, то, что допустимо, это то, что допускает определение языка.

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

if (condition)
  body();

специально выделен, поскольку он путает отступ с исполнением, что на самом деле не является частью спецификации языка Java.Другими словами, кто-то может взглянуть на

if (condition)
  statement1();
  statement2();

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

Правильно ли разрешить

if (condition) statement1();

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

if (condition) statement1(); statement2();

, где всегда выполняется оператор2;надеясь сбить их с толку, полагая, что выполнение Statement2 каким-то образом зависит от условия.Причина, по которой

if (condition) statement1();

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

if (condition) statement1(); statement2();

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

С помощью операторов if - единственный безопасный способ убедиться, что людине связывать поведение с пробелом - это всегда вставлять фигурные скобки.

if (condition) { statement1(); } statement2();

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

Наконец,

if (condition) {
  statement1();
}
statement2();

никогда никого не смущает.Единственная возможная стоимость - хранение нескольких дополнительных пробелов и добавление пары горизонтальных печатных строк.Учитывая, сколько памяти доступно, я бы сказал, что аргумент хранилища окончательно мертв.Аргумент о недвижимости на экране все еще остается;но иногда для того, чтобы идея была ясной, стоит несколько лишних строк на экране (а экраны сегодня намного больше, чем в прошлом).Когда кто-то учитывает стоимость потраченной впустую рабочей силы на поиск «неправильных идей» из-за «умственных ошибок» при чтении кода;кажется, что несколько дополнительных фигурных скобок здесь или там могут хорошо окупаться.

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

3 голосов
/ 24 июня 2011

Это не относится к Android специально. Как и все проблемы с отступами, это вопрос вкусов. В любом случае, используя:

if (condition)
    body();  // bad!

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

if (condition) {
    body(); 
}

По следующим причинам:

  1. это совсем не двусмысленно
  2. С современными средами разработки (например, Eclipse) даже быстро писать с помощью автозаполнения
  3. В скобках быстрее добавлять другие операторы, и часто вам придется это делать.
1 голос
/ 24 июня 2011

ИМХО, когда речь идет о форматировании кода, никогда нельзя использовать такие слова, как «законный» и «незаконный».Нелегальное, на мой взгляд, это то, что действует вредно над вашим заявлением.Правильное или плохое форматирование не может вызвать сбой вашей программы, форматирование - это просто способ сделать ваш код читабельным.Если вы работаете в команде, вам следует подумать об использовании правильного форматирования, чтобы ваши товарищи по команде понимали ваш код.Когда вы работаете в одиночку, это не имеет значения, вы можете писать все что угодно, используя собственный стиль форматирования.Это только мое мнение.

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

0 голосов
/ 24 июня 2011

Для удобства чтения я предпочитаю

if (conditiontest) doOneThing();

над любым из этих

if (conditiontest) { doOneThing(); }

if (conditiontest) {
     doOneThing();  }

if (conditiontest) { 
     doOneThing(); 
     }

Это в основном только мое мнение. Но я думаю, что это увеличивает его краткость.

0 голосов
/ 24 июня 2011

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

Если вы не заинтересованы в добавлении какого-либо кода в AOSP, я бы не стал сильно беспокоиться об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...