Стандарт кодирования Java / лучшие практики - соглашение об именовании меток break / continue
-
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 #.Я никогда не использовал их на практике, я не могу припомнить случая, когда отказ от них не привел бы к гораздо более удобочитаемому коду.
Но если вам нужно - я думаю, все заглавные буквы в порядке.Большинство людей не будут использовать помеченные разрывы, поэтому, когда они увидят код, заглавные буквы бросятся им в глаза и заставят понять, что происходит.
Я знаю, мне не следует использовать ярлыки.
Но просто предположим, что у меня есть некоторый код, который мог бы значительно улучшить читаемость за счет помеченных разрывов, как мне их отформатировать?
Мо, твое предположение неверно.Вопрос не должен звучать так: "как мне их отформатировать?"
Ваш вопрос должен звучать так: "У меня есть код, который содержит большое количество логики внутри циклов - как мне сделать его более читабельным?"
Ответ на этот вопрос заключается в том, чтобы разделить код на отдельные функции с правильными именами.Тогда вам вообще не нужно помечать разрывы.