일반적인 알고리즘을 반복해서 구현하지 말라 #
여기서 말하는 알고리즘은 특정 프로젝트에 국한된 것이 아니라 정말 일반적인(수학 연산과 같은)것들을 말한다.
(깨알 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 }
알고리즘을 추출할 때 다음과 같은 방법이 있다.
- Top-level 함수
- 프로퍼티 위임
- 클래스
- 확장 함수
- 함수는 상태(state)를 유지하지 않으므로, 행위를 나타내기 좋다.
- Top-level 함수와 비교해서, 확장 함수는 구체적인 타입이 있는 객체에만 사용을 제한할 수 있기에 좋다.
- 수정할 객체를 아규먼트로 받는 것(= 일반적인 함수)보다 확장 리시버(= 확장 함수?)로 사용하는 것이 가독성 측면에서 좋다.
- 확장 함수는 객체를 사용할 때 자동 완성 기능과 같은 제안이 이뤄지므로 쉽게 함수를 찾아, 사용할 수 있다.
프로퍼티 위임 예시는 한번 보면 좋겠다.
" 특정 알고리즘을 반복해서 사용해야 하는 경우 프로젝트 내부에 직접 정의하기 바랍니다. 일반적으로 이런 알고리즘들은 확장 함수로 정의하는 것이 좋습니다. “
(깨알 TIP) 공통 알고리즘 추출 시 확장 함수가 잘 쓰인다.