PHP:
Рефакторинг
Как это делается:
Давайте возьмем классический фрагмент PHP-кода и применим к нему немного магии рефакторинга.
До рефакторинга наш код может выглядеть так:
function printOrderDetails($order) {
foreach ($order as $item) {
echo "Item: " . $item['name'];
echo " - Price: " . $item['price'];
echo "<br>";
}
if (!empty($order)) {
echo "Total: " . array_sum(array_column($order, 'price'));
}
}
Но мы можем рефакторить этот код, чтобы улучшить его ясность и модульность:
function printItem($item) {
echo "Item: {$item['name']} - Price: {$item['price']}<br>";
}
function calculateTotal($order) {
return array_sum(array_column($order, 'price'));
}
function printOrderDetails(array $order) {
array_walk($order, 'printItem');
if (!empty($order)) {
echo "Total: " . calculateTotal($order);
}
}
Разбивая функцию printOrderDetails
на меньшие функции, наш код становится более читаемым и проще для отладки.
Глубокое погружение
Рефакторинг берет свои корни из сообщества программистов на Smalltalk в начале 1990-х годов и был дополнительно популяризирован семинарной книгой Мартина Фаулера “Рефакторинг: Улучшение дизайна существующего кода” (1999). Хотя рефакторинг может быть применен к любому языку программирования, динамичная природа PHP предоставляет некоторые уникальные вызовы и возможности.
Альтернативами рефакторингу могут быть полная перезапись кода с нуля, что зачастую более рискованно и занимает больше времени. В экосистеме PHP инструменты, такие как PHPStan и Rector, могут автоматически выявлять и выполнять некоторые операции рефакторинга соответственно. С точки зрения реализации, ключевыми практиками для обеспечения успешного рефакторинга без внесения ошибок являются проведение небольших рефакторингов и тщательное тестирование с помощью модульных тестов.
См. также
- Книга Мартина Фаулера по рефакторингу: https://martinfowler.com/books/refactoring.html
- PHPStan, инструмент статического анализа PHP: https://phpstan.org/
- Rector, инструмент для автоматического рефакторинга кода PHP: https://getrector.org/
- Модульное тестирование в PHP с PHPUnit: https://phpunit.de/