가독성을 목표로 설계하라
코드는 쓰기보다 읽기가 중요하다. (진짜 요즘 느낀다..) 따라서 항상 가독성을 생각하자
fun main() {
// 구현 A
if (person != null && perso.isAdult) {
view.showPerson(person)
} else {
view.showError()
}
// 구현 B
person?.takeIf { it.isAdult }
?.let(view::showPerson)
?: view.showError()
}
구현 A는 일반적인 관용구(if/else, &&, 메서드 호출)를 사용하는 반면, 구현 B는 안전 호출 ?., takeIf, let, Elvis 연산자 등을 사용하고 있다. B는 어느정도 코틀린을 이해한 개발자를 위한 코드로, A가 읽기 좋은 코드라고 볼 수 있다.
또한 else에 대해 추가할 때 A는 코드 한 줄을 추가하면 되는 반면, B는 run 이라는 함수를 더 추가해야한다.
즉, 익숙한 코드가 더 빠르게 읽을 수 있다.
그렇다고 해서 극단적을 코틀린의 함수를 쓰지말라는 얘기는 아니다.
class Person(val name: String)
var person: Person? = null
fun printName() {
person?.let {
print(it.name) //가변프로퍼티의 안전호출
}
}
let은 아래와 같이 다양하게 활용할 수 있다.
print(students.filter{}.joinToString{})
students.filter{}.joinToString{}.let(::print)
var obj = FileInputStream("/file.gz")
.let(::BufferedInputStream)
.let(::ZipInputStream)
.readObject() as SomeObject
val abe = "A" { "B" } and "C"
print(abc) // ABC
operator fun String.invoke(f: ()->String): String = this + f()
infix fun String.and(s: String) = this + s
항상 좋은 글 감사합니다.