#40 메서드 시그니처를 신중하게 설계하자
뻔한 얘기지만, 일관성 있고 이해하기 쉽고, 공감이 가는 이름으로 지어야 합니다.
그리고 표준 작명 규칙(standard naming convention)을 따라야 합니다.
이름은 동사(verbs)로 이루어져 있고, 첫 글자는 소문자 그리고 각 내부 단어의 첫 글자는 대문자로 해야 합니다.
메서드가 너무 많으면, 이를 이해하고 사용하고 문서화하고 테스트하고 유지 보수하기 어렵게 됩니다.
따라서 각 동작에 대해서 충분한 기능을 수행하는 메서드를 적절하게 제공해야 합니다.
매개 변수는 4개 이하를 목표로 하는 게 좋습니다.
이전에 빌더 패턴에서도 얘기했듯이, 매개 변수가 많아지면 유지 보수도 힘들고 가독성도 떨어집니다.
이러한 매개 변수를 줄이는 방법들이 있습니다.
1. 하나의 메서드를 여러 개로 쪼갬
하나의 메서드를 여러 개로 쪼개면, 각 메서드는 매개 변수의 일부만 필요합니다.
예를 들어, 아래와 같이 List의 특정 요소들(subList) 중, 해당 요소의 마지막 인덱스(lastIndex)를 구하기 위해서는 3개의 매개 변수가 필요하지만 이러한 메서드는 제공되지 않습니다.
list = a, b, c, d, b, f 중 index를 기준으로 1~3번째 sub list를 구함
sub list = b, c, d 중 "b" 요소의 마지막 index를 int 형태로 반환
대신 매개 변수가 1~2개가 필요한 subList(int fromIndex, toIndex)와 lastIndexOf(E e) 메서드를 조합하면, 이 값을 구할 수 있습니다.
list = a, b, c, d, b, f 중 index를 기준으로 1~3번째 sub list를 구함 >> subList 메서드
sub list = b, c, d 중 "b" 요소의 마지막 index를 int 형태로 반환 >> lastIndexOf 메서드
2. 매개 변수 그룹들을 보존하는 지원 클래스(helper class)를 만듦
매개 변수 그룹을 보존하는 지원 클래스(helper class)를 만들 수 있습니다.
클래스를 만들어야 하지만, 이를 통해 매개 변수를 한 번에 보낼 수 있습니다.
3. 빌더 패턴을 이용
빌더 패턴을 이용할 수 있습니다. 자세한 내용은 아래를 참고해 주시기 바랍니다.
https://brunch.co.kr/@oemilk/117
예를 들어, Map을 이용한다면 HashMap 클래스보다 Map 인터페이스가 더 좋습니다.
Map 인터페이스를 매개 변수로 쓰면 HashMap, TreeMap 등 Map 인터페이스를 구현한 어떠한 클래스도 다 가능합니다.
하지만 클래스를 이용하면, HashMap, TreeMap 등 타입에 따라 별도의 메서드를 작성해야 합니다.
아래 메서드는 Live 타입인지 아닌지에 따라 Player를 설정하는 로직이 다른 메서드입니다.
만약 타입이 늘어나게 된다면, boolean 매개 변수를 추가해야 합니다.
이를 enum으로 구현한다면, 아래와 같이 하나의 매개 변수로 구현이 가능합니다.