일단 결론부터 말하면, 코드의 재사용성이 높다고 항상 좋은 코드라고 생각하지는 않는다. 적절한 기준을 통해 선택적으로 도입해야 한다.
코드의 재사용성이 높다는 것은 해당 코드가 여러 곳에서 쓰일 확률이 높아진다는 것이다. 따라서 원래 10곳에서 수정했어야 하는 것을 1곳에서 수정할 수 있는 등, 수정포인트가 줄어들어 유지보수성이 높아진다는 것이 가장 큰 장점이다. 또한 적절한 책임 분리를 통해 역할이 명료해지고, 읽기 쉬워질 수도 있다. 코드 전반적으로 걸쳐있는 로또 번호에 대한 책임을 LottoNumber 객체로 감싸는 방식이다.
하지만 무차별적으로 코드 재사용성을 늘리려는 시도는 문맥을 이해하기 어렵게 한다. "I'm ".insertNumberAndConcat(26, "years old.") 같은 코드는 여러 곳에서 쓰일 수 있다. 하지만 해당 메서드를 통해 가독성이 떨어지는 것은 사실이다. “I'm” + 26 + "years old." 가 훨씬 잘 읽힌다.
수정에 대해서도 위험이 따른다. 10곳에서 쓰이는 코드를 1 메서드로 추출하는 일은 생각보다 쉽다. IDE의 도움을 받으면 5초만에 추출할 수 있다. 하지만 알고보니 추출했던 해당 기능이 5곳에서는 다른 기능이 생겨, 원래대로 돌려놓아야 하는 상황이 오면 해당 수정에 훨씬 큰 노력이 들어간다. 또한 실수로 몇 곳을 놓쳤다면 잘못 동작할 수도 있다.
그래서 나는 적당한 재사용성을 지키기 위한 기준을 세워야 한다. 내가 지금까지 세운 기준은, 기본적으로 두줄 이상의 반복되는 코드만 추출해내는 것이다. 두줄 이상부터는 코드의 반복이 훨씬 크게 느껴지고 길어지기 때문에 추출하는 것이 가독성 향상에 도움이 많이 된다. 또한 한줄이어도, 읽기 어려운 내용은 것은 추출하는 것이 좋다. 메서드명을 통해 해당 코드들에 대한 설명을 할 수 있기 때문이다. number <= MIN_NUMBER || number >= MAX_NUMBER 가 좋은 예이다. 또한 객체로 추출하는 것에 대해서는 크게 찬성한다. 역할이 중복되는 경우, 특히 여러 기능에 걸쳐 전반적으로 존재하는 횡단관심사의 경우에는 객체로 추출하는 것이 유지보수성과 객체지향적으로 개발하는데에 큰 도움이 된다. 역할을 적절히 배분하게 되기 때문이다.
하지만 다음과 같은 상황에서는 리팩터링하지 않는다.