Search

아이템51 : 메서드 시그니처를 신중히 설계하라

“API 설계 요령들을 활용하면 배우기 쉽고, 쓰기 쉽고, 오류 가능성이 적은 API를 만들 수 있다.”

 메서드 이름은 신중하게

1.
표준 명명 규칙을 따라야 한다.
아이템68 : 일반적으로 통용되는 명명 규칙을 따르라
2.
이해하기 쉽게 짓자.
3.
같은 패키지에 속한 다름 이름들과 일관되게 짓자.
4.
널리 쓰이는 이름을 사용하자.
5.
긴 이름은 피하자.
6.
애매하면 자바 라이브러리 API 가이드를 참고하자.

 편의 메서드는 적게

메서드가 많은 클래스나 인터페이스는 익히고, 사용하고, 문서화하고, 테스트하고, 유지보수하기 힘들다.
자신의 각 기능을 완벽히 수행하는 메서드를 제공해야 한다.
자주 쓰일 경우만 별도의 약칭 메서드를 두고, 확신이 들지 않으면 만들지 말자.

 매개변수 목록은 짧게

4개 이하로 유지하는 연습을 하자.
같은 타입의 매개변수 여러 개가 연달아 나오는 경우를 피하자.
//public String getMessage(String name, String address, int age) { public String getMessage(String name, int age, String address) { String message = ""; ... return message; }
Java
매개변수 순서를 기억하기 힘들다.
실수로 순서를 바꿔 입력해도 그대로 컴파일되고 실행되므로, 의도와 다르게 동작할 수 있다.

 매개변수 목록 줄이기 1 : 여러 메서드로 쪼개기

쪼개진 메서드 각각을 원래 매개변수 목록의 부분집합을 받는다.
메서드가 많아질 수 있으나, 직교성을 높여 오히려 메서드 수를 줄여주는 효과를 얻을 수 있다.
좋은 예) java.util.List 인터페이스
아래 두 메서드를 조합하여 지정된 범위에서 인덱스를 찾을 수 있다.
subList : 부분 리스트 반환
indexOf : 주어진 원소의 인덱스 반환

 매개변수 목록 줄이기 2 : 매개변수 여러 개를 묶는 도우미 클래스 활용

여러 매개변수를 하나의 개념으로 볼 수 있을 때 추천하는 기법이다.
카드 게임 클래스(CardGame)
숫자(Rank), 무늬(Suit)를 매개변수로 전달
도우미 클래스(숫자 + 무늬)를 전달
이러한 도우미 클래스는 정적 멤버 클래스로 두어야 한다.

 매개변수 목록 줄이기 3 : 빌더 패턴을 메서드 호출에 응용

매개변수가 많을 때, 일부는 생략해도 괜찮을 때 도움되는 기법이다.
1.
모든 매개변수를 하나로 추상화한 객체 정의
2.
세터 메서드를 통해 값 설정
3.
클라이언트에서 execute 메서드를 호출하여 매개변수의 유효성 검사
4.
설정이 완료된 객체를 넘겨 원하는 계산 수행

 매개변수 타입은 클래스보다 인터페이스로

인터페이스 대신 클래스를 사용하면 클라이언트에게 특정 구현체만 사용하도록 제하는 꼴이 될 수 있다.
예) Map 대신 HashMap 타입 사용
입력 데이터가 다른 형태로 존재하면 특정 구현체의 객체로 옮겨 담게 된다.
이로 인해 비싼 복사 비용을 치러야 한다.

 boolean보다 원소 2개짜리 열거 타입으로

Thermometer.newInstance(true); Thermometer.newInstance(TemperatureScale.CELSIUS); //훨씬 명확하다
Java
열거 타입을 사용하면 코드를 읽고 쓰기가 쉽다.
추후 선택지를 추가하기도 쉽다.
그러나 메서드 이름상 boolean을 받아야 의미가 명확하다면 boolean을 사용해도 좋다.

 핵심 요약

좋은 메서드 시그니처의 핵심은 한 눈에 의도를 이해할 수 있는 모습을 유지해야 하는 것이라 생각한다.
네이밍, 매개변수 개수, 메서드는 잘게, 유연할 수 있게 여러 요소들을 고려하자.