메서드 이름을 신중히 짓자
항상 표준 명명 규칙을 따라야 한다.
이해할 수 있고, 같은 패키지에 속한 다른 이름들과 일관되게 짓는 게 최우선
그다음 목표는 개발자 커뮤니티에서 널리 받아들여지는 이름 사용(긴 이름은 피하자!)
편의 메서드를 너무 많이 만들지 말자
모든 메서드는 각각 자신의 소임을 다해야 한다.
메서드가 많은 클래스는 익히고, 사용하고, 문서화하고, 테스트하고, 유지보수하기 어렵다. (인터페이스도 마찬가지)
매개변수 목록은 짧게 유지하자
매개변수는 4개 이하가 좋다. 일단 4개가 넘어가면 매개변수를 전부 기억하기가 쉽지 않다.
같은 타입의 매개변수 여러개가 연달아 나오는 경우는 특히 해롭다. 사용자가 매개변수 순서를 기억하기 어려울뿐더러, 실수로 순서를 바꿔 입력해도 그대로 컴파일되고 실행된다. 단지 의도와 다르게 동작할뿐..
과하게 긴 매개변수 목록을 짧게 줄여주는 기술
1. 여러 메서드로 쪼갠다.
쪼개진 메서드 각각은 원래 매개변수 목록의 부분집합을 받는다. 잘못하면 메서드가 많아질 수 있지만, 직교성(orthogonality)를 높여 오히려 메서드 수를 줄여주는 효과가 있다.
java.util.List 인터페이스에서 주어진 원소의 인덱스를 찾아야 하는데, 전체 리스트가 아니라 지정된 범위의 부분리스트에서 인덱스를 찾는다고 해보자.
이 기능을 구현하기위해선 3개의 매개변수가 필요하다.
'부분리스트의 시작', '부분리스트의 끝', '찾을 원소' 그런데 List는 3개의 매개변수를 받는 메서드가 존재하는 것이 아니라, 부분 리스트를 반환하는 subList
메서드와 주어진 원소의 인덱스를 알려주는 indexOf
메서드를 별개로 제공한다. subList
가 반환한 부분리스트 역시 완벽한 List이므로 두 메서드를 조합하면 원하는 목적을 이룰 수 있다.직교(orthogonal)
란?
선형대수학에서 직교한다는 뜻은 두 벡터의 내적이 0인 것을 뜻한다. (두 벡터는 서로 직각을 이룸)
달리 말하면 두 벡터에는 서로 영향을 주는 성분이 전혀 없다는 뜻이다.
이 개념을 소프트웨어 설계 영역으로 가져오면 직교성이 높다 라고 하면 공통점이 없는 기능들이 잘 분리되어 있다. 또는 기능을 원자적으로 쪼개 제공한다. 로 해석이 가능하다.
기능을 원자적으로 쪼개다 보면, 자연스럽게 중복이 줄고 결합성이 낮아져 코드를 수정하기 수월해진다.
⇒ 테스트하기 쉬움건 물론이고, 일반적으로 직교성이 높은 설계는 가볍고 구현하기 쉽고 유연하고 강력하다.
2. 매개변수 여러 개를 묶어주는 도우미 클래스를 만든다
일반적으로 이런 도우미 클래스는 정적 멤버 클래스로 만든다. 잇따른 매개변수 몇 개를 독립된 하나의 개념으로 볼 수 있을때 사용하면 좋다.
만약 카드게임을 클래스로 만든다고 한다면, 메서드를 호출할 때 카드의 숫자(rank)와 무늬(suit)를 뜻하는 매개변수를 항상 같은 순서로 전달할 것이다. 따라서 이 둘을 묶는 도우미 클래스를 만들어 하나의 매개변수로 주고받으면 API는 물론 내부 구현도 깔끔해질 수 있다.
// Before
// SUIT는 enum타입이라고 가정 (스페이드, 하트 ...)
public void shuffle(int rank, SUIT suit){
... 섞는다.
}
// After
// rank, suit를 하나로 묶는 Card 도우미 클래스를 만든다.
public void shuffle(Card card){
... 섞는다.
}
// 내부 클래스로 정의
private static class Card{
int rank;
SUIT suit;
}
매개변수의 타입으로는 클래스보다는 인터페이스가 더 낫다
매개변수로 적합한 인터페이스가 있다면 (이를 구현한 클래스가 아닌) 그 인터페이스를 직접 사용하자.
예를 들면 매개변수로 HashMap 대신 Map을 사용하자. 그러면 HashMap뿐 아니라, TreeMap, ConcurrentHashMap, TreeMap의 부분맵 등 어떤 Map 구현체도 인수로 건넬 수 있다.
인터페이스 대신 클래스를 사용하면 클라이언트에게 특정 구현체만 사용하도록 제한하는 꼴이 된다.
또한 boolean보다는 원소 2개짜리 열거타입을 사용하자. (메서드 이름상 boolean을 받아야 의미가 더 명확할 때는 예외)
'프로그래밍 노트 > Effective 시리즈' 카테고리의 다른 글
자원을 직접 명시하지 말고 의존 객체 주입을 사용하자 (0) | 2020.01.18 |
---|---|
옵셔널(Optional)을 반환하는 메서드 설계 (0) | 2020.01.15 |
자바 명명규칙 (Naming Rule, Naming Convention) 컨벤션 (0) | 2020.01.12 |
매개변수가 유효한지 검사하자 (0) | 2020.01.09 |
null이 아닌, 빈 컬렉션이나 배열을 반환해야 한다. (2) | 2020.01.07 |