Почему так важен рефакторинг?

German German 14 Сентября 2021

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

Вот некоторые из основных причин, по которым рекомендуется провести рефакторинг:

  • Рефакторинг улучшает дизайн программного обеспечения.

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

  • Рефакторинг упрощает понимание программного обеспечения.

«Любой дурак может написать код, понятный компьютеру. Хорошие программисты пишут код, понятный людям». — Мартин Фаулер

  • Рефакторинг заставляет вас искать ошибки.

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

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

Вывод: рефакторинг снижает стоимость улучшений

Когда проводить рефакторинг кода?

Рефакторинг — это не особая задача, которая будет отражена в плане проекта, так когда же вам следует это делать?

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

    • Если это не так, выполните рефакторинг существующего кода, чтобы упростить это новое дополнение.

    • Как только это изменение будет сделано, добавьте новую функцию.

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

    • Если это не так, то реорганизуйте его в лучшую форму, чтобы, когда вы (или кто-то другой) вернетесь к этому коду через несколько недель, вам не придется тратить время на то, чтобы ломать голову над тем, как этот код работает.
  • Если вам сложно понять код, проведите его рефакторинг, чтобы вам не пришлось снова бороться в следующий раз, когда вы посмотрите на него.

Вывод: рефакторинг — это часть повседневного программирования

Заключительные мысли

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

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

Дайте ему шанс и практикуйте его, пока это не станет привычкой. Могу заверить вас, что вы ощутите на себе преимущества этого.

Написал после прочтения (Перезапись против рефакторинга: 17 важных статей для разработчиков): Rewrites vs. refactoring: 17 essential reads for developers

3 Ответа

  1. Yori Yori 14 Сентября 2021 (ред.)

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

  1. Evg Evg 14 Сентября 2021

    Беда с этим рефакторингом, беда. Ок. Вот специально взял сегодня и сделал более «правильно» пока только url в шаблонах для поста:

    Route::get('/post/{id}/{slug}')->***->name('post')

    Используем, например, так:

    getUrlByName('post', ['id' => $post_id, 'slug' => $post_slug])

    См. Получение данных (HLEB)

    Функция getUrlByName() — даёт доступ к именованным маршрутам, которым назначено название с помощью метода name().

    Теперь в маршруте если изменить, то везде поменяется. Осталось:

    Route::get('/u/{login}')->***->name('user')
    Route::get('/s/{slug}')->***->name('space')
    Route::get('/topic/{slug}')->***->name('topic')
    Route::get('/domain/{domain}')->***->name('domain')

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

    1. German German 14 Сентября 2021 (ред.)

      Так более гибко получится.