가독성을 목표로 설계하라

인식 부하 감소

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가 호출된다. 첫번째 예제와 다르게 동작할 수 있음

극단적이 되지 않기

연산을 아규먼트 처리 후로 이동시킬 때

print(students.filter{}.joinToString{}) -> students.filter{}.joinToString{}.let(::print)

데코레이터를 사용해서 객체를 랩할 때

var obj = FileInputStream("/file.gz") .let(::BufferedInputStream) .let(::ZipInputStream) .let(::ObjectInputStream) .readObject() as SomeObject

Last updated