forked from depromeet/effective-java-study
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Item51]: 메서드 시그니처를 신중히 설계하라 (depromeet#123)(시연) (depromeet#134)
- Loading branch information
Showing
1 changed file
with
95 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,95 @@ | ||
# item51. 메서드 시그니처를 신중히 설계하라 | ||
|
||
참고) 메서드 시그니처(Method Signature) | ||
- 메서드의 이름과 매개변수의 순서, 타입, 개수를 의미한다 | ||
- 메서드의 리턴 타입이나 예외 처리는 메서드 시그니처가 아니다 | ||
|
||
## 메서드 시그니처를 설계하는 방법 | ||
### 1. 메서드 이름을 신중히 짓자 | ||
- 표준 명명 규칙(item 68)을 따른 것 | ||
- 개발자 커뮤니티에서 널리 받으들여지는 이름을 사용할 것 | ||
- 긴 이름은 피할 것 | ||
- 애매하면 자바 라이브러리 API 가이드를 참고할 것 | ||
|
||
### 2. 편의 메소드를 너무 많이 만들지 말자 | ||
- 메서드가 너무 많은 클래스는 익히고, 사용하고, 문서화하고, 테스트하고, 유지보수하기 어렵다 | ||
- 자주 쓰일 경우에만 만들고 확신이 서지 않으면 만들지 말 것 | ||
|
||
### 3. 매개변수 목록은 짧게 유지하자 | ||
- 4개 이하를 유지할 것 | ||
- 같은 타입의 매개변수 여러 개가 연달아 나오는 경우가 특히 해롭다 | ||
- 실수로 순서를 바꿔 입력해도 그대로 컴파일되고 실행된다 | ||
|
||
### 매개변수 개수를 줄여주는 기술 세 가지 | ||
1. 여러 메서드로 쪼개기 | ||
```java | ||
/* 지정한 범위의 부분 리스트에서 인덱스를 찾기 */ | ||
findValue(int from, int to, Object value); // 전 | ||
|
||
nums.subList(start, end).indexOf(value); // 후 | ||
``` | ||
|
||
2. 매개변수 여러 개를 묶는 도우미 클래스를 만들기([참고](https://github.com/depromeet/effective-java-study/blob/main/Ch04/item24/%EB%A9%A4%EB%B2%84%20%ED%81%B4%EB%9E%98%EC%8A%A4%EB%8A%94%20%EB%90%98%EB%8F%84%EB%A1%9D%20static%20%ED%81%B4%EB%9E%98%EC%8A%A4%EB%A1%9C%20%EB%A7%8C%EB%93%A4%EB%9D%BC.md)) | ||
```java | ||
/* 카드 게임 */ | ||
public class Deck { | ||
public void shuffle() { } | ||
|
||
public void addCard(int suit, int rank) { } | ||
|
||
public void removeCard(int suit, int rank) { } | ||
} | ||
``` | ||
|
||
```java | ||
/* 카드 게임 */ | ||
public class Deck { | ||
static public class Card { | ||
private final int suit; // 무늬 | ||
private final int rank; // 숫자 | ||
} | ||
|
||
public void shuffle() { } | ||
|
||
public void addCard(Card c) { } | ||
|
||
public void removeCard(Card c) { } | ||
} | ||
``` | ||
|
||
3. 빌더 패턴을 적용한 객체를 메서드 호출에 응용하기([참고](https://github.com/depromeet/effective-java-study/blob/main/Ch02/item02/%EC%83%9D%EC%84%B1%EC%9E%90%EC%97%90_%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98%EA%B0%80_%EB%A7%8E%EB%8B%A4%EB%A9%B4_%EB%B9%8C%EB%8D%94%EB%A5%BC_%EA%B3%A0%EB%A0%A4%ED%95%98%EB%9D%BC.md)) | ||
```java | ||
Item item = Item.builder() | ||
.user(user) | ||
.song(song) | ||
.albumCover(song.getAlbum().getAlbumCover()) | ||
.content(itemCreateRequestDto.getContent()) | ||
.build(); | ||
``` | ||
|
||
### 4. 매개변수의 타입으로는 클래스보다는 인터페이스가 더 낫다 | ||
- 인터페이스를 사용하면 유연함을 제공한다 | ||
- List를 정렬하는 sort 메소드를 만든다면 List인터페이스를 매개변수로 사용하면 된다. 구현 클래스인 ArrayList나 LinkedList를 매개변수로 선언할 이유는 없다 | ||
```java | ||
/* Collections 클래스의 sort 메소드 */ | ||
public static <T extends Comparable<? super T>> void sort(List<T> list) { | ||
list.sort(null); | ||
} | ||
``` | ||
|
||
### 5. boolean보다는 원소 2개짜리 열거 타입이 낫다 | ||
- 코드의 가독성과 안전성을 높혀준다 | ||
```java | ||
public class Temperature { | ||
public Temperature(boolean isCelsius, double value) { } | ||
} | ||
``` | ||
|
||
```java | ||
public class Temperature { | ||
static public enum TemperatureScale { | ||
FAHRENHEIT, CELSIUS;} | ||
|
||
public Temperature(TemperatureScale temperatureScale, double value) { } | ||
} | ||
``` |