Как дисциплинировать свой код с помощью рефакторинга (включая примеры PHP)

Опубликовано: 2021-06-22

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

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

Рефакторинг кода

Недостатки нечистого кода

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

  1. Это увеличивает стоимость обслуживания проекта.
  2. Добавление новой функции занимает много времени, и иногда добавить ее становится невозможно.
  3. Это замедляет привлечение новых людей к проекту.
  4. Он содержит повторяющийся код.
  5. Он не проходит все испытания.

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

Преимущества чистого кода

Чистый и дисциплинированный код имеет свои преимущества:

  1. Он не содержит повторяющегося кода.
  2. Он проходит все испытания.
  3. Делает код более читаемым и легким для понимания.
  4. Это упрощает обслуживание кода и делает его менее затратным.

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

Процесс рефакторинга

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

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

Рефакторинг следует проводить, когда:

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

Работа с запахами кода

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

Например:

  • Большие методы и классы, с которыми очень сложно работать.
  • Неполное или неправильное использование концепции объектно-ориентированного программирования.
  • Код, затрудняющий внесение каких-либо изменений.
  • Повторяющийся и устаревший код в проекте.
  • Сильно связанный код.

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

Методы рефакторинга - это шаги, предпринимаемые для рефакторинга кода. Вот некоторые из методов рефакторинга:

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; }

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