Skip to content

Commit

Permalink
[Item51]: 메서드 시그니처를 신중히 설계하라 (depromeet#123)(시연) (depromeet#134)
Browse files Browse the repository at this point in the history
  • Loading branch information
siyeonSon authored Aug 27, 2023
1 parent f4846f5 commit 5daed25
Showing 1 changed file with 95 additions and 0 deletions.
95 changes: 95 additions & 0 deletions Ch08/item51/메서드_시그니처를_신중히_설계하라.md
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) { }
}
```

0 comments on commit 5daed25

Please sign in to comment.