너무 많은 메서드를 가진 클래스는 익히고, 사용하고, 문서화하고, 테스트하고, 유지보수하기 어렵다
인터페이스도 마찬가지로, 클래스나 인터페이스는 자신의 각 기능을 완벽히 수행하는 메서드로 제공해야 한다
확신이 서지 않는다면, 만들지 말자
매개변수 목록은 짧게 유지하자
4개 이하가 좋다
같은 타입의 매개변수 여러 개가 나오는 것은 좋지 않으므로, 매개변수를 줄일 수 있는 방법을 살펴보자
매개변수 목록을 짧게 줄이기
1. 여러 메서드로 쪼개기
쪼개진 메서드 각각은 원래의 매개변수 목록의 부분집합을 받는다
잘못하면 메서드가 너무 많아질 수도 있지만, 직교성 (orthogonality)을 높여서 오히려 메서드 수를 줄여주는 효과도 있다
직교성 (orthogonality)
직각을 이루며 교차하는 것으로, 직교하는 요소들은 서로 독립적이다
직교성이 높다 = 공통점이 없는 기능들이 잘 분리되어 있다 = 기능을 원자적으로 잘 쪼갰다
2. 매개변수 여러 개를 묶어주는 도우미 클래스를 만들어라
// 기존 메서드
public void cardGame(String rank, String suit) {
// do something
}
// Helper 클래스 적용
class Card {
String rank;
String suit;
}
public void cardGame(Card card) {
// do something
}
일반적으로 도우미 클래스는 정적 멤버 클래스로 둔다
잇따른 매개변수 몇 개를 독립된 하나의 개념으로 볼 수 있을 때 추천하는 기법으로,
카드 게임을 클래스로 만든다고 할 때, 메서드 호출 시 카드의 숫자와 무늬 매개변수를 항상 같은 순서로 전달할 것이다
따라서, 이 둘을 묶는 도우미 클래스를 만들어서 하나의 매개변수로 주고받으면 API는 물론, 클래스 내부 구현도 깔끔해질 것이다
3. 빌더 패턴을 활용하자
매개변수가 많은데, 그 중 일부는 생략해도 괜찮을 때 좋은 방법이다
모든 매개변수를 하나로 추상화 한 객체를 정의하고, 클라이언트에서 이 객체의 setter 메서드를 호출해서 필요한 값을 설정하게 한다
4. 파라미터의 타입으로 클래스보다는 인터페이스 형태가 낫다
매개변수로 적합한 인터페이스가 있다면, 그 인터페이스를 직접 사용하는 것이 더 낫다
ex) HashMap 보다는 Map을 사용하는 것이 더 낫다
5. Boolean 보다는 원소 2개짜리 Enum이 더 낫다
열거 타입을 사용하면 코드를 읽고 쓰기가 더 쉬워지고, 나중에 선택지를 추가하기도 더 쉽다
아이템 51. 메서드 시그니처를 신중히 설계하라
메서드 이름은 신중히 지어야 한다
편의 메서드를 너무 많이 만들지는 말자
매개변수 목록은 짧게 유지하자
매개변수 목록을 짧게 줄이기
1. 여러 메서드로 쪼개기
2. 매개변수 여러 개를 묶어주는 도우미 클래스를 만들어라
3. 빌더 패턴을 활용하자
4. 파라미터의 타입으로 클래스보다는 인터페이스 형태가 낫다
5. Boolean 보다는 원소 2개짜리 Enum이 더 낫다