View
API 설계 요령을 잘 활용하면 배우기 쉽고, 쓰기 쉬우며, 오류 가능성이 적은 API를 만들 수 있다.
5가지 API 설계 요령
1. 메서드의 이름을 신중히 짓자
- 표준 명명 규칙에 따라 메서드 이름을 짓는다.
- 메서드 명은 같은 패키지에 속한 다른 이름들과 일관되게 짓는다.
- 개발자 커뮤니티에서 널리 받아들여지는 이름을 사용하자.
- 너무 긴 메서드 명은 피하자.
- 애매하다면 자바 API 가이드를 참조해 이름을 지어보자.
2. 편의 메서드를 너무 많이 만들지 말자
너무 많은 메서드를 가진 클래스나 인터페이스는 사용하고, 문서화하고, 테스트하고, 유지 보수하기 어렵다. 또한, 구현하는 사람과 사용하는 사람 모두를 고통스럽게 한다.
클래스나 인터페이스는 자신의 각 기능을 완벽히 수행하는 메서드로 제공해야 하며, 아주 빈번하게 쓰일 경우에만 별도의 약칭 메서드를 두자. 이 확신이 서지 않는다면 만들지 말자.
3. 매개변수 목록은 짧게 유지하자
매개변수는 4개 이상이 되면 기억하기 어렵다. 특히, 같은 타입의 매개변수가 연달아 나오는 경우 매개변수의 순서를 기억하기 어렵고 순서를 잘못 입력해도 컴파일되고 실행되기 때문에 프로그램이 의도와 다르게 오작동하기 쉽다.
매개변수 목록을 줄여주는 3가지 기술
3-1. 여러 메서드로 쪼갠다.
메서드가 너무 많아질 수 있지만, 직교성을 높여 오히려 메서드 수를 줄여주는 효과도 있다.
"직교성이 높다."라는 뜻은 공통점이 없는 기능들이 잘 분리되어 있다는 것을 의미한다.
예를 들면, List에서 범위가 주어진 원소의 인덱스를 찾는 메서드를 만든다고 해보자. 이때 이 메서드에 필요한 매개변수는 '범위의 시작', '범위의 끝', '찾을 원소' 이렇게 3가지가 된다.
public int findIndex(int fromIndex, int toIndex, Object element) {
// 구현
}
List에서는 부분 리스트를 반환하는 subList와 찾을 원소의 인덱스를 반환하는 indexOf 메서드가 있다. 이 두 가지 메서드를 적절히 조합하면 위에서 원하는 기능을 만들어 낼 수 있다.
public int indexOf(Object element) {
// 구현
}
public List<String> subList(int fromIndex, int toIndex) {
// 구현
}
3-2. 매개변수 여러 개를 묶어주는 도우미 클래스를 만든다.
매개변수 몇 개를 독립된 하나의 개념으로 볼수 있을 때 추천하는 기법이다. 일반적으로 정적 멤버 클래스로 구현한다.
지도의 좌표를 찾는 메서드가 있다고 해보자. 이 메서드는 좌표를 나타내는 x, y 두 개의 매개변수를 받는다.
// before
public void findMapLocation(int x, int y) {
// 구현
}
이 메서드의 매개변수는 좌표를 나타내는 두 개의 매개변수를 가지는데, 좌표는 Location이라는 하나의 개념으로 표현할 수 있다. 이를 이용해 다음과 같이 매개변수를 줄일 수 있다.
// after
public void findMapLocation(Location location) {
// 구현
}
private static class Location {
int x;
int y;
}
3-3. 객체 생성에 사용한 빌더 패턴을 메서드 호출에 응용한다.
위 두 가지 방법을 혼합한 방법으로 매개변수가 많을 때, 특히 그중 일부는 생략해도 괜찮을 때 사용하기 좋다.
- 모든 매개변수를 추상화한 객체를 만든다.(2번에서 다룬 Location과 같은 객체)
- 클라이언트에서 setter를 호출해 값을 설정한다.
- execute 메서드로 설정한 매개변수의 유효성을 검사한다.
- 설정 완료된 객체를 넘겨 원하는 계산을 수행한다.
4. 매개변수 타입으로 클래스보다 인터페이스를 사용하자
매개변수로 적합한 인터페이스가 있다면 그 인터페이스를 사용하자.
예를 들어, 매개변수로 HashMap을 받기보다 Map으로 받자. 이렇게 하면 TreeMap, ConcurrenthashMap 등 어떤 Map 구현체라도 인수로 넘길 수 있다.
5. boolean보다는 원소 2개짜리 열거 타입이 낫다
열거 타입을 사용하는게 더 좋다. 코드를 읽고 쓰기가 더 쉬워지기 때문이다. 물론 예외는 존재한다. 만약 메서드 이름상 boolean을 받아야 더 의미가 명확한 경우라면 boolean을 사용하자.
public enum TemperatureScale {FARENHEIT, CELSIUS}
// 어떤게 더 명확한가?
Thermometer.newInstance(true);
Thermometer.newInstance(TemperatureScale.CELSIUS);
'BackEnd > 이펙티브 자바' 카테고리의 다른 글
[이펙티브 자바] Item53 - 가변인수는 신중히 사용하라 (0) | 2021.07.12 |
---|---|
[이펙티브 자바] Item52 - 다중정의는 신중히 사용하라 (0) | 2021.07.09 |
[이펙티브 자바] Item50 - 적시에 방어적 복사본을 만들라 (0) | 2021.06.30 |
[이펙티브 자바] Item49 - 매개변수가 유효한지 검사하라 (0) | 2021.06.26 |
[이펙티브 자바] Item48 - 스트림 병렬화는 주의해서 적용하라 (0) | 2021.06.25 |