불청객 WET(Write Everything Twice(쓴 코드를 또 쓴다) 또는 We Enjoy Typing(난 입력하는 게 좋아요))은 기척도 없이 여러분 코드에 파고들지 모른다. 동물 체중을 킬로그램(kg) 단위로 표시한 변수가 있고 사용자가 입력한 값을 다음과 같이 처리한다고 하자.
if (inputMass < 0) { // 체중이 음수일 리 없다는 에러 메시지를 낸다. } else if (inputMass > 150000) { // 에러: 흰수염고래도 이렇게 무겁진 않다고요! }
그리고 이 코드를 다른 곳에서 똑같이 복사해 쓴다. DRY와는 거리가 먼 이런 코드를 개선할 수 없을까? 원시형에 범위 체크 기능을 심을 순 없으니 객체로 변환하면 된다. 원시형은 꿈도 꿀 수 없는 기능을 객체라면 얼마든지 구현할 수 있다. 원시형을 무조건 객체로 바꾸라는 건 아니고 상황에 맞게 고려해볼 수 있단 말이다.
원시형을 자꾸 반복하는 건 좋지 않다. 변수에 값을 넣고 다른 곳에서 참조하느니 아무래도 그냥 값을 한 번 더 입력해넣는 게 알기 쉽고 편하다. 하지만 쉬운 길로만 가려고 하지 마시길! 드문 예외가 있긴 하지만, 한 번 이상 참조할 상수는 변수에 담아두고 변수를 대신 참조하라. 상수를 의존성으로 주입하는 방법도 있다. 이렇게 해야 코드를 DRY하게 유지하면서 특정 값을 사용하는 코드를 찾기가 쉽다.
▼ 표 3-1 원시형의 SOLID/DRY 요약표
원칙 |
결과 |
단일 책임 |
그 누가 원시형만큼 일편단심일 수 있으랴! |
개방/폐쇄 |
확장에 개방적이라고? 아니다. 변경에 폐쇄적이라고? 물론이다. 사실 원시형은 불변값(immutable)이다. |
리스코프 치환 |
해당 없음 |
인터페이스 분리 |
때로 원시형에 인터페이스를 구현하고 싶은 마음이 굴뚝같지만, 안타깝게도 불가능한 일이다. |
의존성 역전 |
원시형에 의존성 같은 건 없다. |
DRY(반복하지 마라) |
엄청난 유혹을 느끼는 부분이다! |