본문 바로가기

Reading Record/이펙티브 코틀린

[이펙티브 코틀린] Item11. 가독성을 목표로 설계하라

인식 부하 감소

if (person != null && person.isAdult) {
            view.showPerson(person)
        } else {
            view.showError()
 }
person?.takeIf { it.isAdult }
            ?.let(view::showPerson)
            ?: view.showError()
  • 일반적인 관용구 사용은 이해하기 쉽다
  • 코틀린에서 자주 사용되는 관용구 takeIf,let,엘비스 연산자는 코틀린 개발자는 익숙하지만, 숙련된 개발자만을 위한 코드는 좋은 코드가 아니다
    • takeIf
    • public inline fun <T> T.takeIf(predicate: (T) -> Boolean): T? = if (predicate(this)) this else null
    • let
    • inline fun <T, R> T.let(block: (T) -> R): R { return block(this) }
  • 첫번째 예제는 두번째 예제보다 수정이 용이하다
    • 함수 참조를 사용할 수 없으므로 람다식 수정 필요
  • let의 리턴값이 null이면 showError가 호출된다. 첫번째 예제와 다르게 동작할 수 있음

극단적이 되지 않기

  • let
    • 연산을 아규먼트 처리 후로 이동시킬 때
    • print(students.filter{}.joinToString{}) -> students.filter{}.joinToString{}.let(::print)
    • 데코레이터를 사용해서 객체를 랩할 때
    • var obj = FileInputStream("/file.gz") .let(::BufferedInputStream) .let(::ZipInputStream) .let(::ObjectInputStream) .readObject() as SomeObject

###