Как сделать рефакторинг java

Обновлено: 07.07.2024

Участие в тренинге дает отличную возможность систематизировать и расширить свои знания о рефакторинге и его месте в разработке ПО. Особенно хочется отметить стиль работы тренера, ориентированный на создание общей картины без засорения ее отдельными подробностями. В целом, курс разработан очень грамотно и включает в себя различные источники и авторов.

Тренинг отличается от перовначальных ожиданий, но только в лучшую сторону. Преподаватель не боится отходить от темы курса и компетентно расскрывает другие вопросы - это крайне положительный момент.

Оценка и обучение ИТ-специалистов по ключевым направлениям разработки программного обеспечения. Курсы от экспертов-практиков по языкам программирования, системному и бизнес-анализу, архитектуре ПО, ручному и автоматизированному тестированию ПО, Big Data и машинному обучению, управлению проектами и Agile. Luxoft Training – первый учебный центр в России, авторизованный IIBA. Действует скидка 10% на обучение физических лиц.


В этом руководстве вы узнаете все о рефакторинге исходного кода: преимущества, проблемы, инструменты и методы, а также в чем разница между рефакторингом и техническим долгом.

11 месяцев назад


В этом руководстве вы узнаете все о рефакторинге исходного кода: преимущества, проблемы, инструменты и методы, а также в чем разница между рефакторингом и техническим долгом.

Мы все ищем способы очистить наш код, упростить его и улучшить функциональность. Рефакторинг открывает путь вперед.

В этом руководстве будут рассмотрены следующие темы:

  1. Что такое рефакторинг?
  2. Каковы преимущества рефакторинга?
  3. Технический долг vs рефакторинг
  4. Метрики рефакторинга
  5. Примеры рефакторинга кода
  6. Инструменты рефакторинга кода
  7. Рефакторинг и вызовы для инженеров
  8. Поддержка руководства
  9. Командная поддержка и рефакторинг: спринт или марафон?
  10. Документация и рефакторинг

Что такое рефакторинг?

По словам Мартина Фаулера, автора двух книг по рефакторингу:

Рефакторинг — это процесс изменения программной системы таким образом, чтобы она, не изменяя внешнего поведения кода, стала лучше во внутренней структуре. Это способ очистки кода, сводящий к минимуму вероятность появления ошибок. По сути, когда вы проводите рефакторинг, вы улучшаете дизайн кода уже после того, как он был написан.

Каковы преимущества рефакторинга?

Рефакторинг исходного кода дает множество преимуществ. Он превращает беспорядочный, неправильный и/или повторяющийся код в чистый код. Он решает проблемы стандартизации, которые могут возникнуть, когда несколько разработчиков пишут свой собственный код. Рефакторинг обеспечивает лучшую читаемость и улучшает поддерживаемость исходного кода, а также его общую структуру и функциональность. Рефакторинг может упростить расширение кода и добавить новые функции. Удаление ненужных частей, таких как дубли, также может привести к тому, что код будет использовать меньше памяти и работать быстрее.

Например, в 2014 году инженеры Kickstarter столкнулись с проблемой экспоненциального роста числа пользователей, что привело к снижению производительности запросов. В ответ они перенесли запросы MySQL на Redis и сократили типичное время загрузки более чем на 100 мс, что привело к уменьшению дисперсии времени загрузки и в целом более быстрой работе сайта.

Технический долг vs рефакторинг

Проще говоря, рефакторинг — это способ устранения или уменьшения технического долга.

Рефакторинг необходим для поддержания качества, безопасности и производительности кода в долгосрочной перспективе. Без регулярного рефакторинга у разработчиков может накапливаться гигантский технический долг. Этот долг растет, поскольку упускается все больше возможностей для рефакторинга кода и, как следствие, затрудняется разработка, особенно та, что основывается на устаревшем коде.

рефакторинг

Метрики рефакторинга

Использование метрик позволяет вам расставить приоритеты для основных действий по исправлению, которые вам действительно нужно внести в свой код. Это не дает вам делать все сразу и заставляет фокусироваться в первую очередь на самых важных задачах.

Кроме того, вам нужны метрики, чтобы оценить эффективность рефакторинга исходного кода — речь идет не только об изменении неэффективного кода, но и об изменении неэффективного кода для добавления ценности. Чтобы понять реальную ценность, вам нужны тесты, как модульные (например, количество неудачных модульных тестов), так и функциональные. Другие показатели могут включать меньшее количество ошибок и снижение цикломатической сложности — рефакторинг должен быть направлен на снижение сложности. Методы или функции с высокой сложностью (например, более 350 строк) являются хорошими целями для рефакторинга.

Также стоит подумать о том, как рефакторинг соотносится с более широкими целями или этапами команды в отношении рабочего процесса и задач. В метрики нужно включать меньший размер кода и более понятный код.

Примеры рефакторинга кода

Существует множество примеров рефакторинга кода, но для краткости мы сосредоточимся на нескольких:

Красный, зеленый, рефакторинг

Рефакторинг идет рука об руку с модульным тестированием. Одна из наиболее распространенных форм — разработка через тестирование (TDD), присущая методологии Agile. Вы пишете тесты перед написанием кода. По сути, тесты должны управлять программой, указывая, что должен делать код.

Красный, зеленый, рефакторинг — это пример TDD:

  • Красный: пишите набор тестов без кода, убеждаетесь, что он не работает.
  • Зеленый: пишите код реализации, ровно столько, чтобы набор тестов прошел.
  • Рефакторинг: ищите способы оптимизировать и улучшить свой код.

Метод извлечения (также известный как функция извлечения)

Переместите фрагмент кода из существующего метода в новый метод, который четко назван, чтобы объяснить его функцию. Этот метод помогает снизить сложность и улучшить читаемость кода.

Извлечение переменной

Если вы сталкиваетесь с выражением, которое трудно понять или оно дублируется в нескольких местах по всему коду, рефакторинг извлечения переменной может поместить результат такого выражения или его части в отдельную переменную, которая менее сложна и проще для понимания. Это снижает сложность и дублирование кода.

Ветвь по абстракции

Разделение по абстракции предназначено для постепенного внесения крупномасштабных изменений в программную систему — это позволяет регулярно релизить систему, пока изменения еще не завершены. Это устраняет сложности рефакторинга кода в ветке, где могут возникнуть проблемы при попытке объединить код.

Составной метод

Чрезмерно длинный код трудно понять и изменить. Метод Compose относится к ряду действий, которые можно использовать для оптимизации методов и устранения дублирования кода. К ним относятся Inline Method, Inline Temp, Replace Temp with Query, разделение временных переменных и удаление назначений параметрам.

Инструменты рефакторинга кода

Вам нужны специальные инструменты для рефакторинга? Мартин Фаулер говорит, что автоматизированные инструменты полезны, но не важны. Он отмечает:

Многие языки имеют IDE, которые автоматизируют стандартный рефакторинг. Это действительно ценная часть моего набора инструментов, позволяющая мне быстрее выполнять рефакторинг. Но такие инструменты не являются необходимыми — я часто работаю с языками программирования без поддержки инструментов, и в этом случае я полагаюсь на небольшие шаги и частое тестирование для обнаружения ошибок.

Многие среды разработки автоматизируют механические аспекты рефакторинга. Инструменты рефакторинга ключевого кода:

Рефакторинг и вызовы для инженеров

Чтобы решить проблемы, которые привели к необходимости рефакторинга, необходимо изучить, как работает ваша компания. Прежде чем начать процесс рефакторинга, ответьте на несколько вопросов:

  • Какие задачи получают предпочтение?
  • Какая скорость развития?
  • Чувствуют ли разработчики необходимость быстрой отправки кода?
  • Какие существуют процессы для работы с техническим долгом?
  • Какие виды проверки кода предпринимаются?
  • Имеет ли ваша команда необходимые навыки для рефакторинга?
  • Каковы стандарты компании в отношении документации?

Без решения основных проблем, вызывающих необходимость в рефакторинге, проблема будет только разрастаться.

Поддержка рефакторинга руководством

Инвестиции в инфраструктуру и техническое обслуживание могут быть непопулярны в вашей компании.

Легко утверждать, что время, потраченное на рефакторинг, — это время, проведенное вне новой работы.

Но стоит взглянуть на преимущества рефакторинга и на то, как они связаны с рабочим процессом, клиентами, доходами и ростом бизнеса. Хорошо проведенный рефакторинг улучшает код, который должен хорошо функционировать, чтобы предоставлять эффективные обновления и модные функции, отвечающие потребностям новых и постоянных клиентов. Таким образом компания-разработчик программного обеспечения остается конкурентоспособной даже после успешного выпуска продукта.

Еще лучше заручиться поддержкой высшего руководства для рефакторинга, подсчитав, сколько времени команда в настоящее время тратит на исправление ошибок или ошибок, возникших из-за проблем в исходном коде. Будьте конкретны — это один час в день? Два часа в день? Ведите записи в течение недели, вы можете быть шокированы, узнав, что ваша команда тратит недели или месяцы каждый год на исправление устаревшего кода.

Командная поддержка и рефакторинг: спринт или марафон?

Рефакторинг сложно продать вашей команде? Люди стонут, когда об этом упоминают? Самый большой показатель успешного рефакторинга — это запланированные, целенаправленные и задокументированные действия. Рон Джеффрис, один из трех основателей методологии экстремального программирования, сравнивает рефакторинг с очисткой поля:

Мы берем следующую фичу, которую нас просят сделать, и вместо того, чтобы объезжать все сорняки и кусты, мы уделяем время расчистке пути прямо через них.

Однако он подчеркивает, что исправление плохого кода требует много времени, и придерживается более продуманного подхода, чем простое погружение в изменения:

“Мы улучшаем код, в котором работаем, и игнорируем код, с которым нам не нужно работать. Скорее всего, мы еще вернемся к нему.

Часто в рамках одного и того же спринта мы обнаруживаем, что последующая функция фактически использует область, которую мы только что очистили. Мы сразу начинаем получать выгоду от инкрементного рефакторинга. Если бы мы ждали большого обновления, мы бы приложили больше усилий, отложили бы получение всех преимуществ на более поздний срок и, вероятно, потратили бы усилия на места, которые еще не приносят пользы”.

Инженер по продукту и технический директор Андреас Клингер — поклонник Fix-it Friday.

Каким бы ни был ваш подход, учитывайте мнение разработчиков. Спросите свою команду, какой код больше всего снижает их эффективность.

  • Какое исправление кода окажет наибольшее влияние на ваш другой код?
  • Какие исправления принесут наибольшую отдачу?

Маловероятно, что у вас будет много времени, чтобы посвятить рефакторингу за счет всех других проектов, но не стоит недооценивать влияние регулярных, последовательных, специализированных небольших улучшений. Их сложение и объединение дает существенное преимущество.

Документация и рефакторинг

Такая документация, как стандартизация соглашений об именах, может гарантировать, что все будут на одной волне. Исследование, проведенное старшими разработчиками Xerox по анализу рефакторинга, показало, что отсутствие документации является одной из самых больших проблем.

Документирование вашей работы по рефакторингу ведет к учету времени и предоставляет контекст для будущих членов команды.

Кроме того, задокументируйте свои успехи — каковы были самые большие выгоды от рефакторинга? Могут ли они быть учтены в экспертных обзорах?

Утопаете в коде, который требует рефакторинга и технического долга?

К счастью, есть инструмент Stepsize, который может помочь вашей команде отслеживать и определять приоритеты технического долга на основе потерянного времени, морального духа команды и влияния на бизнес.

Из чего состоит метод — было рассказано в предыдущем уроке. Углубимся в некоторые детали.

Аргументы методов

Часто аргументы называют параметрами метода.

Аргументы метода — это те данные, с которыми метод будет работать. Они могут быть любого типа.

Уверен, Вы подметите, что метод может работать и с полями класса. Но поля класса видны всем остальным членам класса, а аргументы текущего метода видны только в рамках тела этого метода.

Рассмотрим на таком примере:

В данном примере, метод printExternalMessage видит обе ссылки с именем message : поле класса и собственный аргумент. Ввиду коллизии имен приходиться использовать ключевое слово this , чтобы явно указать ссылку, к которой обращаемся в коде.

Метод printInternalMessage видит ссылку с именем message только как поле класса Foo . Но ничего не знает о ссылке с именем message , которая находится внутри метода printExternalMessage . Как и о любых других локальных ссылках, которые могут быть объявлены в методе printExternalMessage .

Сколько у метода может быть аргументов?

Аргументов у метода может быть разное количество. Минимально — ноль. Такой метод ничего не принимает на вход. Обычно аргументы метода перечисляются через запятую: void methodName(Type1 arg1, Type2 arg2, int a, int b) . Особенно если они разных типов.

У метода может быть переменное число аргументов. То есть, когда один и тот же метод может принимать то один, то два, то десять аргументов. Но эти аргументы должны быть строго одного типа! Обозначается это так: void methodName(Type1. argsName) . Благодаря этому можно создать, например, метод sum который суммирует любое количество чисел (в пределах возможностей компьютера и типа int ):

Под капотом java превратит int. numbers в массив. С массивами Вы познакомитесь в четвертом модуле. Запоминайте эти базовые "пазлы" синтаксиса java. Постепенно они проявят общую картину.

Перегрузка методов

Перегрузка методов — это объявление нескольких методов в одном классе с идентичными именами. Различия состоят только в количестве и/или типе аргументов в этих методах. Например:

Java распознает метод не только по идентификатору (имени) но и по аргументам.

Перегрузка методов — один из способов поддержки полиморфизма в Java.

Результаты работы метода

Результатом работы метода является то, что он возвращает в место своего вызова. Например, метод int sum(int a, int b) обязан вернуть результат типа int . Результат работы этого метода можно использовать в месте вызова этого метода. Пример в коде:

return

return — это ключевое слово, которое завершает работу метода именно в том месте, где оно написано в теле текущего метода. Кроме этого, return возвращает результат выражения, следующего за ним, в место откуда был вызван текущий метод. Например в коде:

метод будет завершен в конце, после всех обозначенных задач над ним, в теле этого метода. Но если мы поменяем расположение return в этом методе вот так:

, то метод sum будет всегда выдавать результат 0 . А все что после слова return в его теле — будет просто игнорироваться.

Слово return можно применять и в void методах, для преждевременного завершения их работы, если нужно. Например так:

Полезные ссылки

Вам ответят команда поддержки Хекслета или другие студенты.

Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?
  • задайте вопрос. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.
Об обучении на Хекслете

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

Добрый день. Такой вопрос:
Есть базовый(abstract) класс Base, от него унаследовано несколько классов Child1, Child2, Child3..


Рефакторинг кода
Привет, помогите улучшить код? Задача - с помощью сервиса randomuser.me получить список более.

Рефакторинг кода для генерации, валидации и записи в файл номеров платежных карт
В учебных и практических целях реализовал код, генерирующий номера платежных карт, состоящих из 16.

Рефакторинг while в отдельный класс
Здравствуйте, делаю задание по рефакторингу, один из способов это создание отдельного класса.

Конвертер валют, рефакторинг
Вот есть кусок кода, "Конвертора валют", метод конвертации: public static String.

Читайте также: