DRY (Don't Repeat Yourself)
in Development on Design Pattern
DRY 원칙에 대한 오해
DRY 원칙은 단순히 코드 줄을 반복하지 않는 것과는 관련이 없다. DRY 원칙은 “Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.”의 정의에서도 알 수 있다시피, 코드(code)에 포커싱이 맞춰져 있는 것이 아니라 도메인 지식(knowledge)에 포커싱이 맞춰져있다.
‘중복된 코드들을 만들지 마라‘는 지침을 많이 들은 이유는, 많은 경우에 코드 줄을 반복했을 때에 도메인 지식(knowledge)를 반복한 경우가 많기 때문이다. 하지만 도메인 지식(knowledge)의 반복이 아닌 단순한 중복 코드라면 전혀 잘못된 것이 아니다.
예제 코드
public class LoginPage {
private String userId;
private String session;
public boolean checkSessionValid() {
...
}
}
public class HomePage {
private LoginPage loginPage;
public boolean checkSessionValid() {
return loginPage.checkSessionValid();
}
}
public class EditInfoPage {
private LoginPage loginPage;
public boolean checkSessionValid() {
return loginPage.checkSessionValid();
}
}
- 위 코드에서
HomePage
와EditInfoPage
클래스에서의private LoginPage loginPage
의 코드가 중복으로 들어간다고 해서 DRY 원칙을 위반한 것이 아니다. 조금 더 과장해서 얘기하면private
을 이곳 저곳에서 썼다고 해서 DRY 원칙을 위반하는 것이 아니다. - 위 코드에서
HomePage
,EditInfoPage
클래스에서checkSessionValid()
메서드를 보면 서로 코드가 완전히 동일하다. 하지만 이 또한 DRY 원칙을 어긴 것이 아니다. 왜냐하면checkSessionValid()
의 로직을 수정해야할 때에LoginPage
클래스의checkSessionValid()
로직만 수정하면 되기 때문이다.
DRY 원칙
DRY 원칙은 여러 군데에서 ‘코드가 중복되는 것’에 초점을 둔 것이 아니라, 여러 군데에서 행해져야 할 ‘동일한 행동’에 중점을 두었다. 조금 더 풀어서 설명하자면, 여러 군데에서 행해지는 특정 행동에 대해서 바꿔야 할 때 한 곳에서만 수정하면 되도록 코드를 작성하는 것이 핵심이다.
References
Is “composition over inheritance” violating “dry principle”?