Рефакторьте свой унаследованный PHP код (примеры из реальных проектов)
Tags: php, refactorit, legacy
Published: 2019-09-26 12:20:08


перевод статьи автора Mohamed Aladdin на [Medium]([https://medium.com/hackernoon/refactor-your-php-legacy-code-real-projects-examples-da9edf03ff4b](https://medium.com/hackernoon/refactor-your-php-legacy-code-real-projects-examples-da9edf03ff4b))



[](https://miro.medium.com/max/60/1*5U_fhmDrqC3hZ_1SIj0QmA.png?q=20)

![](https://miro.medium.com/max/503/1*5U_fhmDrqC3hZ_1SIj0QmA.png)

>image from osnews.com

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

# Что такое рефакторинг и зачем он нам?

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

Ниже я покажу вам несколько примеров рефакторинга унаследованного кода и сделаю его лучше.

# Никогда не рефакторьте продакшн код, который не имеет unit тестов

Мой первый совет - никогда не начинать рефакторинг унаследованного кода, который не имеет надлежащих unit тестов. Я предполагаю, что причина очевидна: у вас останутся сломанные функции, которые сложно исправить, потому что вы не сможете понять, что сломано. Поэтому, если вам нужно реорганизовать его, начните сначала с его тестирования. Убедитесь, что часть, которую вы собираетесь перерабатывать, покрыта тестами.
Проверьте  [PHPUnit анализ покрытия кода тестами](https://phpunit.readthedocs.io/en/7.1/code-coverage-analysis.html).

# Начните рефакторинг с самой глубокой точки вашего кода

Посмотрите на следующее изображение. Это настоящий проект для системы управления [гостиницей](https://hackernoon.com/tagged/management)  которую я нашел на Github. Это настоящий проект с открытым исходным кодом, поэтому закрытый источник может быть худшим.

![](https://miro.medium.com/max/1024/0*o_Xt7O_1WitOzJx9.png)

>пример: сначала рефакторинг самых глубоких точек

Как вы можете видеть в этом методе, есть три уровня, отмеченные красным. Самой глубокой точкой должна быть вложенная инструкция if / else внутри первого условия if. Обычно самая глубокая точка сфокусирована на одной логике, тем самым облегчая рефакторинг.

# Сократите ваши методы, разделив их на более мелкие методы или файлы конфигурации / таблицу БД.

Возможно, в этом случае мы можем извлечь его в приватный метод следующим образом:

![](https://miro.medium.com/max/1024/0*GzntaUY08VZDx_mD.png)

>сделайте свои функции короче

Следующей глубокой точкой будет выборка данных поста и загрузка просмотров. Теперь взгляните на метод add () после рефакторинга других частей. Это намного чище, лучше читается и тестируемо.

![](https://miro.medium.com/max/1024/0*5rTlqNl6knjMKdBk.png)

>пример: сначала рефакторинг самых глубоких точек

# Всегда используйте {} в операторах if

Большинство [языков](https://hackernoon.com/tagged/programming) программирования поддерживают однострочные операторы if, и некоторые разработчики используют их, потому что они просты, однако не так просто читаются и легко вызывают проблемы, поскольку только одна пустая строка может нарушить условие и начать сбой. Посмотрите на разницу между двумя примерами:

![](https://miro.medium.com/max/300/0*qKPPZhC6bI0tcHy8.png)

>пример: используйте фигурные скобки

# Не используйте магические числа или магические строки:

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

![](https://miro.medium.com/max/300/0*of8kepNKAX3zsRp5.png)

>пример: магические числа

Чтобы реорганизовать этот метод, мы можем выяснить, что 250 - это максимальное количество комнат. Поэтому вместо хардкода мы можем извлечь его в переменную $maxAvailableRooms. Теперь код стал более понятен для других разработчиков.

![](https://miro.medium.com/max/300/0*5nR9rHxduxPvfUZJ.png)

>пример: исправление магических чисел

# Не используйте операторы else, если это вам не требуется:

В той же функции availablerooms () вы заметили оператор if, в котором мы можем легко избавиться от остальной части, и логика останется прежней.

![](https://miro.medium.com/max/300/0*EL3AvdzpKT9uibeo.png)

>пример: игнорирование оператора else

# Используйте значимые имена для ваших методов, переменных и тестов

В следующем примере вы можете видеть, что есть два метода из системы управления отелем, называемые «index() и room_m()». Лично я не могу определить, каковы их цели. Я думаю, что было бы легче понять, если бы их имена были описательными.

![](https://miro.medium.com/max/1024/0*r1mxi52OtJ5RXw-m.png)

>пример: неправильные имена методов

# Используйте максимум возможностей вашего языка программирования

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

![](https://miro.medium.com/max/1024/0*qBo2t1VxVGDLd5gZ.png)

![](https://miro.medium.com/max/1024/0*lI9BoaA39baxGFY6.png)

**Я хотел бы закончить несколькими более короткими советами для лучшего написания кода:**

-   Используйте новую форму массива [] вместо старой (array).
-   Используйте оператор === вместо ==, если нужно проверить тип данных.
-   Всегда полезно давать публичным методам короткие описательные имена. Частные методы могут иметь более длинные имена, поскольку они имеют ограниченную область действия.
-   Используйте общие имена только с методами, которые реализуют интерфейсы, например add (), и используйте описательные имена для методов отдельных классов addUser () или addDocument ().
-   Удаляйте неиспользуемые методы из ваших классов.
-   Используйте префикс is / has с функциями, которые возвращают логическое значение например: isAdmin(\$user), hasPermission(\$user).
-   Всегда используйте модификаторы доступа в методах и свойствах класса.
-   Будьте осторожны, не захламляйте интерфейсы: используйте только те методы, которые пользователи могут использовать публично.
-   Организовывайте так методы классов, чтобы публичные методы находились сверху.
-   Всегда применяйте концепцию единой ответственности к вашим классам.