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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3 Ответа

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

  1. Беда с этим рефакторингом, беда. Ок. Вот специально взял сегодня и сделал более «правильно» пока только 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. Так более гибко получится.