На мою скромну думку, зазвичай виробничого коду варто уникати, оскільки ви, як правило, цього не спокушаєтесь, за винятком спорадичних функцій, які виконують різні завдання. Я схильний робити це в коді лому, який використовується для тестування речей, але не знаходжу спокуси робити це у виробничому коді, де я заздалегідь задумався про те, що повинна виконувати кожна функція, оскільки тоді ця функція, природно, матиме дуже обмежений обсяг щодо місцевого штату.
Я ніколи не бачив прикладів використання таких анонімних блоків (не включаючи умовні умови, try
блок для транзакції тощо), щоб змістовно зменшити сферу застосування функції, яка не напрошувала питання, чому вона не може розділити далі на простіші функції зі зменшеними діапазонами, якщо це дійсно виграло практично з справжньої точки зору SE з анонімних блоків. Зазвичай це еклектичний код, який робить купу дуже споріднених або дуже споріднених речей, де ми найчастіше намагаємось досягти цього.
Наприклад, якщо ви намагаєтесь це зробити для повторного використання змінної, названої 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 рядків коду більше, ніж потрібно, це може бути справжньою інженерною проблемою, але це не обов'язково проблему вирішити за допомогою анонімних блоків.
Якщо нічого іншого, використання анонімних блоків у всьому світі є екзотичним, а не ідіоматичним, а екзотичний код несе ризик бути ненависним іншим, якщо не самим, то через роки.
Практична корисність скорочення сфери застосування
Кінцева корисність скорочення сфери змінних полягає в тому, щоб ви змогли виправити управління станом правильним і підтримувати його правильним, а також дозволяти легко міркувати про те, що робить будь-яка частина бази коду - мати можливість підтримувати концептуальні інваріанти. Якщо управління локальною державою однієї функції настільки складна, що вам доведеться змусити скоротити область дії за допомогою анонімного блоку в коді, який не призначений для доопрацювання і хорошого, то знову ж таки, це для мене ознака того, що саму функцію потрібно переглядати . Якщо у вас виникли труднощі з міркуванням про стан управління змінними в області локальної функції, уявіть собі складність міркування про приватні змінні, доступні кожному методу цілого класу. Ми не можемо використовувати анонімні блоки для зменшення їх видимості. Мені це допомагає почати з визнання, що змінні, як правило, мають дещо ширший обсяг, ніж вони в ідеалі повинні мати для багатьох мов, за умови, що це не вийде з рук до того моменту, коли у вас виникнуть труднощі з підтримкою інваріантів. Це не те, щоб вирішити стільки за допомогою анонімних блоків, як я вважаю це прийняттям з прагматичної точки зору.