클린코드를 위한 함수

함수는 한 가지만 해라!

함수에 적힌 코드들의 추상화 수준이 같은 단계로 통일시켜라는 의미다.
혹은 함수 내에서 의미있는 이름으로 다른 함수를 추출할 수 있으면 그 함수는 여러 작업을 하는 셈이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
public Lotto createLotto(List<String> tokens) {
List<Integer> numbers = new ArrayList<>();
for (String token : tokens) {
numbers.add(Integer.parseInt(token));
}

List<LottoNumber> lottoNumbers = new ArrayList<>();
for (int number : numbers) {
lottoNumbers.add(new LottoNumber(number));
}

return new Lotto(lottoNumbers);
}

위 코드는 크게 추상화 단계가 두가지이다.

  • 문자열을 숫자로 바꾸는 단계 (추상화 단계 낮음)
  • 숫자를 LottoNumber로 바꾸는 단계 (추상화 단계 중간)
  • LottoNumber를 Lotto로 바꾸는 단계 (추상화 단계 높음)

이제 이 작업들을 나눠서 리팩토링 해보자.
자연스럽게 내려가기 규칙이 적용되서 다음에 오는 함수는 추상화 단계가 하나씩 줄어드는 걸 볼 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public Lotto createLotto(List<String> tokens) {
return new Lotto(createLottoNumbers(tokens));
}

public List<LottoNumber> createLottoNumbers(List<String> tokens) {
List<LottoNumber> lottoNumbers = new ArrayList();
for (int number : parseAll(tokens)) {
lottoNumbers.add(number);
}
return lottoNumbers;
}

public List<Integer> parseAll(List<String> tokens) {
List<Integer> numbers = new ArrayList<>();
for (String token : tokens) {
numbers.add(Integer.parse(token));
}
return numbers;
}

함수 인수

함수에 전달되는 인수는 0개가 제일 좋다.
3개 이상은 되도록 피해야 한다.

Share