아래의 코드를 보면 일반적으로 A의 코드가 B보다 읽기 쉽다.
B의 코드는 코틀린에서 자주 사용하는 구문들을 사용했음에도, 코틀린 숙련자들도 읽기 쉽지 않다.
// 1. 읽기 쉽다
if (person !- null && person.isAdult) {
view.showPerson(person)
} else {
view.sohwError()
}
// 2. 읽기 어렵다
person?.takeIf { it.isAdult }
?.let(view::showPerson)
?: view.showError()
A의 구문은 B보다 아래와 같은 장점이 있다.
- 읽기 쉽다.
- 디버깅이 용이하다.
- IDE같은 디버깅 도구도 A코드에서 더 도움을 줄 확률이 높다.
그렇다고 코틀린의 let과 같은 구문을 쓰면 안될까?
당연히 적절한 상황에 적절하게 쓰는 것이 중요하다.
fun printName() {
person?.let {
println(it.name)
}
}
일반적으로 위와 같은 상황에 많이 사용되는데, 이런 관용구는 많은 사람들에게 쉽게 이해될 수 있다.
또한 let을 자주 사용하는 예시로 아래 두가지가 있다.
1. 연산을 아규먼트 처리 후로 이동시킬 때
print(students.filter{}.joinToString{}) // 변경 전
students.filter{}.joinToString{}.let(::print) // 변경 후
students
.filter( it.result >= 50 )
.joinToString(separator = "\n") {
"${it.name} ${it.surname}, ${it.result}"
}
.let(::print)
2. 데코레이터를 사용해서 객체를 랩할 때
var obj = FileInputStream("/file.gz")
.let(::BufferedInputStream)
.let(::ZipInputStream)
.let(::ObjectInputStream)
.readObject() as SomeObject
위의 코드는 경험이 적은 코틀린 개발자는 이해하기 어려울 수 도 있지만, 그 정도의 비용은 지불할만한 가치가 있을 정도로 유용하기 때문에 사용한다.
어떤 코드가 비용을 지불하면서라도 사용할만한 코드인지는 항상 고민해봐야 될 것같다.