По моему скромному мнению, это обычно следует избегать в основном для производственного кода, потому что у вас, как правило, нет соблазна делать это, за исключением отдельных функций, выполняющих разрозненные задачи. Я склонен делать это в некотором коде, используемом для тестирования, но не вижу соблазна сделать это в производственном коде, где я заранее подумал о том, что должна делать каждая функция, так как тогда функция, естественно, будет иметь очень ограниченный охват в отношении его местного состояния.
Я никогда не видел примеров использования анонимных блоков (не включая условные выражения, try
блок для транзакции и т. Д.) Для значительного уменьшения области действия в функции, которая не задала вопрос о том, почему она не может разделить далее на более простые функции с уменьшенной областью действия, если это действительно принесло пользу практически с подлинной точки зрения SE от анонимных блоков. Обычно это эклектичный код, который делает кучу слабо связанных или очень не связанных вещей, к которым мы наиболее склонны достигать этого.
Например, если вы пытаетесь сделать это, чтобы повторно использовать переменную с именем count
, то это предполагает, что вы считаете две разные вещи. Если имя переменной будет таким же коротким, как count
для меня, имеет смысл связать его с контекстом функции, которая потенциально может просто считать один тип вещи. Затем вы можете мгновенно посмотреть на имя функции и / или документацию, увидеть count
и мгновенно узнать, что это означает в контексте того, что делает функция, не анализируя весь код. Я не часто нахожу хороший аргумент для функции для подсчета двух разных вещей, использующих одно и то же имя переменной таким образом, что анонимные области / блоки становятся такими привлекательными по сравнению с альтернативами. Это не значит, что все функции должны учитывать только одну вещь. Я говорю, что вижу малоинженерная выгода для функции, использующей одно и то же имя переменной для подсчета двух или более элементов и использующей анонимные блоки для ограничения объема каждого отдельного подсчета. Если функция проста и понятна, это еще не конец света, когда две переменные count будут иметь разные имена, а первая может иметь на несколько строк видимости области видимости больше, чем это требуется в идеале. Такие функции, как правило, не являются источником ошибок, в которых отсутствуют такие анонимные блоки, чтобы еще больше уменьшить минимальный объем своих локальных переменных.
Не предложение для лишних методов
Это не означает, что вы должны принудительно создавать методы, просто чтобы уменьшить область. Возможно, это так же плохо или хуже, и то, что я предлагаю, не должно вызывать потребность в неуклюжих частных «вспомогательных» методах больше, чем потребность в анонимных областях. Мы слишком много думаем о коде, как он есть сейчас, и о том, как уменьшить область видимости переменных, а не о том, как концептуально решить проблему на уровне интерфейса способами, которые естественным образом обеспечивают чистую, короткую видимость состояний локальных функций без глубокого вложения блоков. и 6+ уровней отступа. Я согласен с Бруно в том, что вы можете помешать удобочитаемости кода, принудительно вставляя 3 строки кода в функцию, но это начинается с предположения о том, что вы развиваете функции, которые вы создаете на основе существующей реализации, вместо того, чтобы проектировать функции без запутывания в реализациях. Если вы сделаете это последним способом, я обнаружил небольшую потребность в анонимных блоках, которые не преследуют никакой цели, кроме сокращения области видимости переменной в данном методе, если только вы не ревностно пытаетесь уменьшить область действия переменной всего на несколько строк безвредного кода где экзотическое введение этих анонимных блоков, возможно, вносит столько интеллектуальных издержек, сколько и устраняет.
Попытка уменьшить минимальные области еще больше
Если целесообразно сократить область видимости локальных переменных до абсолютного минимума, тогда должно быть широкое признание такого кода:
ImageIO.write(new Robot("borg").createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize())), "png", new File(Db.getUserId(User.handle()).toString()));
... поскольку это приводит к минимальной видимости состояния, даже не создавая переменные для ссылки на них в первую очередь. Я не хочу показаться догматичным, но на самом деле я думаю, что прагматичное решение состоит в том, чтобы избегать анонимных блоков, когда это возможно, точно так же, как избегать чудовищной строки кода выше, и если они кажутся абсолютно необходимыми в производственном контексте из с точки зрения корректности и поддержки инвариантов внутри функции, тогда я определенно думаю, что стоит разобрать, как вы организуете свой код в функции и разрабатываете свои интерфейсы. Естественно, если ваш метод имеет длину 400 строк, а область видимости переменной на 300 строк кода больше, чем нужно, это может стать настоящей инженерной проблемой, но это не обязательно проблема с анонимными блоками.
Если ничто иное, использование анонимных блоков повсюду - это экзотика, а не идиоматизм, а экзотический код несет в себе риск быть ненавидимым другими, если не вами, годы спустя.
Практическая полезность уменьшения объема
Конечная полезность сокращения области видимости переменных состоит в том, чтобы вы могли правильно управлять состоянием и сохранять его корректным, а также легко рассуждать о том, что делает любая конкретная часть кодовой базы - чтобы иметь возможность поддерживать концептуальные инварианты. Если локальное управление состоянием отдельной функции настолько сложно, что вам нужно принудительно уменьшить область действия с помощью анонимного блока в коде, который не предназначен для доработки и исправления, тогда, опять же, это признак того, что сама функция должна быть пересмотрена , Если вам сложно рассуждать об управлении состоянием переменных в локальной области функций, представьте себе сложность рассуждения о частных переменных, доступных для каждого метода целого класса. Мы не можем использовать анонимные блоки, чтобы уменьшить их видимость. Для меня это помогает начать с принятия того факта, что переменные, как правило, имеют немного более широкую область действия, чем они в идеале должны иметь во многих языках, при условии, что они не выйдут из-под контроля до такой степени, что вам будет трудно поддерживать инварианты. Это не то, что нужно решать столько с анонимными блоками, сколько я вижу это как принятие с прагматической точки зрения.