Как дисциплинировать свой код с помощью рефакторинга (включая примеры PHP)
Опубликовано: 2021-06-22Как и многое другое в жизни, наш код тоже требует определенной дисциплины. Я почти уверен, что ни один разработчик в мире не захочет писать нечистый код. Однако нечистый код все же существует. Это может возникнуть по разным причинам - может быть из-за давления со стороны бизнеса, отсутствия документации, отсутствия взаимодействия между членами команды или некомпетентности разработчика. Необходимо предпринять соответствующие действия, чтобы сделать код более чистым и избежать проблем, которые могут возникнуть из-за этого в будущем. К счастью, мы можем решить эти проблемы с помощью дисциплинированной техники реструктуризации кода, называемой рефакторингом .
Рефакторинг - это метод улучшения внутренней структуры существующего исходного кода программы и поддержания его внешнего поведения. Это пошаговая процедура улучшения кода, которая в противном случае потребует от нас много времени и усилий.

Недостатки нечистого кода
Увеличение размера исходного кода за счет добавления в него новых программ без длительного рефакторинга делает код беспорядочным и нечистым. Это очень затрудняет сопровождение и дальнейшее развитие проекта. Нечистый код имеет массу недостатков:
- Это увеличивает стоимость обслуживания проекта.
- Добавление новой функции занимает много времени, и иногда добавить ее становится невозможно.
- Это замедляет привлечение новых людей к проекту.
- Он содержит повторяющийся код.
- Он не проходит все испытания.
Есть много других недостатков, но эти проблемы требуют больших денег и времени для организации.
Преимущества чистого кода
Чистый и дисциплинированный код имеет свои преимущества:
- Он не содержит повторяющегося кода.
- Он проходит все испытания.
- Делает код более читаемым и легким для понимания.
- Это упрощает обслуживание кода и делает его менее затратным.
У чистого кода много преимуществ. Процесс превращения запутанного нечистого кода в более удобный в обслуживании чистый код называется процессом рефакторинга.
Процесс рефакторинга
Рефакторинг должен выполняться в виде серии небольших изменений, каждое из которых немного улучшает существующий код и позволяет программе продолжать работу, не нарушая ее. После рефакторинга код должен стать чище, чем раньше. Если он остается нечистым, то в рефакторинге нет смысла. Это просто потеря времени и сил. Во время рефакторинга для создания новой функциональности не следует добавлять новый код. После рефакторинга он должен пройти все тесты.
Когда проводить рефакторинг
Рефакторинг следует проводить, когда:
- Добавление повторяющегося кода в проект. Поскольку дублированный код сложно поддерживать, и изменения в одном месте могут потребовать обновления во многих других местах.
- Добавление функции. Рефакторинг упрощает добавление новых функций.
- При исправлении ошибки вам следует провести рефакторинг, потому что это приведет к автоматическому обнаружению ошибки.
- Проверка кода - это последний этап рефакторинга кода перед развертыванием изменений в производственной среде.
Работа с запахами кода
Проблемы с кодом иногда называют запахами кода. Это проблемы, которые решаются во время рефакторинга. Их легче найти и исправить.
Например:
- Большие методы и классы, с которыми очень сложно работать.
- Неполное или неправильное использование концепции объектно-ориентированного программирования.
- Код, затрудняющий внесение каких-либо изменений.
- Повторяющийся и устаревший код в проекте.
- Сильно связанный код.
Методы рефакторинга
Методы рефакторинга - это шаги, предпринимаемые для рефакторинга кода. Вот некоторые из методов рефакторинга:
1. Метод извлечения
// Проблема
function printInvoice() { $this->printHeader(); // Print details. print("name: " . $this->name); print("amount " . $this->getPrice()); }// Решение

function printInvoice() { $this->printBanner(); $this->printDetails($this->getPrice()); } function printDetails($price) { print("name: " . $this->name); print("amount " . $outstanding); }Если у вас есть фрагмент кода, который можно сгруппировать, добавьте новый метод для этой части кода и замените старый код. Это делает код более изолированным и устраняет дублирование.
2. Извлечь переменную
// Проблема
if (($student->getMarksinMath() > 60) && ($student->getMarksInPhysics() > 60) && ($student->getMarksinChemistry() > 60) && $this->pass) { // do something }// Решение
$mathResult = $student->getMarksinMath() > 60; $physicsResult = $student->getMarksinPhysics() > 60; $chemistryResult = $student->getMarksinChemistry() > 60; $hasPassed = $this->pass; if ($mathResult && $physicsResult && $chemistryResult && $hasPassed) { // do something }Для больших выражений, подобных тому, которое показано в задаче, которую очень трудно понять, для каждого выражения могут быть созданы разные переменные. Это делает код более читабельным. Но применять этот метод следует с осторожностью. Однако у него есть свои недостатки. Код будет выполняться, даже если условие ложно, чего нет в проблеме.
3. Встроенный метод
// Проблема
function printResult() { return ($this->getResult()) ? “Pass” : “Fail”; } function getResult() { return $this->totalMarks > 300; }// Решение
function getRating() { return ($this->totalMarks > 300) ? “Pass” : “Fail”; }Когда тело метода станет более очевидным, используйте эту технику. Замените метод содержимым метода и удалите метод. Это сводит к минимуму количество нежелательных методов.
4. Встроенная температура
// Проблема
$mathMark = $student->getMathResult(); return $mathMark > 60;// Решение
return $student->getMathResult() > 60;Если есть нежелательная временная переменная, которая просто содержит результат выражения, удалите переменную с самим выражением. Это помогает избавиться от ненужных переменных.
5. Заменить массив на объект
// Проблема
$row = []; $row[0] = "Virat Kohli"; $row[1] = 70;// Решение
$row = new Player(); $row->setName("Virat Kohli"); $row->setNumberofCentury(70);Если существует массив с различными типами данных, замените его объектом. Потому что поля класса легче документировать и поддерживать, чем массивы с различными типами данных.
6. Параметризованный метод
// Проблема
function fivePercentRaise() { } function tenPercentRaise() { }// Решение
function raise(percent) { }Если несколько методов выполняют аналогичное действие с данными, замените все методы одним методом и передайте данные в качестве аргумента (ов). Он удаляет повторяющиеся и повторяющиеся методы.
7. Отдельный запрос от модификатора
// Проблема
function getInterest() { $this->interestAmount = $this->principal * 10 / 100; return $this->interestAmount; }// Решение
function setInterest() { $this->interestAmount = $this->principal * 10 / 100; } function getInterest() { return $this->interestAmount; }Если метод возвращает значение и изменяет объект, разделите два метода. Один для модификации, а другой для возврата результата. Это исключает возможность непреднамеренного изменения объекта.
