티스토리 뷰

JAVA

메서드 설계는 신중하게

세댕댕이 2022. 7. 28. 18:06

* 이펙티브 자바 2/E를 읽고 공부하기 위해 기록한 게시글입니다.

40. 메서드 시그니처는 신중하게 설계하라

 

<메서드를 만들 때 지켜야 할 원칙들>

1. 메서드 이름을 신중하게 골라라

- 네이밍 컨벤션을 따르는 것이 제일 베스트.

- 이해하기 쉬우면서도 같은 패키지 안의 다른 이름들과 일관성이 유지되는 이름을 고르자

- 널리 합의된 사항에도 부합하는 이름을 고를 것.

 

2. 편의 메서드를 제공하는데 너무 열올리지 마라

- 모든 메서드는 맡은 일이 명확하고, 또 그것에 충실해야 한다.

- 클래스에 메서드가 너무 많으면 학습, 사용, 테스트, 유지보수 등 모든 측면이 어려워진다. 특히 인터페이스의 경우는 메서드가 많으면 더 심각하다.

 - 클래스나 인터페이스가 수행해야 하는 동작 각각에 대해서 기능적으로 완전한 메서드를 제공하라.

 

3. 인자 리스트를 너무 길게 만들지 마라

- 가급적 4개 이하로 만들도록 해라

- 인자 리스트가 너무 길면 제대로 기억할 수도 없고, 인자 순서를 잘못 넣어서 꼬일 확률이 높아진다.

 

 

+) 긴 인자 리스트를 어떻게 하면 줄일 수 있을까?

1. 여러 메서드로 쪼개는 방법

- 이 방법은 주의하지 않으면 너무 많은 메서드를 만들어낼 수도 있다. 하지만 제대로 사용한다면 직교성 향상을 통해 메서드를 오히려 줄일 수 있다.

 

2. helper class를 만들어 인자들을 그룹별로 나누는 방법

- 대개 static으로 만든 helper class를 이용해 인자들을 그룹으로 묶는다. 

- 자주 등장하는 일련의 인자들이 어떤 별도의 개체(entity)를 나타낼 때 쓰면 좋은 방법. 마치 DAO와 같은 느낌?

 

3. 빌더 패턴을 응용해서 객체 생성 대신 메서드 호출에 적용하는 방법.

- 1번과 2번 방법을 결합한 궁극의 방법

- 많은 인자가 필요한 메서드를 만들어야 하고, 그 인자들 중 상당수가 선택적 옵션이라면 모든 인자를 표현하는 객체 하나를 정의하고 그 객체의 setter 메서드를 클라이언트가 여러번 호출할 수 있도록 하는 것.

(이 setter 메서드는 인자 하나 또는 관련된 여러개의 인자를 동시에 설정해주는 메서드)

- setter를 통해 원하는대로 인자를 설정하고 난 이후에 해당 객체의 execute 메서드를 호출하여 인자의 유효성을 검사하고 난 이후에 실제 계산을 진행하는 방식.

public class User {
    private String name;
    private String tel;
    private String birth;

    public static class MethodBuilder {
        private String name;
        private String tel;
        private String birth;

        public MethodBuilder() {}

        public MethodBuilder name(String name) {
            this.name = name; return this;
        }
        public MethodBuilder tel(String tel) {
            this.tel = tel; return this;
        }
        public MethodBuilder birth(String birth) {
            this.birth = birth; return this;
        }
        public String execute() {
            System.out.println("execute Method");
            return "OK";
        }
    }
}
///
public class EffectiveJava {
    public static void main(String[] args) {
        String result = new User.MethodBuilder()
                .name("name")
                .birth("birth")
                .tel("tel").execute();
    }
}

예제 코드가 없어서 뭐가뭔지 모르겠는데 아마 이런 방식이 아닐까 싶다.

Fluent Builder pattern이라는 용어가 있는 것 같던데 그냥 새로운 객체를 생성하는 대신 메서드만 실행하는 용도로 사용한다는 것으로 생각하면 될듯?

 

 

* 인자의 자료형으로는 클래스보다 인터페이스를 받는 것이 좋다..

- 인자를 정의하기에 적합한 인터페이스가 있다면 인터페이스를 구현하는 클래스 대신 인터페이스를 인자 타입으로 받아라. (다형성 따봉)

-> 클래스를 받게되면 클라이언트는 특정한 구현에 종속되게 된다.

 

* 인자 자료형으로 boolean을 쓰는 것 보다는 원소가 두개인 enum 자료형을 쓰는것도 고려해봐라

- 귀찮을 수도 있지만 훨씬 가독성이 좋은 코드가 만들어지고, 나중에 다른 옵션을 추가하기가 훨씬 쉬워진다.

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함