В течение многих лет я использовал именованные блоки, чтобы ограничить область временных переменных. Я никогда не видел, чтобы это делалось в другом месте, и это заставляет меня задаться вопросом, является ли это плохая идея. Тем более, что Eclipse IDE помечает их как предупреждения по умолчанию.
Я использовал это для хорошего эффекта, я думаю, в своем собственном коде. Но поскольку это неидиоматично до такой степени, что хорошие программисты будут недоверчивы, когда они это видят, у меня действительно есть два пути отсюда:
- избегайте этого, или
- продвигать его, надеясь, что он станет идиомой.
Пример (в рамках более крупного метода):
final Date nextTuesday;
initNextTuesday: {
GregorianCalendar cal = new GregorianCalendar();
... // About 5-10 lines of setting the calendar fields
nextTuesday = cal.getTime();
}
Здесь я использую GregorianCalendar только для инициализации даты, и я хочу убедиться, что я не случайно его повторно использую.
Некоторые люди прокомментировали, что на самом деле вам не нужно называть блок. Хотя это правда, необработанный блок выглядит еще больше как ошибка, поскольку намерение неясно. Более того, называя что-то побуждает вас думать о намерении блока. Цель здесь состоит в том, чтобы идентифицировать отдельные разделы кода, а не предоставлять каждой временной переменной свою собственную область.
Многие люди прокомментировали, что лучше всего перейти к малым методам. Я согласен, что это должен быть ваш первый инстинкт. Однако могут быть несколько смягчающих факторов:
- Чтобы даже рассмотреть именованный блок, код должен быть коротким, одноразовым кодом, который никогда не будет вызываться в другом месте.
- Именованный блок - это быстрый способ организации негабаритного метода без создания одноразового метода с десятком параметров. Это особенно актуально, когда класс находится в потоке, и входы, вероятно, будут меняться от версии к версии.
- Создание нового метода поощряет его повторное использование, которое может быть необоснованным, если варианты использования не установлены. Именованный блок проще (психологически, по крайней мере) выбросить.
- Специально для модульных тестов вам может потребоваться определить дюжину различных объектов для одноразовых утверждений, и они достаточно различны, что вы не можете (пока) найти способ объединить их в небольшое количество методов, и вы не можете придумать способ отличить их от имен, которые не длинны в миле.
Преимущества использования именованной области:
- Невозможно случайно использовать временные переменные
- Ограниченная область предоставляет сборщику мусора и компилятору JIT дополнительную информацию о намерении программиста.
- Имя блока предоставляет комментарий к блоку кода, который я считаю более читаемым, чем открытые комментарии
- Легче реорганизовать код из большого метода на небольшие методы или наоборот, так как именованный блок легче отделить, чем неструктурированный код.
Недостатки:
Не идиоматично: программисты, которые не видели этого использования именованных блоков (т.е. все, кроме меня), считают это ошибкой, так как они не могут найти ссылки на имя блока. (Так же, как и Eclipse). И заставить что-то стать идиоматичным - это тяжелая битва.
Он может использоваться как предлог для плохих привычек программирования, таких как:
- Создание огромных монолитных методов, когда несколько небольших методов были бы более разборчивыми.
- Слои углубления слишком глубокие, чтобы легко читать.
Примечание. Я подробно отредактировал этот вопрос, основываясь на некоторых продуманных ответах. Спасибо!