## 別寫重復代碼 (DRY)
遵循[DRY](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself) 原則要盡量避免復制代碼,這是一種非常糟糕的行為,通常意味著需要變更一些邏輯時,需要修改不止一處。
通常情況下復制代碼是應該有兩個或者多個略微不同的邏輯,它們大多數都是一樣的,但是由于它們的區別致使你必須有兩個或者多個隔離的但大部分相同的方法,移除重復的代碼意味著用一個function/module/class創建一個能處理差異的抽象。
不合理的抽象比復制代碼更糟糕,所有務必謹慎!如果能設計一個合理的抽象,實現它并不要重復,否則會發現任何時候當你想修改一個邏輯時你必須修改多個地方。
**差:**
```php
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);
}
}
```
**優:**
```php
function showList(array $employees): void
{
foreach ($employees as $employee) {
$expectedSalary = $employee->calculateExpectedSalary();
$experience = $employee->getExperience();
$githubLink = $employee->getGithubLink();
$data = [
$expectedSalary,
$experience,
$githubLink
];
render($data);
}
}
```
**極好:**
最好讓代碼緊湊一點
```php
function showList(array $employees): void
{
foreach ($employees as $employee) {
render([
$employee->calculateExpectedSalary(),
$employee->getExperience(),
$employee->getGithubLink()
]);
}
}
```