들어가기 앞서
이 글은 개발자 필독서인 클린 코드를 읽으며 습득한 내용을 정리한 글입니다. 모든 출처는 해당 저서에 있습니다.
1. 외부 코드 사용하기
- 패키지나 프레임워크 제공자는 적용성을 최대한 넓혀 많이 판매하려고 하고, 사용자는 자신의 요구에 집중하는 인터페이스를 원한다.
- 다양한 인터페이스로 수많은 기능을 제공하는 모듈의 경우, 기능성과 유연성은 유용하지만 위험도 크다.
- 예시 -
java.util.Map
clear()
→ 사용자라면 누구나 삭제 권한을 가짐
- 객체 유형 제한 없음 → 특정한 객체 유형만 저장하기로 결정했더라도 어떤 객체 유형도 추가할 수 있음
- 제네릭을 사용하는 방법
- 사용자에게 필요하지 않은 기능까지 제공
- 인터페이스의 변경에 따라 코드도 수정해야 함
- 경계 인터페이스를 캡슐화하여 사용하는 방법
- 인터페이스가 변해도 나머지 프로그램에 영향을 미치지 않음
- 이를 이용하는 클래스 내부에서 객체 유형을 관리/변환함
- 프로그램에 필요한 인터페이스만 제공
- 설계 규칙과 비즈니스 규칙을 따르도록 강제
- 경계 인터페이스의 캡슐화는 필수는 아니나, 인스턴스를 통해 공개 API의 인수로 넘기거나 반환 값으로 사용하지 않도록 주의해야 한다.
2. 경계 살피고 익히기
💡 학습 테스트
간단한 테스트 케이스를 작성해 외부 코드를 익히는 방법
- 프로그램에서 사용하려는 방식대로 외부 API를 호출하여 통제된 환경에서 API를 제대로 이해하는지 확인한다.
3. 학습 테스트는 공짜 이상이다
- 학습 테스트는 이해를 높여주는 정확한 실험으로, 필요한 지식을 확보할 수 있는 손쉬운 방법이다.
- 패키지의 새 버전이 나오면 학습 테스트를 돌려 차이가 있는지 확인하면 된다.
- 통합 이후에도 패키지가 작성 코드와 호환되리라는 보장이 없기 때문이다.
- 실제 코드와 동일한 방식으로 인터페이스를 사용하는 테스트 케이스를 작성하면 패키지의 새 버전으로 이전하기 용이하다.
4. 아직 존재하지 않는 코드를 사용하기
- 아는 코드와 모르는 코드를 분리하는 경계 유형이 존재한다.
- 원하는 인터페이스를 구현하면 인터페이스를 전적으로 통제 가능할 뿐만 아니라, 코드 가독성도 높아지고 코드 의도도 분명해진다.
- 어댑터 패턴을 사용해 API 호출을 캡슐화하면, API 변경 시 수정해야 할 코드를 한 곳으로 집중시킬 수 있다.
- 테스트가 용이해진다.
- 실제 API 인터페이스 구현 시 경계 테스트 케이스를 생성하여 API의 올바른 사용 여부를 판별할 수 있다.
5. 클린 경계
- 우수한 소프트웨어 설계는 변경을 위한 많은 투자와 재작업이 필요하지 않다.
- 경계에 위치하는 코드는 깔끔히 분리하고, 기대치를 정의하는 테스트 케이스도 작성한다.
- 외부 패키지를 세세하게 알아야 할 필요가 없으며, 통제 가능한 우리 코드에 의존하는 편이 낫다.
- 외부 패키지를 호출하는 코드를 가능한 줄여 경계를 관리하자.
- 새로운 클래스로 경계를 감싸거나 어댑터 패턴을 사용해 원하는 인터페이스를 패키지가 제공하는 인터페이스를 변환한다.
- 코드 가독성뿐만 아니라 경계 인터페이스를 사용하는 일관성이 향상된다.
- 외부 패키지 변경 시 변경할 코드도 감소한다.
📖 참고
- 로버트 C. 마틴, 『Clean Code 클린 코드 애자일 소프트웨어 장인 정신』, 박재호·이해영 옮김, 케이앤피북스(2010), p173-182.