Java стандарт кодирования / наилучшей практики - соглашение об именовании для перерыва / продолжающие этикетки

голоса
19

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

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

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

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

Задан 19/08/2008 в 02:18
источник пользователем
На других языках...                            


10 ответов

голоса
33

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

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
}

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

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

Ответил 19/08/2008 в 10:46
источник пользователем

голоса
16

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

Ответил 19/08/2008 в 04:41
источник пользователем

голоса
15

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

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

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

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

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

Ответил 19/08/2008 в 02:41
источник пользователем

голоса
6

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

Ответил 20/08/2008 в 12:19
источник пользователем

голоса
1

Как этикетки настолько редко полезно, оказывается, что нет четкой конвенции. Спецификация Java языка имеет один пример с этикетками, и они находятся в non_cap.

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

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

Ответил 20/08/2008 в 10:17
источник пользователем

голоса
1

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

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

Ответил 19/08/2008 в 11:10
источник пользователем

голоса
1

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

myLabel:

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

_myLabel:

или лаборатории ...

labSomething:

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

Ответил 19/08/2008 в 09:25
источник пользователем

голоса
1

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

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

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

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

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

Ответил 19/08/2008 в 04:50
источник пользователем

голоса
0

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

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

Ответил 19/08/2008 в 04:49
источник пользователем

голоса
0

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

Ответил 19/08/2008 в 04:24
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more