일반적인 알고리즘을 반복해서 구현하지 말라
특정 프로젝트에 국한된 비즈니스 로직이 아닌, 수학적인 연산 등과 같은 모듈로 분리할 수 있는 부분은 반복해서 구현하지 말자.
이미 있는 것을 활용하면 아래와 같은 장점이 존재한다.
stdlib
는 가장 대표적인 라이브러리다.
override fun saveCallResult(item: SourceResponse) {
var sourceList = ArrayList<SourceEntity>()
item.sources.forEach {
var sourceEntity = SourceEntity()
sourceEntity.id = it.id
sourceEntity.category = it.category
sourceEntity.country = it.country
sourceEntity.description = it.description
sourceList.add(sourceEntity)
}
db.insertSources(sourcesList)
}
위는 다른 객체와 매핑하는 코드인데, 이는 for 반복문을 사용하는 것과 큰 차이가 없다. 또한 자바빈 패턴(값을 추가하면서 완성)을 사용한다.
코틀린에서는 이러한 코드를 map 함수를 사용할 수 있다.
override fun saveCallResult(item: SourceResponse) {
val sourceEntries = item.sources.map(::sourceToEntry)
db.insertSources(sourceEntries)
}
private fun sourceTnEntry(source: Source) = SourceEntity() {
.apply {
id = source.id
category = source.category
country = source.country
description = source.description
}
}
표준 라이브러리에 없고, 널리 알려진 추상화의 계산이라면 범용 유틸리티 함수로 정의하는 것이 좋다.
//컬렉션에 있는 모든 숫자를 곱한다.
fun Iterable<Int>.product() = fold(1) { acc, i -> acc * i }
product() 라는 함수 네이밍으로 동작을 예측할 수 있고, 이미 구현해두었다면 앞서 살펴본 장점을 누릴 수 있다.
동일한 결과를 얻는 함수를 여러 번 만든다면 테스트, 기억, 유지보수 측면에서 힘들기에 유틸리티성을 보장하는 것이 좋다.
코틀린 stdlib에 정의된 함수는 대부분 확장함수로 구현되어있다. 이는 다음과 같은 장점이 존재한다.
TextUtils.isEmpty("Text")
보다 "Text".isEmpty()
가 더 사용하기 쉽듯이, 자동 완성 기능으로 편리하게 찾을 수 있다.일반적인 알고리즘을 반복해서 작성하지 말고 웬만하면 stdlib
에 구현되어있을 것이므로 이를 잘 찾아보자. 만약 유틸성 코드를 작성해야한다면, 확장 함수로 정의해보자.
이런 유용한 정보를 나눠주셔서 감사합니다.