быстрый код на java
Приёмы и хитрости начинающего Java-программиста
Приёмы и хитрости начинающего Java-программиста
эксперт по разработке ПО компании «Рексофт»
В этой статье собрана небольшая коллекция практик, трюков и подсказок, с помощью которых вы сэкономите своё время при изучении Java и написании кода на этом языке программирования.
Организация работы
Чистый код
В крупных проектах на первый план выходит не создание нового кода, а поддержка существующего, поэтому очень важно с самого начала его правильно организовать. При разработке нового приложения всегда помните о трех основных принципах чистого и поддерживаемого кода:
Работа с ошибками
Stack Trace (Трассировка стека)
Выявление ошибок — это, пожалуй, самая трудоемкая часть процесса разработки на Java. Трассировка стека позволяет вам точно отслеживать, где именно в проекте возникла ошибка или исключение (exception).
NullPointerException
Исключения, возникающие из-за null значений ( NullPointerException ), довольно часто появляются при попытке вызвать метод у несущестующего объекта.
Возьмем для примера следующий код:
Прим. перев. А вот пример от меня как переводчика материала:
Дата и Время
System.currentTimeMillis или System.nanoTime?
В Java есть два стандартных способа проведения операций со временем, и не всегда ясно, какой из них следует выбрать.
Метод System.currentTimeMillis() возвращает текущее количество миллисекунд с начала эры Unix в формате Long. Его точность составляет от 1 до 15 тысячных долей секунды в зависимости от системы.
Метод System.nanoTime() имеет точность до одной миллионной секунды (наносекунды) и возвращает текущее значение наиболее точного доступного системного таймера.
Таким образом, метод System.currentTimeMillis() лучше применять для отображения и синхронизации абсолютного времени, а System.nanoTime() для измерения относительных интервалов времени.
Валидация Даты из строки
Пример его использования:
Строки
Оптимизация строки
Для конкатенации (сложения) строк в Java используется оператор «+», для примера, в цикле for новый объект может создаваться для каждой новой строки, что приводит к потере памяти и увеличению времени работы программы.
Необходимо избегать создания Java строк через конструктор, пример:
Одинарные и двойные кавычки
Что ты ожидаешь в результате выполнения этого кода?
Казалось бы, строка должна возвращать «HaHa», но на самом деле это будет «Ha169».
Двойные кавычки обрабатывают символы как строки, но одинарные кавычки ведут себя иначе. Они преобразуют символьные операнды ( ‘H’ и ‘a’ ) в целые значения посредством расширения примитивных типов — получается 169.
Математика
Float или Double?
Программисты часто не могут выбрать необходимую точность для чисел с плавающей запятой. Float требует всего 4 байта, но имеет только 7 значащих цифр, а Double в два раза точнее (15 цифр), но в два раза прожорливее.
Фактически, большинство процессоров могут одинаково эффективно работать как с Float, так и с Double, поэтому воспользуйтесь рекомендацией Бьорна Страуструпа (автор языка С++):
Выбор правильной точности для решения реальных задач требует хорошего понимания природы машинных вычислений. Если у вас его нет, либо посоветуйтесь с кем-нибудь, либо изучите проблему самостоятельно, либо используйте Double и надейтесь на лучшее.
Проверка на нечетность
Можно ли использовать этот код для точного определения нечетного числа?
Он не только решает проблему отрицательных чисел, но и работает более производительно, чем предыдущий метод. Арифметические и логические операции выполняются намного быстрее, чем умножение и деление.
Возведение в степень
Возвести число в степень можно двумя способами:
Использование библиотечной функции рекомендуется только в случае крайней необходимости, например, в случае дробной или отрицательной степени.
Простое умножение в Java работает в 300-600 раз эффективнее, кроме того, его можно дополнительно оптимизировать:
JIT оптимизация
Код Java обрабатывается с использованием JIT-компиляции: сначала он транслируется в платформенно-независимый байт-код, а затем в машинный код. При этом оптимизируется все возможное, и разработчик может помочь компилятору создать максимально эффективную программу.
В качестве примера рассмотрим две простые операции:
Давайте измерим время выполнения каждого из них:
Запустив этот код несколько раз, мы получим примерно следующее:
Схема очевидна: группировка переменных в круглые скобки ускоряет работу программы. Это связано с генерацией более эффективного байт-кода при умножении одинаковых значений.
Вы можете узнать больше об этом эксперименте здесь. Или можете провести свой собственный тест, используя онлайн-компилятор Java.
Быстрый старт в Java: от установки необходимого софта до первой программы
Как вы знаете, Java — один из самых популярных языков программирования в мире и его знание существенно увеличит вашу значимость как программиста. Итак, вы решили начать писать на этом языке. Вам понадобится поставить JDK для того, чтобы писать и запускать программы на Java. JDK — набор софта, разработанного Oracle, содержащий в себе компилятор (javac), среду выполнения (Java Runtime Environment), стандартную библиотеку языка, примеры и документацию. Прочитав эту статью, вы узнаете, как установить и настроить JDK на своей системе, что такое среда разработки и какие варианты IDE существуют для Java. Также вы напишете свою первую программу на Java.
Установка Java Development Kit
Итак, вы установили Java Development Kit, но это еще не всё. Необходимо настроить его для вашей системы.
Настройка JDK на примере Windows
После установки JDK и JRE не помешает установить на компьютер одну из IDE.
Установка IDE
Для начала разберёмся, что такое IDE.
IDE (Integrated Development Environment) — это комплекс программных средств, используемый программистами для разработки программного обеспечения. IDE позволяет с лёгкостью писать, запускать, отлаживать и тестировать код.
Для написания сложных программ целесообразно использовать IDE. Мы рассмотрим наиболее популярные.
Блокнот
Да, и в блокноте можно писать код! Для разработки вам потребуется всего лишь установить JDK и указать путь к ней. Пишете код в блокноте, компилируете с помощью командной строки. Тем не менее, для разработки сложных программ это не самый лучший вариант из-за отсутствия каких-либо дополнительных возможностей, присутствующих в продвинутых IDE.
NetBeans
NetBeans — выбор профессиональных Java-разработчиков. В ней есть уникальные возможности и инструменты, которые позволят вам сделать вашу программу кроссплатформенной, а код удобочитаемым. NetBeans поддерживает не только Java, но и другие языки программирования для десктоп- и веб-разработки. Она полностью бесплатна, скачать её можно с официального сайта. Вот лишь некоторые её возможности:
Eclipse
Eclipse, как и Netbeans — одна из наиболее популярных IDE. Она предоставляет впечатляющий интуитивно понятный интерфейс и производительную среду разработки, позволяющую комфортно разрабатывать приложения на Java. Скачать Eclipse можно бесплатно с официального сайта. Преимущества:
IntelliJ IDEA
IntelliJ IDEA — известная IDE для Java, написанная, как ни странно, на Java. Укомплектована уникальными инструментами и позволяет без проблем ориентироваться в программе. Нахождение ошибок и отладка кода никогда не были такими легкими, как с IntelliJ IDEA.
JCreator
JCreator — продвинутая и самая быстрая IDE для Java, написанная на C++.
Пишем свою первую программу
Итак, вы установили и настроили JDK, JRE и IDE для Java. Каков следующий шаг? Конечно же, написать программу, чтобы окончательно убедиться, что всё работает и вы готовы к изучению языка. Вы познакомитесь с базовой структурой кода на Java и создадите свою первую программу! Стоит отметить, что перед изучением Java следует ознакомиться хотя бы с самыми простыми принципами объектно-ориентированного программирования.
Структуру программы на Java можно представить так:
Структура программы на Java
В файле с исходным кодом содержится несколько классов — это части программы, имеющие определённые функции. Хорошей практикой считается разбиение программы на несколько файлов с исходным кодом, каждый со своим назначением. В классах содержатся методы — действия, которые могут выполнять объекты данного класса. В методе содержатся команды, с помощью которых вы можете получить желаемый результат.
13 сентября – 9 октября, Санкт-Петербург и онлайн, Беcплатно
Перед тем, как приступить к созданию программы, необходимо создать проект, а в нём и файл, в котором будет содержаться ваш код. Рассмотрим создание проекта на IDE Eclipse, но в остальных IDE процесс отличается не сильно. Cверху выберите «File», затем наведите курсор на «New», в открывшемся меню выберите «Java Project». В появившемся окне введите имя проекта и другие нужные вам настройки (если не уверены, что делать, то можно просто оставить все как есть) и нажмите «Next». Готово, вы создали проект! Осталось лишь создать в нём класс, в котором вы напишете свою первую программу. Щёлкните правой кнопкой мыши по вашему проекту (он должен появиться справа) и выберите «New» → «Class». Присвойте новому классу имя (в данном примере — это first ) и нажмите «Finish».
Приступим к написанию вашей первой программы. По традиции — это программа, выводящая на экран «Hello, world!».
Разберём по частям написанное нами:
Хорошо, вы написали вашу первую программу. Теперь её надо запустить. Для этого просто нажмите белую стрелочку в зеленом кружке на верхней панели (при наведении курсора на неё должно высветиться «Run»). После нажатия внизу откроется консоль, в которой вы увидите сообщение «Hello, world»! Поздравляю, вы написали вашу первую программу на Java и готовы погрузиться в увлекательный мир этого языка!
Полезные ссылки для дальнейшего изучения
Вот несколько ресурсов, которые помогут вам в изучении Java:
Хинт для программистов: если зарегистрируетесь на соревнования Huawei Cup, то бесплатно получите доступ к онлайн-школе для участников. Можно прокачаться по разным навыкам и выиграть призы в самом соревновании.
Перейти к регистрации
Java: краткое руководство для начинающих. Пишем простое приложение без опыта программирования
Java: краткое руководство для начинающих. Пишем простое приложение без опыта программирования
консультант по программным продуктам Oracle Центра технической поддержки компании РДТЕХ
Java – один из самых востребованных языков программирования в мире и один из двух официальных языков программирования, используемых в разработке Android (другой – Kotlin). Разработчики, знакомые с Java, весьма востребованы и способны создавать широкий спектр различных приложений, игр и инструментов. С помощью этой краткой статьи по Java для начинающих вы сможете сделать свои первые шаги к тому, чтобы стать одним из таких разработчиков. Мы рассмотрим все, что вам нужно знать, чтобы начать работу, и поможем вам создать свое первое простое приложение.
Что такое Java?
Java-это объектно-ориентированный язык программирования, разработанный компанией Sun Microsystems в 1990-х годах (позже купленной Oracle).
Понятие «объектно-ориентированный» относится к способу написания структурного кода Java, а именно: разделение кода на так называемые «классы», которые запускаются вместе, чтобы обеспечить согласованное порождение объектов. Мы обсудим это позже, но достаточно сказать, что это приводит к универсальному и организованному коду, который легко редактировать и перепрофилировать.
Java находится под влиянием C и C++, поэтому она имеет много общего с этими языками (и C#). Одним из больших преимуществ Java является то, что он «платформенно-независимый». Это означает, что код, который вы пишете на одной платформе, можно легко запустить на другой. Это называется принципом «пишем один раз, запускаем где угодно» (хотя на практике это не всегда так просто, как кажется).
Чтобы запустить и использовать Java, вам нужно три вещи:
Виртуальная машина Java (JVM) гарантирует, что у ваших приложений Java есть доступ к минимальным ресурсам, необходимым для их запуска. Именно благодаря JVM программы Java так легко запускаются на разных платформах.
9–10 октября, Москва и онлайн, Беcплатно
Среда исполнения Java (JRE) предоставляет собой «контейнер» для всех этих элементов и кода для запуска приложения. JDK – это «компилятор», который интерпретирует сам код и выполняет его. В JDK также есть инструменты разработчика, необходимые для написания кода Java (как и следует из названия).
Хорошая новость заключается в том, что разработчикам нужно только позаботиться о загрузке JDK, поскольку он поставляется вместе с двумя другими компонентами.
Как начать писать на Java
Если вы планируете разрабатывать приложения на Java на своем настольном компьютере, то вам нужно будет загрузить и установить JDK.
Вы можете получить последнюю версию JDK непосредственно с сайта Oracle. Как только вы установите его, ваш компьютер будет иметь возможность понимать и запускать код на Java. Тем не менее, вам все равно понадобится некоторое вспомогательное ПО, чтобы было действительно удобно писать код. Это так называемая «интегрированная среда разработки» или IDE: интерфейс, используемый разработчиками для ввода текста кода и вызова JDK.
При разработке для Android вы будете использовать IDE Android Studio. Она не только послужит интерфейсом для кода на Java (или Kotlin), но и станет мостом для доступа к специфичным для Android вызовам из SDK.
Для целей нашего краткого руководства по Java может быть и проще написать свой код непосредственно в приложении-компиляторе Java. Они могут быть скачаны для Android и iOS, можно даже найти веб-приложения, которые работают в вашем браузере. Эти инструменты предоставляют все необходимое в одном месте и позволяют сразу начать тестирование кода. Например, compilejava.net.
Насколько легко научиться программированию на Java?
Если вы новичок в разработке на Java, то ваши опасения вполне понятны. Так насколько же легко изучить Java?
Этот вопрос имеет несколько субъективную природу, но лично я бы отнес Java к языкам, не самым простым для изучения. Хотя он проще, чем C++, и часто описывается как более удобный для пользователя, но он, безусловно, не столь прост, как такие его конкуренты, как Python или BASIC, которые больше подходят для изучения начинающим программистам.
C# также немного проще по сравнению с Java, хотя они очень похожи.
Конечно, задавшись конкретной целью – стать разработчиком приложений для Android, – проще всего сразу начать с языка, который уже поддерживается этой платформой.
У языка Java есть свои особенности, но его, безусловно, можно изучить, и как только вы его освоите, вам откроется множество возможностей. А поскольку Java имеет много общего с C и C#, вы сможете перейти на эти языки без особых усилий.
Каков синтаксис Java?
Прежде чем мы погрузимся в самую суть этого руководства по Java для начинающих, стоит уделить некоторое время изучению синтаксиса Java.
Синтаксис Java относится к способу написания конкретных алгоритмов. Java очень принципиален в этом вопросе, и, если вы не пишете код определенным образом, то ваша программа не будет работать!
На самом деле я написал целую статью о синтаксисе Java для разработки Android, кратко перечислю особенности синтаксиса:
Если вы нажимаете кнопку «запустить» или «скомпилировать» и получаете ошибку, то есть большая вероятность, что вы где-то пропустили точку с запятой!
Вы никогда не перестанете делать это, и это никогда не перестанет вас раздражать. Расслабьтесь!
С этими знаниями мы сможем глубже погрузиться в руководство по Java!
Основы Java: ваша первая программа
Зайдите на compilejava.net, и вас встретит редактор с кучей готовых примеров.
(Если же вы предпочитаете использовать другую IDE или стороннее приложение, это тоже прекрасно! Скорее всего, ваш новый проект будет состоять из аналогичного кода).
Удалите все, кроме следующего:
Это то, что мы, программисты, мы называем «шаблоном» (этот код скопирован из учебника Java от Фила Данфи). Шаблонный код – так можно назвать любой код, который встречается внутри практически любой программы.
Первая строка здесь определяет «класс», который по сути является модулем кода. Затем нам нужен метод внутри этого класса, который представляет собой небольшой блок кода, выполняющий задачу. В каждой программе Java должен быть метод main, так как он сообщает Java, где начинается программа.
Об остальном поговорим чуть ниже, не беспокойтесь. Все, что нам нужно знать для этого урока Java прямо сейчас, – это то, что код, который мы действительно хотим запустить, должен быть помещен в фигурные скобки под словом «main».
Поместите сюда следующий оператор:
Этот оператор напишет слова: «Hello world!» на вашем экране. Нажмите «Compile & Execute» и вы увидите его в действии.
Поздравляю! Вы только что написали свое первое Java-приложение!
Переменные в Java
Теперь пришло время рассказать о некоторых более важных вещах, лежащих в основе Java. Мало что может быть более фундаментальным в программировании, чем обучение использованию переменных!
Переменная по сути является «контейнером» для некоторых данных. Это означает, что вы выберете слово, которое будет представлять какое-то значение. Нам также необходимо определить переменные, основанные на типе данных, на которые они будут ссылаться.
Вот три основных типа переменных, которые мы собираемся ввести в этом руководстве по Java:
Как только мы определяем переменную, мы можем вставить ее в наш код, чтобы изменить выходные данные. Например:
Теперь мы печатаем на экране, как и раньше, но на этот раз заменяем «Hello world!» на «Hello + имя». Этот код показывает строку «Hello», за которой следует любое значение, содержащееся в следующей строковой переменной!
Условные операторы в Java
Еще одна из самых важных основ Java – это работа с условными операторами.
Условные операторы используют блоки кода, которые выполняются только при определенных условиях. Например, мы можем захотеть предоставить специальные пользовательские права основному пользователю нашего приложения.
Посмотрите на следующий код:
Запустите этот код, и вы увидите, что специальные разрешения предоставлены. Но, если вы измените значение name на что-то другое, то код не будет работать.
Обратите внимание, что при наложении условия на данные мы используем два знака «=». Вы же используете только один, когда присваиваете какие-то данные переменным.
Методы на Java
Еще одна простая концепция, которую мы можем ввести в этом руководстве Java – это использование методов. Это даст вам немного больше понимания того, как структурирован Java-код и что с ним можно сделать.
Все, что мы собираемся сделать, – это взять часть кода, который мы уже написали, а затем поместить его в другой метод вне метода main :
Если бы мы написали вызов grantPermission() несколько раз, то сообщение «Special user priveleges granted» также отобразилось бы несколько раз. Именно это делает методы такими фундаментальными основами Java: они позволяют выполнять повторяющиеся задачи, не записывая код снова и снова.
Передача аргументов в Java
Но самое замечательное в методах то, что они могут принимать переменные и манипулировать ими. Мы сделаем это, передав переменные в наши методы как «строки». Вот для чего и нужны скобки, следующие за названием метода.
Надеюсь, это даст вам представление о том, насколько мощными могут быть методы!
В завершение
Надеюсь, теперь у вас есть хорошее представление о том, как изучать Java. Вы даже можете сами написать какой-нибудь простой код: используя переменные и условные операторы, вы действительно можете заставить Java делать некоторые интересные вещи уже сейчас.
Следующий этап состоит в понимании объектно-ориентированного программирования и классов. Это понимание есть то, что действительно дает Java и подобным языкам их силу, но поначалу может быть немного сложным для осмысления.
Хинт для программистов: если зарегистрируетесь на соревнования Huawei Cup, то бесплатно получите доступ к онлайн-школе для участников. Можно прокачаться по разным навыкам и выиграть призы в самом соревновании.
Перейти к регистрации
Java 7: Как написать действительно быстрый код Java
Хорошо, хватит разговоров, начнем! Моя машина представляет собой обычный Intel 386 32-разрядный двухъядерный процессор под управлением Windows XP.
Вот мои тестовые классы:
Давайте запустим бенчмарк, используя фреймворк Heinz:
О методе встраивания и ThreadLocalRandom
Одной из очень эффективных JIT-оптимизаций является метод встраивания. В часто используемых горячих путях компилятор горячих точек решает встроить код вызываемых методов (дочерний метод) в метод вызывающих (родительский метод). «Встраивание имеет важные преимущества. Это значительно снижает динамическую частоту вызовов методов, что экономит время, необходимое для выполнения этих вызовов методов. Но что еще более важно, встраивание создает гораздо большие блоки кода для работы оптимизатора. Это создает ситуацию, которая значительно повышает эффективность традиционных оптимизаций компилятора, преодолевая главное препятствие для повышения производительности языка программирования Java ».
Понимание накладных invokevirtual инструкции invokevirtual
Так почему (виртуальный) вызов метода стоит дорого, а метод включения так эффективен? Указатель инструкций invokevirtual не является смещением конкретного метода в экземпляре класса. Компилятор не знает внутреннюю разметку экземпляра класса. Вместо этого он генерирует символические ссылки на методы экземпляра, которые хранятся в пуле постоянных времени выполнения. Эти постоянные элементы пула времени выполнения разрешаются во время выполнения, чтобы определить фактическое местоположение метода. Такое динамическое (во время выполнения) связывание требует проверки, подготовки и разрешения, что может значительно повлиять на производительность. (см. Методы Вызова и Связывание в Спецификации JVM для деталей)
Это все на данный момент. Отказ от ответственности: Конечно, список тем, которые вы должны понять, чтобы решить загадки производительности, бесконечен. Есть много чего, что нужно понять, чем микробанчмаркинг, оптимизация JIT, встраивание методов, Java-байт-код, язык ассемблера и так далее. Кроме того, причинами различий в производительности гораздо больше, чем просто вызовы виртуальных методов или дорогостоящие инструкции по синхронизации потоков. Тем не менее, я думаю, что темы, которые я представил, являются хорошим началом для такого глубокого погружения. Ждем критических и приятных комментариев!
Ссылки: «Java 7: Как написать действительно быстрый Java-код» от нашего партнера JCG Никласа.
Как сделать Java код проще и нагляднее
Вы все пишите блистательно,
а я потом добавлю шероховатости.
х/ф Трамбо
Написать Java код не просто, а очень просто. Трудности начинаются, когда его запускают или, хуже того, если его требуется изменить. Открыв свой код двухлетней давности, каждый хотя бы раз задавался вопросом: кто же все это написал? Мы в Wrike разрабатываем продукт и делаем это уже более десяти лет. Подобные ситуации случались с нами неоднократно. За это время мы выработали ряд принципов в написании кода, которые помогают нам сделать его проще и нагляднее. Хотя в нашем подходе нет ничего экстраординарного, он во многом отличается от того, как принято писать код на Java. Тем не менее, кто-то может найти нечто полезное в нашем подходе и для себя.
Как использовать неизменяемые модели данных
Практика показывает, что код становится существенно проще, если для каждого метода как его параметры, так и результат являются неизменяемыми.
Более того, практически всегда можно добиться того же для всех локальные значений методов или полей классов. Логично, при этом, что у класса могут быть только getters. Как быть, если нужно сконструировать сложную модель данных: создавать билдер имеющий только setters и внутри него уже конструировать неизменяемый объект методом build().
Такой подход действительно приводит к более простому и читаемому коду, но чтобы увидеть это, нужно попробовать. Вот несколько примеров в поддержку работы с неизменяемым состоянием. Язык Rust по умолчанию определяет все “переменные” неизменяемыми:
а для того чтобы получить именно переменную, нужно приложить дополнительные усилия:
В языке Erlang вообще нет переменных, абсолютно все значения являются неизменяемыми, тем не менее на нем можно разрабатывать сложные приложения. У Robert C. Martin есть интересное выступление на эту тему с хорошо изложенной теорией и не столь хорошими примерами, но теория все равно стоит того, чтобы посмотреть.
It’s a Trap! Как избежать ручного управления ресурсами
Открыв файл, его нужно закрыть. Получив соединение с базой, его нужно освободить. В целом ничего хитрого. Но практика показывает, что при работе с ресурсами Java-разработчики склонны допускать ошибки, вероятно, потому что мы лишены радости управлять памятью вручную. Навык не вырабатывается. Простой пример:
В коде выше есть неочевидная ошибка, из за которой FileInputStream может быть не закрыт.
Простое и дешевое решение — лишить программиста необходимости управлять ресурсами вообще. Например так:
В этом случае, даже если где-то в логике обработки файла закрадется ошибка, по крайней мере все ресурсы будут корректно освобождены и закрыты.
Как вернуть два значения
Особенно это заметно на интервью, когда начинающие программисты впадают в ступор, если от них требуется вернуть из метода сразу два значения, скажем, сумму и среднее. Решения варьируются по степени своего неприличия от
При этом аккуратное решение совсем простое:
Совершенно нормально, и более того, удобно, когда вспомогательные модели данных определены рядом с методами, которые их используют. Так принято поступать абсолютно во всех языках программирования, даже в C#, который по большому счету является клоном Java. Однако среди Java программистов можно столкнуться со странным заблуждением, что, мол, “каждый класс должен быть определен в отдельном файле, иначе это плохой код, и точка”. В Java действительно было нельзя создавать inner классы, в версии до 1.1, но с 19 Февраля 1997 года эта проблема была решена, и ничто не мешает нам пользоваться этой новой возможностью языка, которая доступна уже как двадцать лет.
Как спрятать реализацию
Бывает, что в процессе реализации метода возникает необходимость разбить его на несколько более простых методов. При этом неизбежно возникает вопрос: где эти вспомогательные методы определить? Конечно, можно нарезать логику на приватные методы, но если класс достаточно большой, это становится неудобно. Приватные методы неизбежно получаются разбросанными по всему файлу, и какой из них для чего нужен и где используется становится не так очевидно, как хотелось бы. Простое решение, которое помогает как аккуратно организовать код, так и меньше скролить файл при его чтении, — определить вспомогательные методы внутри основного публичного метода.
Для примера, ниже приведен код обхода графа в глубину, при этом для каждого узла графа вызывается callback функция, естественно ровно один раз для каждого узла.
Можно было бы определить рядом вспомогательный метод:
Но такое решение получается достаточно громоздким, а сам вспомогательный метод — одиноким. Например, глядя только на название метода stepToNodeImpl неочевидно, что он на самом деле используется для обхода графа в глубину. Чтобы разобраться в этом, нужно сначала найти все его использования.
Тут может быть разумная критика, что много логики будет спрятано внутри метода и отдельно ее невозможно будет тестировать, справедливо. Вопрос, действительно ли все детали реализации, включая приватные методы, покрываются отдельными тестами? Если да, вероятно, логику придется декомпозировать в угоду тестам. Если нет, уж лучше организовать код более аккуратным способом.
На практике, в зависимости от ситуации, бывает удобно реализовывать внутреннюю логику метода используя Runnable, Callable, Consumer или Supplier интерфейсы.
Как вычислить значение
Вычисление отдельного значение может оказаться нетривиальной задачей, если оно вычисляется по сложным правилам или требует дополнительных промежуточных вычислений. В результате код может получиться “замусоренным”. Скажем, дальнейшая логика метода зависит от того, поддерживается ли версия браузера клиента или нет. Для этого нам вначале нужно будет определить тип браузера, затем, в зависимости от типа сравнить версии, и, возможно, учесть какие-то дополнительные параметры.
Примечание: конечно, в данном примере подразумевается, что логика вычисления поддерживаемого клиента сугубо специфична, в противном случае ее само собой нужно вынести в отдельный вспомогательный метод.
Можно было бы вычислить значение isSupportedBrowser непосредственно в коде, но тогда в области видимости остались бы все вспомогательные переменные, а момент, где начинаются вычисления и где они завершаются, был бы не так очевиден. В примере выше конструкция:
помогает явно отделить часть логики, отвечающей за вычисление флага, и скрыть все промежуточные значения, которые были необходимы в процессе, но далее не нужны.
Как структурировать скучный код
Код не всегда бывает сложным, иногда его просто много. Задача переложить одну модель данных в другую скорее типична. Ну и что, что в итоге метод занимает пятьсот строк. Все же понятно. Берем это, кладем сюда, берем то, кладем туда и так далее. Встречаются редкие if или дополнительные вычисления, но погоды они не делают. При этом, если попытаться разбить код на более мелкие методы, может получиться даже хуже. Появляется необходимость передавать между между методами данные, определять дополнительные модели для промежуточных результатов методов и так далее.
Для организации такого кода могут быть крайне полезны пустые строки. Разбив код на параграфы, его можно сделать гораздо более читаемым. Но можно пойти дальше, и выделять осмысленные моменты в <> — фигурные скобки. Это не только поможет структурировать код блоками, но и спрятать из области видимости значения необходимые только для одной из секций.
Конечно, это не всегда лучший подход. Бывает что сколько <> скобок ни добавляй, код лучше не становится, и его просто нужно переписывать. Бывает, что все делится на методы вполне просто и замечательно. Тем не менее, использование <> позволяет добавить выразительности коду там, где это необходимо.