티스토리 뷰
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
반응형
'스터디 > 이펙티브 자바' 카테고리의 다른 글
이펙티브 자바 - Item53. 가변인수는 신중히 사용하라 (0) | 2022.08.06 |
---|---|
이펙티브 자바 - Item52. 다중정의는 신중하게 사용하라 (0) | 2022.08.05 |
이펙티브 자바 - Item50. 적시에 방어적 복사본을 만들라 (0) | 2022.08.03 |
이펙티브 자바 - Item49. 매개변수가 유효한지 검사하라 (0) | 2022.08.02 |
이펙티브 자바 - Item48. 스트림 병렬화는 주의해서 적용하라 (0) | 2022.08.01 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- 람다 표현식
- redis sorted set으로 대기열 구현
- pipe and filter architecture
- microkernel architecture
- java userThread와 DaemonThread
- 트랜잭셔널 아웃박스 패턴 스프링부트
- polling publisher spring boot
- 레이어드 아키텍처란
- spring boot excel download oom
- 자바 백엔드 개발자 추천 도서
- 서비스 기반 아키텍처
- 트랜잭셔널 아웃박스 패턴 스프링 부트 예제
- pipeline architecture
- transactional outbox pattern
- 공간 기반 아키텍처
- java ThreadLocal
- @ControllerAdvice
- space based architecture
- JDK Dynamic Proxy와 CGLIB의 차이
- spring boot redisson sorted set
- spring boot redis 대기열 구현
- spring boot poi excel download
- spring boot 엑셀 다운로드
- transactional outbox pattern spring boot
- spring boot redisson destributed lock
- spring boot excel download paging
- redis sorted set
- service based architecture
- spring boot redisson 분산락 구현
- redis 대기열 구현
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함