[Effective Kotlin] 아이템11. 가독성을 목표로 설계하라

Jimin Lim·2023년 7월 20일
0

Effective Kotlin

목록 보기
11/39
post-thumbnail

아이템 11

가독성을 목표로 설계하라

코드는 쓰기보다 읽기가 중요하다. (진짜 요즘 느낀다..) 따라서 항상 가독성을 생각하자

✅ 인지 부하 감소

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
  • 연산자는 의미에 맞게 사용해야 하며, invoke은 잘못사용되고 있다.
    • invoke: 이름 없이 호출되는 함수
  • 현재 코드에서 and라는 함수 이름이 실제 함수 내부에서 이루어지는 처리와 맞지 않다
  • 문자열을 결합하는 기능은 이미 언어에 내장되어 있다. 이미 있는 것을 다시 만들 필요없다.
profile
💻 ☕️ 🏝 🍑 🍹 🏊‍♀️

1개의 댓글

comment-user-thumbnail
2023년 7월 20일

항상 좋은 글 감사합니다.

답글 달기