別寫重複程式碼 (DRY)


試著去遵循DRY 原則

盡你最大的努力去避免複製程式碼,它是一種非常糟糕的行為,複製程式碼通常意味著當你需要變更一些邏輯時,你需要修改不止一處。

試想一下,如果你在經營一家餐廳並且你在記錄你倉庫的進銷記錄:所有 的土豆,洋蔥,大蒜,辣椒等。如果你有多個清單來管理進銷記錄,當你 用其中一些馬鈴薯做飯時你需要更新所有的清單。如果你只有一個清單的話 只有一個地方需要更新。

通常你複製程式碼是應該有兩個或多個略微不同的邏輯,它們大多數都是一樣的,但是由於它們的區別致使你必須有兩個或多個隔離的但大部分相同的方法,移除重複的程式碼意味著用一個function/module/class建立一個能處理差異的抽象。

用對抽象非常關鍵,這正是為什麼你必須學習遵守在類別章節寫 的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()
        ]);
    }
}