티스토리 뷰
* 이펙티브 자바 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 자료형을 쓰는것도 고려해봐라
- 귀찮을 수도 있지만 훨씬 가독성이 좋은 코드가 만들어지고, 나중에 다른 옵션을 추가하기가 훨씬 쉬워진다.
'JAVA' 카테고리의 다른 글
null보다는 Optional이나 빈 컬렉션을 반환 (0) | 2022.07.29 |
---|---|
오버로딩과 오버라이딩 (0) | 2022.07.29 |
메서드 앞에서 인자의 유효성을 검사하라 (0) | 2022.07.27 |
Override 애노테이션을 일관되게 붙여라 (0) | 2022.07.27 |
enum에서 ordinal 메서드를 사용하지 마라 (0) | 2022.07.27 |