Стандарт Java / лучшие практики - соглашение об именах для меток перерыва / продолжения - PullRequest
19 голосов
/ 19 августа 2008

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

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

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

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

Ответы [ 10 ]

34 голосов
/ 19 августа 2008

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

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
}

Тьфу! Рефакторинг его как метода тоже не уменьшает:

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

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

Конечно, он немного красивее, но он все еще распространяется вокруг лишнего логического значения. И если внутренний цикл модифицировал локальные переменные, рефакторинг его в метод не всегда является правильным решением.

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

16 голосов
/ 19 августа 2008

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

14 голосов
/ 19 августа 2008

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

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

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

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

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

7 голосов
/ 20 августа 2008

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

2 голосов
/ 19 августа 2008

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

myLabel:

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

_myLabel:

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

labSomething:

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

1 голос
/ 20 августа 2008

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

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

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

1 голос
/ 19 августа 2008

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

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

0 голосов
/ 19 августа 2008

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

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

Мо, твоя предпосылка ошибочна. Вопрос не должен быть «как мне их отформатировать?»

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

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

0 голосов
/ 19 августа 2008

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

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

0 голосов
/ 19 августа 2008

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

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