아이템 20. 일반적인 알고리즘을 반복해서 구현하지 말라

아이템 20. 일반적인 알고리즘을 반복해서 구현하지 말라

일반적인 알고리즘을 반복해서 구현하지 말라 #

여기서 말하는 알고리즘은 특정 프로젝트에 국한된 것이 아니라 정말 일반적인(수학 연산과 같은)것들을 말한다.

(깨알 TIP) 아래 코드는 권장되지 않는 코드다. 팩토리 메서드를 활용하거나 기본 생성자를 활용하는 것이 좋다.

item.sources.forEach {
    var sourceEntity = SourceEntity()
    sourceEntity.id = it.id
    sourceEntity.category = it.category
    ...
}

널리 알려진, 일반적으로 모두 이해할 수 있는 것들은(수학 연산과 같은), 꼭 여러 번 재사용되지 않는다고 해도 공통으로 추출하는 것이 좋다. 예를 들면 아래와 같다.

// 잘 알려진 수학적 개념이고, 대부분 예측할 수 있다.
fun Iterable<Int>.product() = 
    fold(1) { acc, i -> acc * i }

알고리즘을 추출할 때 다음과 같은 방법이 있다.

  1. Top-level 함수
  2. 프로퍼티 위임
  3. 클래스
  4. 확장 함수
  • 함수는 상태(state)를 유지하지 않으므로, 행위를 나타내기 좋다.
  • Top-level 함수와 비교해서, 확장 함수는 구체적인 타입이 있는 객체에만 사용을 제한할 수 있기에 좋다.
  • 수정할 객체를 아규먼트로 받는 것(= 일반적인 함수)보다 확장 리시버(= 확장 함수?)로 사용하는 것이 가독성 측면에서 좋다.
  • 확장 함수는 객체를 사용할 때 자동 완성 기능과 같은 제안이 이뤄지므로 쉽게 함수를 찾아, 사용할 수 있다.

프로퍼티 위임 예시는 한번 보면 좋겠다.

" 특정 알고리즘을 반복해서 사용해야 하는 경우 프로젝트 내부에 직접 정의하기 바랍니다. 일반적으로 이런 알고리즘들은 확장 함수로 정의하는 것이 좋습니다. “

(깨알 TIP) 공통 알고리즘 추출 시 확장 함수가 잘 쓰인다.