중복된 코드를 작성하지 마세요(DRY)


DRY 원칙을 따르세요

코드 복제를 피하기 위해 최선을 다하세요. 이는 매우 나쁜 행동입니다. 코드 복제는 일반적으로 일부 로직을 변경해야 할 때 한 곳 이상을 수정해야 함을 의미합니다.

레스토랑을 운영하면서 창고의 감자, 양파, 마늘, 고추 등의 구매 및 판매를 기록하고 있다고 상상해 보세요. 구매 및 판매를 관리할 목록이 여러 개 있는 경우 일부 감자로 요리할 때 모든 목록을 업데이트해야 합니다. 목록이 하나뿐인 경우 업데이트할 위치는 하나뿐입니다.

보통 코드를 복사할 때는 약간씩 다른 로직이 2개 이상 있어야 하는데, 대부분은 동일하지만 차이점 때문에 중복 코드를 제거하는 방식은 2개 이상 분리되어 있어야 하지만 대부분 동일합니다. 함수/모듈/클래스를 사용하여 차이점을 처리할 수 있는 추상화를 만듭니다. function/module/class创 建一个能处理差异的抽象。

用对抽象非常关键,这正是为什么你必须学习遵守在类章节写 的SOLID

올바른 추상화를 사용하는 것은 매우 중요합니다. 따라서 클래스 장에 명시된 SOLID 원칙을 준수하는 방법을 배워야 합니다. 불합리한 추상화는 코드를 복사하는 것보다 더 나쁩니다. 그렇긴 하지만, 합리적인 추상화를 디자인할 수 있다면 그렇게 하세요! 중복된 코드를 작성하지 마십시오. 그렇지 않으면 로직을 변경하려고 할 때마다 여러 위치에서 이를 변경해야 한다는 사실을 알게 될 것입니다.

나쁨:

function showDeveloperList(array $developers): void
{
    foreach ($developers as $developer) {
        $expectedSalary = $developer->calculateExpectedSalary();
        $experience = $developer->getExperience();
        $githubLink = $developer->getGithubLink();
        $data = [
            $expectedSalary,
            $experience,
            $githubLink
        ];
 
        render($data);
    }
}
 
function showManagerList(array $managers): void
{
    foreach ($managers as $manager) {
        $expectedSalary = $manager->calculateExpectedSalary();
        $experience = $manager->getExperience();
        $githubLink = $manager->getGithubLink();
        $data = [
            $expectedSalary,
            $experience,
            $githubLink
        ];
 
        render($data);
    }
}
좋음:

function showList(array $employees): void
{
    foreach ($employees as $employee) {
        $expectedSalary = $employee->calculateExpectedSalary();
        $experience = $employee->getExperience();
        $githubLink = $employee->getGithubLink();
        $data = [
            $expectedSalary,
            $experience,
            $githubLink
        ];
 
        render($data);
    }
}
훌륭함:

코드를 간결하게 유지하는 것이 좋습니다🎜
function showList(array $employees): void
{
    foreach ($employees as $employee) {
        render([
            $employee->calculateExpectedSalary(),
            $employee->getExperience(),
            $employee->getGithubLink()
        ]);
    }
}