안드로이드 개발자 노트
[이펙티브 코틀린] Item17. 이름 있는 아규먼트를 사용하라 본문
반응형
이름있는 아규먼트(네임드 파라미터)를 사용하면 코드가 길어지지만, 두 가지 장점이 생깁니다.
- 이름을 기반으로 값이 무엇을 나타내는지 알 수 있습니다.
- 파라미터 입력 순서와 상관 없으므로 안전합니다.
예제를 통해 살펴보겠습니다.
val text = (1..10).joinToString("|")
joinToString에 대해 이미 알고 있다면, "|"이 구분자(separator)를 의미한다는 것을 알 것입니다.
해당 함수에 대해서 잘 모른다면, 한눈에 파라미터가 명확하지 않게 보일 수도 있습니다.
파라미터가 명확하지 않은 경우에는 이를 직접 지정해서 명확하게 만들어 줄 수 있습니다.
val text = (1..10).joinToString(separator = "|")
파라미터에 변수를 사용해서 더욱 의미를 명확하게 할 수 있습니다.
doSomething(300)
val SYSTEM_READY = 300
doSomething(responseCode = SYSTEM_READY)
DSL 문법을 활용할 수도 있습니다.
sleep(100.ms)
함수 타입 파라미터는 조금 특별하게 다루어야 합니다.
코틀린은 함수 타입을 파라미터 마지막에 위치하면 다음과 같이 블록을 바깥으로 뺄 수 있습니다.
fun main() {
method(3, { i -> i + 1 })
method(3) { i -> i + 1 }
}
fun method(a: Int, block: (Int) -> Int) {
/*...*/
}
모든 함수 타입 아규먼트는 이름 있는 아규먼트를 사용하는 것이 좋습니다.
val view = linerLayout {
text("Click below")
button(onClick = {/*...*/ }) {
/*...*/
}
}
여러 함수 타입의 옵션 파라미터가 있는 경우에는 더 헷갈립니다.
fun call(before: () -> Unit = {}, after: () -> Unit = {}) {
before()
print("Middle")
after()
}
// 이름을 붙여서 사용하면, 훨씬 더 가독성이 좋아진다.
call(before = { print("CALL") }) // CALLMiddle
call(after = { print("CALL") }) // MiddleCALL
함수 타입 파라미터는 Rxjava에서 Observable을 구독할 때 자주 볼 수 있는 형태입니다.
- 각각의 아이템을 받을 때 (onNext)
- 오류가 발생했을 때 (onError)
- 전체가 완료되었을 때 (onComplete)
observable.getUsers()
.subscribe((List<User> users) -> { // onNext
// ...
}, (Throwable throwable) -> { // onError
// ...
}, () -> { // onComplete
// ...
})
아래와 같이 이름 있는 아규먼트를 활용해서 의미를 더 명확하게 할 수 있습니다.
observable.getUser()
.subscribeBy(
onNext = { user: List<User> ->
// ...
}
onError = { throwable: Thorwable ->
// ...
}
onCompleted = {
// ...
}
)
정리
- 이름 있는 아규먼트는 개발자가 코드를 읽을 때도 편리하게 활용되며, 코드의 안정성도 향상시킬 수 있다.
- 함수에 같은 타입의 파라미터가 있는 경우, 함수 타입의 파라미터가 있는 경우, 옵션 파라미터가 있는 경우에는 이름 있는 아규먼트를 활용하는 것이 좋다.
- 마지막 파라미터가 DSL처럼 특별한 의미를 갖고 있는 경우는 예외이다.
반응형
'Kotlin > 이펙티브 코틀린' 카테고리의 다른 글
[이펙티브 코틀린] Item18. 코딩 컨벤션을 지켜라 (0) | 2023.10.29 |
---|---|
[이펙티브 코틀린] Item16. 프로퍼티는 동작이 아니라 상태를 나타내야 한다. (0) | 2023.10.02 |
[이펙티브 코틀린] Item15. 리시버를 명시적으로 참조하라 (0) | 2023.10.01 |