[교재 EffectiveJava] 아이템 51. 메서드 시그니처를 신중히 설계하라

반응형
728x90
반응형

메서드 시그니처 설계

1) 메서드 이름을 신중히 짓자.

항상 표준 명명 규칙을 따라야한다. 이해할 수 있고, 같은 패키지에 속한 다른 이름들과 일관되게 짓는게 최우선 목표다. 긴 이름은 피하고, 애매하면 자바 라이브러리의 API 가이드를 참조하자.

 

2) 편의 메서드를 너무 많이 만들지 말자.

모든 메서드는 각자 자신의 소임을 다해야한다. 메서드가 너무 많은 클래스는 익히고, 사용하고, 문서화하고, 테스트하고, 유지보수하기 어렵다. 클래스나 인터페이스는 자신의 각 기능을 완벽히 수행하는 메서드로 제공해야한다. 

 

3) 매개변수 목록은 짧게 유지하자.

매개변수가 4개 이상 넘어가면 이를 기억하기가 쉽지 않다. 같은 타입의 애개변수 여러개가 연달아 나오는 경우는 더 해롭다. 사용자가 매개변수 순서를 기억하기 어려울뿐더러, 실수로 순서를 바꿔 입력해도 그대로 컴파일되고 실행된다. 단지 의도와 다르게 동작한다.

 

 

긴 매개변수 목록을 짧게 줄여주는 기술

1) 여러 메서드로 쪼갠다. 쪼개진 메서드 각각은 원래 매개변수 목록의 부분 집합을 받는다.

예를 들어, 리스트에서 주어진 원소의 인덱스를 찾아야 하는데, 지정된 범위의 부분 리스트에서의 인덱스를 찾는다고 해보자. java.util.List의 경우에도 부분 리스트를 반환하는 subList 메서드와 주어진 원소의 인덱스를 알려주는 indexOf 메서드를 별개로 제공한다.

 

2) 매개변수 여러개를 묶어주는 도우미 클래스를 만든다. 일반적으로 이런 도우미 클래스는 정적 멤버 클래스로 둔다.

여러 매개변수 몇개를 독립된 하나의 개념으로 볼 수 있을때 추천하는 기법이다. 예를 들어, 카드 게임을 클래스로 만든다고 했을때 카드의 숫자(rank), 무늬(suit)를 뜻하는 두 매개변수를 항상 같은 순서로 전달할 것이다. 따라서 이 둘을 묶는 도우미 클래스를 만들어 하나의 매개변수로 주고받는 방법도 있다.

 

3) 앞서의 두 기법을 혼합한 것으로, 객체 생성에 사용한 빌더 패턴을 메서드 호출에 응용하면 된다.

모든 매개변수를 하나로 추상화한 객체로 정의하고, 클라이언트에서 이 객체의 세터(setter) 메서드를 호출하여 필요한 값을 설정하게 하는 것이다.  (예를 들면 VO 파일이 있다.)

 

 

매개변수 타입

1) 매개변수의 타입으로는 클래스보다는 인터페이스가 더 낫다.

매개변수로 적합한 인터페이스가 있다면 그 인터페이스의 구현 클래스가 아닌 해당 인터페이스를 직접 사용하자. 예를 들어 메서드에 HashMap을 넘길 일은 전혀 없다. 대신 Map 을 사용하자. 그러면 HashMap 뿐만 아니라 TreeMap, concurrentHashMap 등 어떤 Map 구현체도 인수로 넘길 수 있다. 

 

2) boolean 타입 보다는 원소 2개짜리 열거 타입이 낫다.

열거 타입을 사용하면 코드를 읽고 쓰기가 더 쉬워진다. 

 

예시코드

package com.java.effective.item51;

import java.util.List;

public class Main {
    public static void main(String[] args) {
        // boolean 타입의 경우 '섭씨가 아닌가? 맞는가?'
        boolean isCelsius = false;

        // enum 의 경우에는 다른 값이 추가되더라도 유연학 처리 가능
        System.out.println(TemperatureScaleScale.CELSIUS);
    }

}

enum TemperatureScaleScale {
    FAHRENHEIT,
    CELSIUS
}

 

 

 

 

반응형

Designed by JB FACTORY