[Clean Code] Chapter 8. 경계

joyful·2024년 8월 25일
0

개발서적

목록 보기
8/9

들어가기 앞서

이 글은 개발자 필독서인 클린 코드를 읽으며 습득한 내용을 정리한 글입니다. 모든 출처는 해당 저서에 있습니다.


1. 외부 코드 사용하기

  • 패키지나 프레임워크 제공자는 적용성을 최대한 넓혀 많이 판매하려고 하고, 사용자는 자신의 요구에 집중하는 인터페이스를 원한다.
  • 다양한 인터페이스로 수많은 기능을 제공하는 모듈의 경우, 기능성과 유연성은 유용하지만 위험도 크다.
    • 예시 - java.util.Map
      • clear() → 사용자라면 누구나 삭제 권한을 가짐
      • 객체 유형 제한 없음 → 특정한 객체 유형만 저장하기로 결정했더라도 어떤 객체 유형도 추가할 수 있음
        • 제네릭을 사용하는 방법
          • 사용자에게 필요하지 않은 기능까지 제공
          • 인터페이스의 변경에 따라 코드도 수정해야 함
        • 경계 인터페이스를 캡슐화하여 사용하는 방법
          • 인터페이스가 변해도 나머지 프로그램에 영향을 미치지 않음
            • 이를 이용하는 클래스 내부에서 객체 유형을 관리/변환함
          • 프로그램에 필요한 인터페이스만 제공
          • 설계 규칙과 비즈니스 규칙을 따르도록 강제
  • 경계 인터페이스의 캡슐화는 필수는 아니나, 인스턴스를 통해 공개 API의 인수로 넘기거나 반환 값으로 사용하지 않도록 주의해야 한다.



2. 경계 살피고 익히기

💡 학습 테스트

간단한 테스트 케이스를 작성해 외부 코드를 익히는 방법

  • 프로그램에서 사용하려는 방식대로 외부 API를 호출하여 통제된 환경에서 API를 제대로 이해하는지 확인한다.



3. 학습 테스트는 공짜 이상이다

  • 학습 테스트는 이해를 높여주는 정확한 실험으로, 필요한 지식을 확보할 수 있는 손쉬운 방법이다.
  • 패키지의 새 버전이 나오면 학습 테스트를 돌려 차이가 있는지 확인하면 된다.
    • 통합 이후에도 패키지가 작성 코드와 호환되리라는 보장이 없기 때문이다.
    • 실제 코드와 동일한 방식으로 인터페이스를 사용하는 테스트 케이스를 작성하면 패키지의 새 버전으로 이전하기 용이하다.



4. 아직 존재하지 않는 코드를 사용하기

  • 아는 코드와 모르는 코드를 분리하는 경계 유형이 존재한다.
  • 원하는 인터페이스를 구현하면 인터페이스를 전적으로 통제 가능할 뿐만 아니라, 코드 가독성도 높아지고 코드 의도도 분명해진다.
  • 어댑터 패턴을 사용해 API 호출을 캡슐화하면, API 변경 시 수정해야 할 코드를 한 곳으로 집중시킬 수 있다.
    • 테스트가 용이해진다.
    • 실제 API 인터페이스 구현 시 경계 테스트 케이스를 생성하여 API의 올바른 사용 여부를 판별할 수 있다.



5. 클린 경계

  • 우수한 소프트웨어 설계는 변경을 위한 많은 투자와 재작업이 필요하지 않다.
  • 경계에 위치하는 코드는 깔끔히 분리하고, 기대치를 정의하는 테스트 케이스도 작성한다.
    • 외부 패키지를 세세하게 알아야 할 필요가 없으며, 통제 가능한 우리 코드에 의존하는 편이 낫다.
  • 외부 패키지를 호출하는 코드를 가능한 줄여 경계를 관리하자.
    • 새로운 클래스로 경계를 감싸거나 어댑터 패턴을 사용해 원하는 인터페이스를 패키지가 제공하는 인터페이스를 변환한다.
      • 코드 가독성뿐만 아니라 경계 인터페이스를 사용하는 일관성이 향상된다.
      • 외부 패키지 변경 시 변경할 코드도 감소한다.

📖 참고

  • 로버트 C. 마틴, 『Clean Code 클린 코드 애자일 소프트웨어 장인 정신』, 박재호·이해영 옮김, 케이앤피북스(2010), p173-182.
profile
기쁘게 코딩하고 싶은 백엔드 개발자

0개의 댓글