Это нормально, если я опущу фигурные скобки в Java? [закрытый]
Я искал это, но не мог найти ответа и по какой причине я был слишком стыдно просить профессора, из-за этого чувства, когда сотни людей смотрят на вас...
во всяком случае, мой вопрос в том, что важно иметь скобки? Это нормально, если я их опущу? Пример:
for (int i = 0; i < size; i++) {
a += b;
}
vs
for (int i = 0; i < size; i++)
a += b;
Я знаю, что оба они будут работать, но если я опущу скобки (которые я, как правило, делаю много, из-за видимости), это что-нибудь изменит вообще? Как я уже сказал, Я знаю, что это работает, я тестировал его десятки раз, но теперь некоторые из моих заданий uni становятся все больше, и по какой-то причине у меня есть иррациональный страх, что в конечном итоге это моя причина некоторых проблем? Есть ли причина бояться этого?
16 ответов:
- Это ничего не изменит вообще.помимо ремонтопригодность кода. Я видел такой код:
for (int i = 0; i < size; i++) a += b; System.out.println("foo");значит так:
for (int i = 0; i < size; i++) a += b; System.out.println("foo");... но какой должны было так:
for (int i = 0; i < size; i++) { a += b; System.out.println("foo"); }Лично Мне всегда включите скобки, чтобы уменьшить возможность путаницы при чтении или изменении кода.
соглашения о кодировании в каждой компании, в которой я работал, имеют требуется это - что не означает, что другие компании не имеют различных конвенций...
и на всякий случай вы думаете, что это никогда не будет иметь значения: я должен был исправить ошибку один раз, который был в значительной степени эквивалентен коду выше. Это было удивительно трудно заметить... (по общему признанию, это было много лет назад, до того, как я начал модульное тестирование, что, несомненно, облегчило бы диагностику).
использование фигурных скобок делает код более удобным и понятным. Так что вы должны рассмотреть их по умолчанию.
Я иногда пропускаю использование фигурных скобок на охранник П. чтобы сделать код более компактным. Мое требование для этого заключается в том, что они
ifзаявления, за которыми следует прыжок утверждение, какreturnилиthrow. Кроме того, я держу их в одной строке, чтобы привлечь внимание к идиоме, например:.if (!isActive()) return;они также применяются к коду внутри циклов:
for (...) { if (shouldSkip()) continue; ... }и к другим условиям перехода от методов, которые не обязательно находятся в верхней части тела метода.
некоторые языки (например, Perl или Ruby) имеют вид условный оператор, где фигурные скобки не применяются:
return if (!isActive()); // or, more interestingly return unless (isActive());Я считаю, что это эквивалентно что я только что описал, но явно поддерживается язык.
нет никакой разницы. Основная проблема со второй версией заключается в том, что вы можете написать следующее:
for (...) do_something(); do_something_else();когда вы обновляете этот метод, думая, что
do_something_else()вызывается внутри цикла. (И это приводит к головокружительным сеансам отладки.)есть вторая проблема, что версия скобки не имеет, и его, возможно, еще труднее обнаружить:
for (int i=0; i<3; i++); System.out.println("Why on earth does this print just once?");Так что держите скобки, если у вас нет веской причины, это всего лишь несколько нажатий клавиш больше.
Если у вас есть один оператор, вы можете опустить скобки, для более чем одного оператора скобки необходимы для объявления блока кода.
при использовании скобок вы объявляете блок кода:
{ //Block of code }скобки должны использоваться также только с одним оператором, когда вы находитесь в ситуации вложенного оператора для улучшения читаемости, например:
for( ; ; ) if(a == b) doSomething()это более читабельно написано в скобках также, если нет необходимости :
for( ; ; ) { if(a == b) { doSomething() } }
Если вы используете скобки ваш код более читабельным. И если вам нужно добавить какой-то оператор в том же блоке вы можете избежать возможных ошибок
Я думаю, что потеря фигурных скобок хороша, если вы также используете автоматический формат, потому что ваш отступ всегда правильный, поэтому будет легко обнаружить любые ошибки таким образом.
говорить, что оставлять фигурные скобки плохо, странно или нечитабельно, просто неправильно, так как весь язык основан на этой идее, и он довольно популярен (python).
но я должен сказать, что без использования форматирования, это может быть опасно.
в большинстве случаев, ответы, упомянутые до сих пор верны. Но есть некоторые недостатки с точки зрения безопасности вещи. Работая в платежной команде, безопасность является гораздо более сильным фактором, который мотивирует такие решения. Допустим у вас есть следующий код:
if( "Prod".equals(stage) ) callBankFunction ( creditCardInput ) else callMockBankFunction ( creditCardInput )теперь допустим у вас этот код не работает из-за какой-то внутренней проблемы. Вы хотите проверить вход. Таким образом, Вы делаете следующее изменение:
if( "Prod".equals(stage) ) callBankFunction ( creditCardInput ) else callMockBankFunction ( creditCardInput ) Logger.log( creditCardInput )скажем, вы исправить проблема и развернуть этот код (и, возможно, рецензент и вы думаете, что это не вызовет проблемы, так как его не внутри условия "Prod"). Волшебным образом, ваши производственные журналы теперь печатают информацию о кредитной карте клиента, которая видна всем сотрудникам, которые могут видеть журналы. Не дай бог, если кто-то из них (со злым умыслом) завладеет этими данными.
таким образом, не давая скобки и немного небрежное кодирование часто может привести к нарушению защищенной информации. Он также классифицируется как уязвимость в JAVA от CERT-Software Engineering Institution, CMU.
использование скобок в будущем доказывает код против более поздних модификаций. Я видел случаи, когда скобки были опущены, а кто-то позже добавил какой-то код и не вставил скобки в то время. В результате код, который они добавили, не вошел в раздел, который они думали, что это так. Поэтому я думаю, что ответ заключается в том, что его хорошая практика в свете будущих изменений в коде. Я видел, что группы программного обеспечения принимают это как стандарт, т. е. всегда требуют скобок даже с однострочными блоками по этой причине.
больше поддержки для группы "всегда фигурные скобки" от меня. Если вы опускаете фигурные скобки для циклов/ветвей с одним оператором, помещаете оператор в ту же строку, что и оператор control,
if (condition) doSomething(); for(int i = 0; i < arr.length; ++i) arr[i] += b;таким образом, сложнее забыть о вставке фигурных скобок при расширении тела. Тем не менее, используйте кудри в любом случае.
результат мудрый, это то же самое.
только две вещи, чтобы рассмотреть.
- Ремонтопригодность Код
- Слабо связанный код. (может выполнять что-то еще. потому что вы не указали область для цикла. )Примечание: В моем наблюдении, если это цикл с в цикле. Внутренняя петля без брекетов также безопасна. Результат не изменится.
Если у вас есть только один оператор внутри цикла, это то же самое.
например, см. следующий код:
for(int i=0;i<4;i++) System.out.println("shiva");у нас есть только один оператор в коде выше. так что никаких проблем
for(int i=0;i<4;i++) System.out.println("shiva"); System.out.println("End");здесь у нас есть два оператора, но только первый оператор входит в цикл, но не второй оператор.
Если у вас есть несколько инструкций в одном цикле вы должны использовать фигурные скобки.
Если вы удалите фигурные скобки, он будет читать только первую строку инструкции. Никакие дополнительные строки не будут прочитаны. Если у вас есть более 1 строки инструкции для выполнения pls используйте фигурную скобку - иначе будет выдано исключение.
использование избыточных фигурных скобок для утверждения, что код более ремонтопригоден, поднимает следующий вопрос: если ребята, пишущие, задающиеся вопросом и продолжающие поддерживать код, имеют проблемы, подобные описанным ранее (связанные с отступом или связанные с читаемостью), возможно, они вообще не должны программировать...
Это должно быть рефлекс, чтобы переформатировать код, а также... это, конечно, для профессиональных программистов в профессиональных командах
вероятно, лучше всего использовать фигурные скобки везде для простого факта, что отладка этого была бы крайней неприятностью. Но с другой стороны, одна строка кода не обязательно нуждается в скобках. Надеюсь, это поможет!
В настоящее время очень легко повторно отступать коды, чтобы узнать, какой блок кодов находится в каком
ifилиfor/while. Если вы настаиваете на том, что повторный отступ трудно сделать, то скобки, помещенные в неправильный отступ, могут смутить вас одинаково плохо.for(int i = 0; i < 100; i++) { if(i < 10) { doSomething(); } else { for(int j = 0; j < 5; j++) { doSomethingElse(); } }}если вы делаете это везде, ваш мозг будет разрушаться в кратчайшие сроки. Даже с помощью скобок вы зависите от отступа, чтобы визуально найти начало и конец блоков кода.
если вмятина важно, тогда вы уже должны написать свой код в правильном отступе, поэтому другим людям не нужно повторно отступать ваши коды для правильного чтения.
если вы хотите утверждать, что предыдущий пример слишком поддельный / преднамеренный, и что скобки существуют, чтобы захватить проблему небрежного отступа (особенно при копировании / вставке кодов), то подумайте об этом:
for(int i = 0; i < 100; i++) { if(i < 10) { doSomething(); } else { for(int j = 0; j < 5; j++) { doSomethingElse(); } }Да, это выглядит менее серьезно, чем в предыдущем примере, но вы все равно можете запутаться в таких вдавливание.
ИМХО, это ответственность человека, пишущего код, чтобы проверить через код и убедитесь, что вещи отступы правильно, прежде чем они приступают к другим вещам.
Comments