더북(TheBook)

불청객 WET(Write Everything Twice(쓴 코드를 또 쓴다) 또는 We Enjoy Typing(난 입력하는 게 좋아요))은 기척도 없이 여러분 코드에 파고들지 모른다. 동물 체중을 킬로그램(kg) 단위로 표시한 변수가 있고 사용자가 입력한 값을 다음과 같이 처리한다고 하자.


if (inputMass < 0) {
// 체중이 음수일 리 없다는 에러 메시지를 낸다.
} else if (inputMass > 150000) {
// 에러: 흰수염고래도 이렇게 무겁진 않다고요!
}

그리고 이 코드를 다른 곳에서 똑같이 복사해 쓴다. DRY와는 거리가 먼 이런 코드를 개선할 수 없을까? 원시형에 범위 체크 기능을 심을 순 없으니 객체로 변환하면 된다. 원시형은 꿈도 꿀 수 없는 기능을 객체라면 얼마든지 구현할 수 있다. 원시형을 무조건 객체로 바꾸라는 건 아니고 상황에 맞게 고려해볼 수 있단 말이다.

원시형을 자꾸 반복하는 건 좋지 않다. 변수에 값을 넣고 다른 곳에서 참조하느니 아무래도 그냥 값을 한 번 더 입력해넣는 게 알기 쉽고 편하다. 하지만 쉬운 길로만 가려고 하지 마시길! 드문 예외가 있긴 하지만, 한 번 이상 참조할 상수는 변수에 담아두고 변수를 대신 참조하라. 상수를 의존성으로 주입하는 방법도 있다. 이렇게 해야 코드를 DRY하게 유지하면서 특정 값을 사용하는 코드를 찾기가 쉽다.

▼ 표 3-1 원시형의 SOLID/DRY 요약표

원칙

결과

단일 책임

그 누가 원시형만큼 일편단심일 수 있으랴!

개방/폐쇄

확장에 개방적이라고? 아니다. 변경에 폐쇄적이라고? 물론이다. 사실 원시형은 불변값(immutable)이다.

리스코프 치환

해당 없음

인터페이스 분리

때로 원시형에 인터페이스를 구현하고 싶은 마음이 굴뚝같지만, 안타깝게도 불가능한 일이다.

의존성 역전

원시형에 의존성 같은 건 없다.

DRY(반복하지 마라)

엄청난 유혹을 느끼는 부분이다!

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.