DRY (Don't Repeat Yourself)

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();
    }
}
  • 위 코드에서 HomePageEditInfoPage 클래스에서의 private LoginPage loginPage의 코드가 중복으로 들어간다고 해서 DRY 원칙을 위반한 것이 아니다. 조금 더 과장해서 얘기하면 private을 이곳 저곳에서 썼다고 해서 DRY 원칙을 위반하는 것이 아니다.
  • 위 코드에서 HomePage, EditInfoPage 클래스에서 checkSessionValid() 메서드를 보면 서로 코드가 완전히 동일하다. 하지만 이 또한 DRY 원칙을 어긴 것이 아니다. 왜냐하면 checkSessionValid()의 로직을 수정해야할 때에 LoginPage 클래스의 checkSessionValid() 로직만 수정하면 되기 때문이다.

DRY 원칙

DRY 원칙은 여러 군데에서 ‘코드가 중복되는 것’에 초점을 둔 것이 아니라, 여러 군데에서 행해져야 할 ‘동일한 행동’에 중점을 두었다. 조금 더 풀어서 설명하자면, 여러 군데에서 행해지는 특정 행동에 대해서 바꿔야 할 때 한 곳에서만 수정하면 되도록 코드를 작성하는 것이 핵심이다.

References

wiki.c2.com

Is “composition over inheritance” violating “dry principle”?