Effective Kotlin 아이템 20 : 일반적인 알고리즘을 구현하지 말라

0
post-thumbnail

많은 개발자들이 같은 알고리즘을 반복해서 구현한다.

이미 언어에서 제공되고 있는 함수인데도 말이다.

val percent = when{
 numberFromUser > 100 -> 100
 numberFromUser < 0  -> 0
else	->	numberFromUser
}

이함수는 이미 coereIn 확장함수로 이미 존재한다.

내장되어 있는 함수를 사용하면 어떤 장점이 있을까?

  • 코드 작성속도가 빨라진다.
  • 함수의 이름만 보고도 무엇을 하는지 확실하게 알수있다(Doc가 확실하게 제공)
  • 직접 구현할때 발생하는 실수를 줄일수 있다.
  • 최적화 혜택을 받을수 있다. (왜냐하면 수많은 최고의 개발자들이 짰기 때문에)

표준 라이브러리 살펴보기

일반적인 알고리즘은 대부분 이미 다른 사람들이 정의해 놓았다.

stdlib는 확장함수를 활용해 만들어진 거대한 유틸리티 라이브러리다.

overide fun saveCallResult(item : SourceResponse){
	var sourceList = ArrayList<SourceEntity>()
    item.sources.forEach{
   	var sourceEntity = SourceEntity
    sourceEntity.id	= it.id
    ..
    ..
   }
	db.insertSource
}

앞의 코드에서 forEach를 사용하는것은 For반복문을 사용하는것과 같다.

현재 사용된 코드에서는 매핑처리를 하고 있으므로, map() 함수를 사용하는것이 좋다.

또한 SourceEntity를 설정하는 부분이 JavaBean패턴을 사용하고있는데
이러한 형태보단 팩토리 메서드나, 기본 생성자를 사용하는것이 좋다.

나만의 유틸리티 구현하기

상황에 따라 표준 라이브러리에 없는 알고리즘이 필요하다.
만약 모든 숫자의 곱을 계싼하는 라이브러리가 필요하다면 어떻게 해야할까?
이는 널리 알려진 추상화(공통적으로 사용될수 있기 때문에) 범용 유틸리티 함수로 정의 하는것이 좋다.

중요한 부분은 여러번 사용하지 않는다고 해도 이렇게 만드는것이 좋다.

동일한 결과를 얻는 함수를 여러번 만드는것은 잘못된 일이다.

모든 함수는 테스트 되어야하며, 유지보수 되어야하기 때문에 기존에 관련된 함수가 있는지 탐색하는 과정이 필요하다.

확장 함수로 구현하면 일반적인 함수로 구현할때보다 많은 장점을 갖고있다.

  • 구체적인 타입이 있는 객체에만 사용을 제한할수 있다.
  • 확장함수는 자동완성 기능등으로 제안이 이루어지기 때문에 쉽게 찾을수 있다.
  • 확장 리시버로 사용하는것이 가독성 측면에서 좋다.

정리

  • 일반적인 알고리즘을 반복해서 만들지 말라 거의다 stdlib에 정의되어 있는경우가 많다.
  • 만약 없는 알고리즘이나 특정 알고리즘을 반복해서 사용할 경우, 프로젝트 내부에 직접 정의하라. (라이브러리로 빼지말라는 소리인가?)
  • 추가로 알고리즘이 들어간 유틸 함수는 확장함수로 정의하는것이 좋다.
profile
쉽게 가르칠수 있도록 노력하자

0개의 댓글