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