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 함수를 더 작은 함수로 분해함으로써, 우리의 코드는 더 읽기 쉽고 디버그하기 쉬워집니다.

심층 분석

리팩터링은 1990년대 초반 smalltalk 프로그래밍 커뮤니티에서 기원했으며, Martin Fowler의 주요 서적 “Refactoring: Improving the Design of Existing Code” (1999)에 의해 더욱 대중화되었습니다. 리팩터링은 모든 프로그래밍 언어에 적용될 수 있지만, PHP의 동적 특성은 독특한 도전과 기회를 제공합니다.

리팩터링 대안으로는 코드를 처음부터 다시 작성하는 것이 있을 수 있으며, 이는 종종 더 위험하고 시간이 많이 소요됩니다. PHP 생태계에서는 PHPStan과 Rector와 같은 도구가 각각 자동으로 일부 리팩터링 작업을 탐지하고 수행할 수 있습니다. 구현 측면에서, 리팩터링을 작게 유지하고 단위 테스트로 광범위하게 테스트하는 것은 버그를 도입하지 않고 성공적인 리팩터링을 보장하는 핵심 관행입니다.

참고 자료