Это нормально, если я опускаю фигурные скобки на Java?

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

Во всяком случае, мой вопрос заключается в том, что важно иметь скобки? Это нормально, если я их опускаю? Пример:

for (int i = 0; i < size; i++) { a += b; } 

против

 for (int i = 0; i < size; i++) a += b; 

Я знаю, что оба они будут работать, но если я опустил скобки (что я, как правило, делаю много, из-за видимости), это что-то изменит, что-нибудь вообще? Как я уже сказал, я знаю, что это работает, я тестировал это дюжину раз, но теперь некоторые из моих назначений uni становятся все больше, и по какой-то причине у меня есть иррациональный страх, что в конечном итоге это вызывает некоторые проблемы? Есть ли причина бояться этого?

    16 Solutions collect form web for “Это нормально, если я опускаю фигурные скобки на Java?”

    Это ничего не изменит, кроме ремонтопригодности вашего кода. Я видел такой код:

     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"); } 

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

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

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

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

    Я иногда пропускаю с помощью фигурных скобок в сторожевых предложениях, чтобы сделать код более компактным. Мое требование для этого состоит в том, что они – операторы, за которыми следует инструкция перехода , например, 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»). Волшебно, ваши журналы производства теперь распечатывают информацию о кредитной карте клиента, которая видна всем сотрудникам, которые могут видеть журналы. Не дай бог, если кто-либо из них (со злым умыслом) завладеет этими данными.

    Таким образом, не давая скобки и немного небрежного кодирования часто может привести к нарушению защищенной информации. Он также classифицируется как уязвимость в JAVA CERT – Software Engineering Institure, CMU .

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

    Больше поддержки группы «всегда подтяжки» от меня. Если вы опускаете фигурные скобки для одиночных циклов / ветвей, поместите оператор в ту же строку, что и контрольный оператор,

     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"); 

    Здесь мы имеем два утверждения, но только первый оператор входит внутрь цикла, но не второй оператор.

    Если у вас несколько операторов в одном цикле, вы должны использовать фигурные скобки.

    Если вы удалите фигурные скобки, он будет читать только первую строку инструкции. Любые дополнительные строки не будут прочитаны. Если у вас есть более одной строки инструкции для выполнения 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(); } } 

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

    ИМХО, ответственность человека, написавшего код, проверить код и убедиться, что все отступы правильно, прежде чем они приступают к другим вещам.

    Interesting Posts

    Android: что такое R? Почему это так Cryptic?

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

    Когда использовать интерфейс вместо абстрактного classа и наоборот?

    Рабочий стол Google не индексирует новые электронные письма

    Несколько одновременных сеансов браузера

    Доверенные сертификаты Root регулярно исчезают в Windows 7

    Настройка цвета фона Windows в Windows 8.1 не работает

    Передача переменной между winforms

    Как создать печатную страницу Twitter-Bootstrap

    Активность OnDestroy никогда не называлась?

    Лучший способ хранения значений валюты в C ++

    Загрузка видео Youtube через i-frame в веб-обозревателе Android

    Значения наведения JavaFX LineChart

    ВСЕГДА отображает последний / стандартный пользовательский экран приветствия Windows 7

    Как заставить диспетчер задач Windows показывать сетевое использование?

    Давайте будем гением компьютера.