코드의 재사용성이 높아지면 좋은가?

돔푸·2025년 4월 6일

코드의 재사용성을 높일 수 있는 방법

  • 여러 곳에 존재하는 비슷한 형태의 역할을 객체로 추출한다.
  • 여러 곳에 존재하는 비슷한 형태의 코드를 메서드로 추출한다.

코드의 재사용성에 대한 고민

일단 결론부터 말하면, 코드의 재사용성이 높다고 항상 좋은 코드라고 생각하지는 않는다. 적절한 기준을 통해 선택적으로 도입해야 한다.

코드의 재사용성이 높다는 것은 해당 코드가 여러 곳에서 쓰일 확률이 높아진다는 것이다. 따라서 원래 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 가 좋은 예이다. 또한 객체로 추출하는 것에 대해서는 크게 찬성한다. 역할이 중복되는 경우, 특히 여러 기능에 걸쳐 전반적으로 존재하는 횡단관심사의 경우에는 객체로 추출하는 것이 유지보수성과 객체지향적으로 개발하는데에 큰 도움이 된다. 역할을 적절히 배분하게 되기 때문이다.

하지만 다음과 같은 상황에서는 리팩터링하지 않는다.

  • 두 곳의 코드가 동일한 형태이지만, 추후에 달라질 가능성이 있는 경우
    • 특히 뷰에서 그렇다. 뷰는 계속해서 변하기 때문에 추출한 것이 변하기 쉽다.
    • 같은 코드이지만, 역할이 다르다면 그렇다. 역할이 다르면 추후에 다른 방식으로 변하기 쉽다.
  • 메서드 추출의 장점이 크게 와닿지 않는 경우
    • 딱 2곳 정도에서만 반복되는 짧은 코드는 그대로 두어도 된다.
    • 이정도 수준의 코드도 계속해서 추출한다면 메서드가 너무 많아질 가능성도 존재한다.

결론

  • 항상 좋은 것은 아니다.
  • 장점
    • 수정포인트가 줄어들어 유지보수성 향상
    • 적절한 책임분리를 통한 가독성과 객체지향성
  • 단점
    • 섣부른 리팩터링으로 인한 수정 비용
    • 그대로도 잘 읽히는 코드를 과하게 리팩터링하여 가독성 하락
  • 나의 생각
    • 기본적으로 메서드는 추출하지 않고, 객체는 분리하는 방향으로 생각하다가 필요한 경우에만 사용
    • 메서드 추출
      • 2줄 이상 반복되는 코드만 추출
      • 1줄이어도 읽기 어렵다면 추출
      • 추후에 두 부분이 달라질 가능성이 있다면 X
      • 추출하는 장점이 크게 없다면 X
    • 객체 분리
      • 거의 항상 선호
      • 너무 작은 객체들이 많이 만들어지는 것을 조심
profile
나중에 또 모를 것들 모음

0개의 댓글