인식 부하 감소
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
###
'Reading Record > 이펙티브 코틀린' 카테고리의 다른 글
[이펙티브 코틀린] Item13. Unit?을 리턴하지 말라 (0) | 2022.04.26 |
---|---|
[이펙티브 코틀린] Item12. 연산자 오버로드를 할 때는 의미에 맞게 사용하라 (0) | 2022.04.19 |
[이펙티브 코틀린] Item10. 단위 테스트를 만들어라 (0) | 2022.04.19 |
[이펙티브 코틀린] Item9. use를 사용하여 리소스를 닫아라 (0) | 2022.04.19 |
[이펙티브 코틀린] Item8. 적절하게 null을 처리하라 (0) | 2022.04.19 |