DEV Community

Cover image for Рефакторьте свой унаследованный PHP код (примеры из реальных проектов)
Petrovichev Sergey
Petrovichev Sergey

Posted on

Рефакторьте свой унаследованный PHP код (примеры из реальных проектов)

перевод статьи автора Mohamed Aladdin на Medium

image from osnews.com

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

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

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

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

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

Мой первый совет - никогда не начинать рефакторинг унаследованного кода, который не имеет надлежащих unit тестов. Я предполагаю, что причина очевидна: у вас останутся сломанные функции, которые сложно исправить, потому что вы не сможете понять, что сломано. Поэтому, если вам нужно реорганизовать его, начните сначала с его тестирования. Убедитесь, что часть, которую вы собираетесь перерабатывать, покрыта тестами.
Проверьте PHPUnit анализ покрытия кода тестами.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Top comments (0)