Рефакторинг как положено. Часть 1 — планирование

Дата публикации:

Нам (и далеко не только нам) часто приходится иметь дела с проектами, которые

  1. писались очень давно;
  2. писались быстро и некачественно.

Как обеспечить стабильное продвижение такого проекта? Правильный ответ на этот вопрос состоит из одного слова: рефакторинг. Во-первых, он повышает читаемость кода, что экономит кучу времени. Во-вторых, красивый код работает более надежно. Существует масса исследований, посвященных этому вопросу. И в каждом из них с большим отрывом побеждал более красивый и структурированный код. В нем тоже могут быть ошибки. Но их будет в несколько раз меньше.

Постановка проблемы

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

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

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

На что смотреть в первую очередь

Структура базы данных

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

Здесь опять же все индивидуально. Даже если структура базы не идеальна, мы не всегда имеем возможность ее поменять. Вполне вероятно нам придется подстраиваться под ее структуру.

Вот несколько факторов, о которых нужно помнить при миграции данных клиенту:

  • Размер базы данных;
  • СУБД MySQL, PostgreSQL;
  • На какое время сайт может уйти в maintenance (при необходимости);
  • Можно ли мигрировать данные поэтапно.

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

Незначительные причины

  • Одна таблица должна быть разбита на несколько более мелких таблиц;
  • Таблицы не нормализованы;
  • Отсутствие внешних ключей;
  • Колонка таблицы называется не так как нужно;
  • Возможность применить новые фишечки СУБД, которых не было в момент ее проектирования (PostgreSQL).

Хорошие причины

  • Неверное направление логической связи — перепутаны «has_one && belongs_to many»;
  • Необходима «many_to_many» связь вместо «has_many»;
  • Негибкая структура (то есть добавление/изменение каждой новой сущности приводит к изобретению “костылей”).

Весомые причины

  • Данные в таблице перемешаны — название таблицы абсолютно не соответствует своей сущности;
  • Применение новых фишечек СУБД прекрасно справляется с решением проблемы — ведь они были придуманы именно для таких задач (PostgreSQL).

Пара слов в качестве резюме. Чем древнее база, тем сложнее ее менять. А если вы можете вообще ее не трогать — не тройгайте подходите на расстояние пушечного выстрела!

Определение зависимостей проекта от фичи (при рефакторинге определенного участка)

Задача предельно проста. У нас есть фича. И есть место, куда она будет добавлена. Нам нужно разбить все классы, которые используются в этом месте, на 3 типа.

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

Что тестировать?

Как правило, проекты, которые попадают под рефакторинг, не покрыты тестами. Обычно их пишут на скорую руку, чтобы быстро выйти на рынок. Как поступить, если в наших руках оказалось такое счастье? Для начала — оценить объем тестового покрытия.

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

Какой код будет изменен?

Здесь стоит выделить два случая:

  1. Код, который мы собираемся рефакторить;
  2. Код, который мы не будем рефакторить, но и не собираемся оставлять в прежнем виде.

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

Как же быть в таком случае? Просто добавить между кодом еще один уровень абстракции. Даже если нам непонятно, как он работает, всегда можно найти точки входа и выхода. А дальше написать над ними свою удобную обертку. В этом случае приложение будет работать с нашим — удобным и хорошо спроектированным кодом.

Вывод

Итак, перед вами универсальный план рефакторинга. Он помогает ответить на вопросы:

  • что нужно поменять?
  • сколько времени это займет?
  • как лучше организовать процесс в команде?

Но все же не забывайте, что рефакторинг — крайне нетривиальная задача. А значит, возможны непредвиденные обстоятельства. Тем не менее, планирование намного важнее, чем это может показаться на первый взгляд. Исправление ошибки на этапе планирования в 10 раз дешевле исправления такой же ошибки в работающем коде. Продолжение следует!

Мы Крым Диджитал

С 2015 года мы предоставляем полный цикл услуг мобильной и веб-разработки клиентам из различных отраслей и разных стран.

Подпишись
на наши новости

Контакты пресс-службы

+ 7 (926) 118-80-32

WhatsApp, Viber, Telegram

Давайте обсудим Ваш проект

или свяжитесь с нами по почте projects@crimeadigital.ru

Нажимая кнопку «Отправить», вы даете согласие на обработку персональных данных

Прошел день карьеры в СевГУ

Резидент технопарка, компания Крым Диджитал, приняла участие в Дне Карьеры в СевГУ, который прошел 17 мая. Мероприятие длилось 3 часа. Компанией заинтересовались  более 35 студентов, которым была важна информация о прохождении практики, бесплатные курсы Академии и вакансии, не требующие опыта работы. Руководитель разработки компании выступил с презентацией и ответил на все вопросы, которые так волнуют студентов — как начать свою карьеру в ИТ? Есть ли возможность совмещать учебу с работой? Кем я смогу стать? Как понять, кем я хочу работать? И многие другие.

Резидент технопарка, компания Крым Диджитал, приняла участие в Дне Карьеры в СевГУ, который прошел 17 мая.

Мероприятие длилось 3 часа. Компанией заинтересовались  более 35 студентов, которым была важна информация о прохождении практики, бесплатные курсы Академии и вакансии, не требующие опыта работы.

Руководитель разработки компании выступил с презентацией и ответил на все вопросы, которые так волнуют студентов - как начать свою карьеру в ИТ?

Есть ли возможность совмещать учебу с работой?

Кем я смогу стать?

Как понять, кем я хочу работать?

И многие другие.

Завершен набор студентов на летнюю практику

Крым Диджитал завершила набор студентов на летнюю практику. В июле придут 14 человек. Это студенты второго и третьего курсов кафедр Программная инженерия, Информатика и вычислительная техника, Информационные системы и технологии и Управление в технических системах. Все ребята будут ходить в офис и будут заняты реальным проектом, который они должны реализовать до конца практики. Каждый выбрал для себя то направление, в котором хотел бы развиваться — front-end и back-end-разработка, дизайн. Руководить практикой будет Head of Engineering.
Крым Диджитал завершила набор студентов на летнюю практику. В июле придут 14 человек. Это студенты второго и третьего курсов кафедр Программная инженерия, Информатика и вычислительная техника, Информационные системы и технологии и Управление в технических системах. Все ребята будут ходить в офис и будут заняты реальным проектом, который они должны реализовать до конца практики. Каждый выбрал для себя то направление, в котором хотел бы развиваться - front-end и back-end-разработка, дизайн. Руководить практикой будет Head of Engineering.

Крым Диджитал приняла участие в стратегической сессии

Руководители Крым Диджитал приняли участие в стратегической сессии, которая прошла на базе СевГУ 10 июня. Вместе с Правительством Севастополя, Институтом информационных технологий и управления в технических системах СевГУ и приглашенными ИТ-компаниями города обсудили перспективу развития системы высшего образования в Севастополе.Представители бизнеса, власти и образовательной системы выступали со своим видением будущих потребностей региона в кадрах, поднимали насущные вопросы обучения студентов, прохождения практики и дальнейшего трудоустройства. Крым Диджитал является амбассадором идеи образования и взращивания молодых кадров, развивает образовательные проекты и на протяжении 5 последних лет ведет активную работу в направлении поддержки и развития молодых специалистов ИТ-отрасли Крыма.

Руководители Крым Диджитал приняли участие в стратегической сессии, которая прошла на базе СевГУ 10 июня.

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

Крым Диджитал является амбассадором идеи образования и взращивания молодых кадров, развивает образовательные проекты и на протяжении 5 последних лет ведет активную работу в направлении поддержки и развития молодых специалистов ИТ-отрасли Крыма.

Выпуск курса Software Testing

Мы поздравляем выпускников нашего первого в этом году курса Крым Диджитал Академии по Software Testing! Всего курс успешно завершили 13 человек. В течение 2 месяцев несмотря на теплую погоду и манящее море ребята ответственно посещали занятия 2 раза в неделю, делали домашние задания и проверочные работы. Трое начинающих специалистов теперь стажеры нашей компании. Следующий курс намечен на август. Не пропусти анонс записи!

Мы поздравляем выпускников нашего первого в этом году курса Крым Диджитал Академии по Software Testing!

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

Следующий курс намечен на август. Не пропусти анонс записи!