Подтвердить что ты не робот

Стандарт/лучшие методы кодирования Java - соглашение об именах для ярлыков break/continue

Иногда помеченный перерыв или продолжение может сделать код более читаемым.

OUTERLOOP: for ( ;/*stuff*/; ) {
    //...lots of code

    if ( isEnough() ) break OUTERLOOP;
    //...more code
}

Мне было интересно, что такое общее соглашение для лейблов. Все шапки? первая крышка?

4b9b3361

Ответ 1

Если вы должны использовать их, используйте капиталы, это привлекает к ним внимание и выделяет их из-за ошибочной интерпретации имен "Class". Привлечение внимания к ним имеет дополнительное преимущество - поймать кого-то в глаза, который придет и реорганизует ваш код и удалит его.;)

Ответ 2

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

outer_loop:
for (...) {
  //  some code
  for (...) {
    //  some code
    if (...)
      continue outer_loop;
    //  more code
  }
  //  more code
}

Да, такие случаи случаются все время. Что люди, предлагающие использовать вместо этого? Булевое условие, подобное этому?

for (...) {
  //  some code
  boolean continueOuterLoop = false;
  for (...) {
    //  some code
    if (...) {
      continueOuterLoop = true;
      break;
    }
    //  more code
  }
  if (continueOuterLoop)
    continue;
  //  more code
}

Yuck! Рефакторинг как метод не облегчает это:

boolean innerLoop (...) {
  for (...) {
    //  some code
    if (...) {
      return true;
    }
    //  more code
  }
  return false;
}

for (...) {
  //  some code
  if (innerLoop(...))
    continue;
  //  more code
}

Уверен, это немного красивее, но оно все еще проходит вокруг лишнего булева. И если внутренний цикл изменяет локальные переменные, реорганизация его в метод не всегда является правильным решением.

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

Ответ 3

Соглашение состоит в том, чтобы избежать ярлыков вообще.

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

for ( ;/*stuff*/; ) 
{
    lotsOfCode();

    if ( !isEnough() )
    {
        moreCode();
    }
}

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

Ответ 4

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

Ответ 5

Я знаю, я не должен использовать метки.

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

Мо, ваша предпосылка неверна. Вопрос не должен быть "как его форматировать?"

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

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

Ответ 6

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

myLabel:

но я также видел метки с префиксом подчеркивания

_myLabel:

или с лабораторией...

labSomething:

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

Ответ 7

wrt пример кода сады:

Вы дали

outerloop:
for (...) {
  //  some code
  for (...) {
    //  some code
    if (...)
      continue outerloop;
    //  more code
  }
  //  more code
}

В качестве примера. Ты делаешь доброе дело. Мое лучшее предположение:

public void lookMumNoLabels() {
  for (...) {
    // some code
    doMoreInnerCodeLogic(...);
  }
}

private void doMoreInnerCodeLogic(...) {
   for (...) {
      // some code
      if (...) return;
   }
}

Но были бы примеры, когда такой рефакторинг не будет правильно соответствовать любой логике, которую вы делаете.

Ответ 8

Поскольку ярлыки настолько редко полезны, кажется, что нет четкого соглашения. Спецификация языка Java имеет один пример с метками, и они находятся в non_cap.

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

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

Ответ 9

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

Ответ 10

Это своего рода переход Java - не уверен, есть ли у них С#. Я никогда не использовал их на практике, я не могу придумать случай, когда их избежать не приведет к значительному чтению кода.

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