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

Jimin Lim·2023년 7월 31일
0

Effective Kotlin

목록 보기
20/39
post-thumbnail

아이템 20

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

특정 프로젝트에 국한된 비즈니스 로직이 아닌, 수학적인 연산 등과 같은 모듈로 분리할 수 있는 부분은 반복해서 구현하지 말자.

이미 있는 것을 활용하면 아래와 같은 장점이 존재한다.

  1. 코드 작성 속도 빨라짐
  2. 함수 이름만 보고 동작을 알 수 있음
  3. 직접 구현의 실수를 줄임

표준 라이브러리

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에 정의된 함수는 대부분 확장함수로 구현되어있다. 이는 다음과 같은 장점이 존재한다.

  1. 확장 함수는 구체 타입이 있는 객체에만 사용을 제한할 수 있어 좋다.
  2. TextUtils.isEmpty("Text")보다 "Text".isEmpty()가 더 사용하기 쉽듯이, 자동 완성 기능으로 편리하게 찾을 수 있다.

정리

일반적인 알고리즘을 반복해서 작성하지 말고 웬만하면 stdlib에 구현되어있을 것이므로 이를 잘 찾아보자. 만약 유틸성 코드를 작성해야한다면, 확장 함수로 정의해보자.

profile
💻 ☕️ 🏝 🍑 🍹 🏊‍♀️

1개의 댓글

comment-user-thumbnail
2023년 7월 31일

이런 유용한 정보를 나눠주셔서 감사합니다.

답글 달기