개인룸/도윤

Item51. 메서드 시그니처를 신중히 설계하라

UroJem 2023. 7. 13. 01:43
  • 메서드 이름을 신중히 짓자
    • 항상 표준 명명 규칙을 따라야 한다.
    • 이해할 수 있고 같은 패키지에 속한 다른 이름들과 일관되게 짓는게 최우선 목표다.
    • 다음 목표는 개발자 커뮤니티에서 널리 받아들여지는 이름을 사용하는 것이다.
    • 긴 이름은 피하자
    • 애매하면 자바 라이브러리의 API 가이드를 참조하라. 자바 라이브러리가 워낙 방대하다 보니 일관되지 않은 이름도 제법 많지만 대부분 납득할 만 하다.
  • 편의 메서드를 너무 많이 만들지 말자
    • 모든 메서드는 각각 자신의 소임을 다해야 한다.
    • 메서드가 너무 많은 클래스는 익히고, 사용하고, 문서화하고, 테스트하고, 유지보수하기 어렵다.
    • 인터페이스도 마찬가지다.
    • 메서드가 너무 많으면 이를 구현하는 사람과 사용하는 사람 모두 고통스럽게 한다.
    • 클래스나 인터페이스는 자신의 각 기능을 완벽히 수행하는 메서드로 제공해야 한다.
    • 아주 자주 쓰일 경우에만 별도의 약칭 메서드를 두기 바란다.
    • 확신이 서지 않으면 만들지 말자
  • 매개변수 목록은 짧게 유지하자
    • 4개 이하가 좋다.
    • 같은 타입의 매개변수 여러개가 연달아 나오는 경우가 특히 해롭다. 사용자가 매개변수 순서를 기억하기 어려울 뿐더러 실수로 순서를 바꿔 입력해도 그대로 컴파일되고 실행된다.

 

과하게 긴 매개변수 목록을 짧게 줄어주는 기술 세가지

  1. 여러 매서드로 쪼갠다
    • 쪼개진 메서드 각각은 원래 매개변수 목록의 부분집합을 받는다. 잘못하면 메서드가 너무 많아질 수 있지만 직교성을 높여 오히려 메서드 수를 줄여주는 효과도 있다.
    • java.util.List 인터페이스가 좋은 예다. 부분 리스트를 반환하는 subList 메서드와 주어진 원소의 인덱스를 알려주는 indexOf 메서드를 별개로 제공한다. subList가 반환한 부분리스트 역시 완벽한 List이므로 두 메서드를 조합하면 지정된 범위의 부분 리스트에서 인덱스를 찾을 수 있는 강함고 ㅏ유연함이 절묘하게 균형을 이룬 API가 만들어 졌다.
  2. 매개변수 여러 개를묶어주는 도우미 클래스를 만든다
    • 일반적으로 이런 도우미 클래스는 정적 멤버 클래스로 둔다.
    • 특히 잇따른 매개변수 몇 개를 독립된 하나의 개념으로 볼 수 있을 때 추천하는 기법이다.
    • 예를 들어 카드게임 클래스를 만든다고 할 때 메서드를 호출할 때 숫자와 무늬를 뜻하는 두 매개변수를 항상 같은 순서로 전달할 것이다. 이 둘을 묶는 도우미 클래스를 만들어 하나의 매개변수로 주고 받으면 API는 물론 클래스 내부 구현도 깔끔해질 것이다.
  3. 앞의 두 기법을 혼합한 것
    • 객체 생성에 사용한 빌더패턴을 메서드 호출에 응용한다고 보면 된다.
    • 이 기법은 매개변수가 많을 때 특히 일부는 생략해도 괜찮을 때 도움이 된다.
    • 먼저 모든 매개변수를 하나의 추상화한 객체를 정의하고, 클라이언트에서 이 객체의 세터메서드를 호출해 필요한 값을 설정하게 하는 것이다.
    • 이 때 각 세터 메서드는 매개변수 하나 혹은 서로 연관된 몇개만 설정하고 execute 메서드를 호출해 앞서 설정한 매개변수들의 유효성을 검사한다.
    • 마지막으로 설정이 완료된 객체를 넘겨 원하는 계산을 수행한다.

 

매개 변수의 타입으로는 클래스보다 인터페이스가 더 낫다.

또한 boolean 보다는 원소 2개짜리 열거타입이 낫다.

 

직교성
직교란 수학에서 온 용어로 서로 직각을 이루며 교차한다는 뜻이다.
수학의 관점에서 직교하는 요소들은 서로 독립적이다.
이 개념을 소프트웨어 설계 영역으로 가져와 "직교성이 높다"라고 하면 "공통점이 없는 기능들이 잘 분리되어 있다" 혹은 "기능을 원자적으로 쪼개 제공한다" 정도로 해석할 수 있다.
List의 설명에서 '부분 리스트 얻기'와 '주어진 원소의 인덱스 구하기'는 서로 관련이 없다. 따라서 두 기능을 개별 메서드로 제공해야 직교성이 높다고 할 수 있다.
직교성을 높여 메서드 수를 줄여주는 효과란 세상 만물은 100개가 조금 넘는 원소가 결합되는 것과 마찬가지로 API도 기본 기능을 잘 갖추고 원자적으로 쪼개다 보면 자연스럽게 중복이 줄고 아무리 복잡한 기능이라도 조합해낼 수 있다.