함수에 적힌 코드들의 추상화 수준이 같은 단계로 통일시켜라는 의미다. 혹은 함수 내에서 의미있는 이름으로 다른 함수를 추출할 수 있으면 그 함수는 여러 작업을 하는 셈이다.
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)); } returnnew 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){ returnnew 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; }