Kotlin ‐ 각각의 함수는 하나의 추상화 수준으로 작성하라[Effective Kotlin Item 25] - thought-corner/Backend-PlayGround GitHub Wiki

추상화 설계

  • 추상화는 프로그래밍 세계에서 가장 중요한 개념 중 하나이다.
  • 추상화란, 개념의 일반화, 속성 제거, 구체적인 객체에서 아이디러를 분리하는 과정 또는 결과이다.
  • 추상화란 복잡도를 줄이고 실제 대상을 단순화하는 것이다. 구체적으로 표현하면 추상화는 메서드와 프로퍼티의 집합이라고 할 수 있다.
  • 추상화의 핵심은 숨길 대상과 노출할 대상을 결정하는 것이다.

프로그래밍에서의 추상화⚠️

// ❌ Bad - 'Utils'라는 이름 아래 서로 무관한 것들이 모여 응집도가 0에 가깝다
object Utils {
    fun formatDate(d: Date): String { ... }
    fun sendEmail(to: String) { ... }
    fun calculateTax(amount: Int): Int { ... }
    fun resizeImage(img: Image) { ... }
}
// ⭕ Good - 관련 있는 것끼리 의미 있는 경계로 묶는다 — 각 추상화가 하나의 책임을 가짐
object DateFormatter { fun format(d: Date): String { ... } }
class EmailSender { fun send(to: String) { ... } }
class TaxCalculator { fun calculate(amount: Int): Int { ... } }
class ImageResizer { fun resize(img: Image): Image { ... } }

동일한 수준의 추상화

  • 동일한 수준의 추상화 원칙에 따르면 새로운 함수를 만들 때에도 단순하게 만들어야 한다.
  • 모듈식 시스템을 설계할 때 이 부분이 상당히 중요하다.
// ❌ Bad - 하나에 고수준 절차와 저수준 세부 동작이 전부 들어가 있다.
class CoffeeMachine {
    fun makeCoffee() {
        // 변수 선언
        // 상태 확인
        // 물 온도 센서 읽기
        // 히터 켜서 물 끓이기 (저수준)
        // 끓는 물을 원두에 통과시키기 (저수준)
        // 추출 시간 계산
        // 컵으로 붓기 (저수준)
        // 우유 거품기 작동 (저수준)
        // 우유 붓기 (저수준)
        // ... 수백 줄
    }
}
// ⭕ Good - 단계가 같은 레벨의 함수로 쪼개지면 변형을 조합으로 쉽게 만들 수 있다.
class CoffeeMachine {
    fun makeCoffee() {
        boilWater()    // 물을 끓인다.
        brewCoffee()   // 커피를 내린다.
        pourCoffee()
        pourMilk()
    }

    // 근데 그 물을 어떻게 끓일건데?
    private fun boilWater() {

    }

    // 근데 그 커피를 어떻게 내릴건데?
    private fun brewCoffee() {

    }

    private fun pourCoffee() {

    }

    private fun pourMilk() {

    }
}