티스토리 뷰

728x90
반응형

메서드 시그니처를 신중히 설계하라


  • 메서드 시그니처란 메서드의 이름과 매개변수의 순서, 타입, 개수를 의미합니다. 신기한 건 메서드의 리턴 타입과 예외처리는 메서드 시그니처가 아니라고 합니다.

 

💡 메서드 이름은 신중히 짓자

  • 표준 명명 규칙 및 관례를 따르는게 좋습니다.
  • 같은 패키지에 속한 다른 이름들과 일관되게 짓는게 좋습니다.
  • 개발자 커뮤니티에서 널리 받아들여지는 이름을 사용하는게 좋습니다.
  • 긴 이름은 피하는게 좋습니다.
  • 애매하다면 자바 라이브러리의 API 가이드를 참고하는게 좋습니다.

 

💡 편의 메서드를 너무 많이 만들지 말자

  • 메서드가 너무 많은 클래스 및 인터페이스는 오히려 익히고, 사용하고, 문서화하고, 테스트하고, 유지보수하기에 어려움을 가집니다.
  • 클래스나 인터페이스는 자신의 각 기능을 완벽히 수행하는 메서드를 제공해야 합니다.
  • 매개변수 목록은 짧게 유지하는게 좋습니다.
    • 4개 이하가 좋습니다.
    • 매개변수가 많아지면 DTO 클래스를 사용하는게 좋습니다.
    • 같은 타입의 매개변수가 여러번 연달아 나오는 경우 주의가 필요합니다.

 

💡 매개변수를 줄이는 방법 1)

  • 메서드를 분리합니다.
  • 하나의 메서드에 책임이 집중될수록 매개변수가 생각치않게 늘어날 수 있습니다.
  • 예를 들어 어떤 리스트에서 주어진 원소를 찾아야 하는데 전체 리스트에서 찾는게 아닌 지정된 범위의 부분 리스트에서 주어진 원소를 찾아야 하는 요구사항이 있다는 가정하에, 이 기능을 만들려고 했을 때 부분 리스트의 시작점, 끝점, 찾을 원소 이렇게 총 3개의 매개변수가 필요합니다.
// findElementAtArray 메서드는 책임이 집중되어 있습니다.
public class Example {

    private static final int arr[] = {1, 2, 3, 4};

    public static void main(String[] args) {
        findElementAtArray(1, 3, 2); // 1 반환, 2는 1번째 위치에 있으므로
    }

    private static int findElementAtArray(int start, int end, Object element) {
        int o = (int) element;
        for (int i = start; i < end; i++) {
            if (arr[i] == o) {
                return i;
            }
        }
        return -1;
    }
}

 

  • 위의 방식을 아래와 같은 방식으로 쪼갤 수 있습니다.
  • 이렇게 쪼개면 자연스럽게 중복이 줄고 결합성이 낮아집니다. 코드를 수정하고 테스트하기 쉬워집니다. 그렇다고해서 무작정 나누는게 좋은 것만은 아닙니다. API 사용자의 눈높이에 맞게, API가 다루는 개념의 추상화 수준에 맞게 조절해야 합니다.
int[] subArray(int start, int end);

int indexOf(Object o);

 

💡 매개변수를 줄이는 방법 2)

  • 도우미 클래스를 만들 수 있습니다.(DTO)
@Getter
public class MemberDTO {
    
    private String name;
    private String address;
    private String number;
    private int age;
}

 

💡 매개변수의 타입으로는 클래스보다 인터페이스가 더 좋습니다.

  • 매개변수 타입으로 인터페이스를 사용하면 훨씬 더 나은 유연함을 제공할 수 있습니다. 예를들어 HashMap이 매개변수인 경우 인터페이스인 Map을 사용하면 TreeMap, HashMap, ConcurrentHashMap 등 어떤 Map의 구현체라도 받을 수 있습니다.

 

💡 Boolean 보다 열거타입이 낫습니다.(메서드 이름상 boolean이 더 명확한 경우 예외)

  • 열거 타입을 사용하면 코드의 가독성이 더 높아집니다.
// 전
public class Example {
    
    boolean button;
    
    public void changeSwitch(boolean on) {
        if (on) {
            this.button = true;
            onLight();
        } else {
            this.button = false;
            offLight();
        }
    }
}

// 후
public class Example {

    ButtonType button;

    public enum ButtonType {
        ON, OFF
    }

    public void changeSwitch(ButtonType type) {
        if (ButtonType.ON == type) {
            this.button = type;
            onLight();
        } else {
            this.button = type;
            offLight();
        }
    }
}

 

 

 

 

 

 

728x90
반응형