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

StackOverflow https://stackoverflow.com/questions/15481

  •  08-06-2019
  •  | 
  •  

Вопрос

Иногда помеченные слова break или continue могут сделать код намного более читабельным.

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

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

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

Это было полезно?

Решение

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

Другие советы

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

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
}

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

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

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

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

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

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

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

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

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

myLabel:

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

_myLabel:

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

labSomething:

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

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

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

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

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

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

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

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

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

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

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

Мо, твое предположение неверно.Вопрос не должен звучать так: "как мне их отформатировать?"

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top