"모든 지식은 시스템 안에서 단일하고 명확하며 권위 있는 표현을 하나만 가져야 한다." 앤디 헌트와 데이브 토머스가 『실용주의 프로그래머』에서 정리한 원칙이다. 코드 줄의 반복만이 아니라 규칙·데이터·지식의 중복을 말한다.
- 중복된 지식은 바뀔 때 모든 곳을 함께 고쳐야 하고, 하나라도 놓치면 불일치와 버그가 된다(산탄총 수술과 뒤엉킨 변경)
- 켄트 벡은 TDD(Test-Driven Development)를 설명하며 "의존성이 문제라면 중복은 그 증상"이라고 했다. 중복을 없애면 의존성도 함께 사라진다(테스트 주도 개발 (TDD))
- 숨은 중복도 있다. 서버와 클라이언트가 같은 타입과 검증 규칙을 따로 정의하는 것, 엔티티·DTO(Data Transfer Object)에 같은 필드를 나열하는 것 등이다(심플 디자인)
- 데이터베이스에서 같은 사실을 여러 곳에 저장하지 않는 정규화(Normalization)도 같은 원칙이다
주의
겉모양이 같다고 같은 지식은 아니다. 우연히 비슷한 코드를 성급하게 합치면 두 쪽이 다른 이유로 바뀔 때 오히려 결합만 생긴다. 언제 합칠지는 3의 법칙가, 같은 값이라도 의미가 다르면 묶지 말라는 예는 매직 넘버와 설명 상수가 보여 준다.
출처: 『실용주의 프로그래머』 앤디 헌트·데이브 토머스 (원서 The Pragmatic Programmer) · Laws of Software Engineering: DRY (Don't Repeat Yourself)