공부/이펙티브코틀린

아이템 30 - 요소의 가시성을 최소화하라

띵커베르 2024. 7. 2. 21:32
728x90
  • 작은 인터페이스는 배우기 쉽고 유지하기 쉽다
  • 보이는 요소 자체가 적다면, 유지보수하고 테스트할 것이 적다
  • 변경을 가할 때는 기존의 것을 숨기는 것보다 새로운 것을 노출하는 것이 쉽다.
해당 코드는 delegate 를 사용하여 MutableSet 인터페이스를 구현한 클래스
MutableSet 인터페이스의 구현을 내부 MutableSet 인 innerSet 에 위임함
elementsAdded 의 setter 를 private 로 설정하여 외부에서 수정할 수 없도록 함

    private var _elementsAdded: Int = 0

    val elementsAdded: Int
        get() = _elementsAdded
        
식으로도 가능하겠지만 아래의 코드가 더 깔끔해보인다.

class CounterSet<T>(
    private val innerSet: MutableSet<T> = mutableSetOf()
) : MutableSet<T> by innerSet {
    var elementsAdded: Int = 0
        private set

    override fun add(element: T): Boolean {
        elementsAdded++
        return innerSet.add(element)
    }

    override fun addAll(elements: Collection<T>): Boolean {
        elementsAdded += elements.size
        return innerSet.addAll(elements)
    }
}

 

- 가시성과 관련된 제한은 한번 정해지면 변경하기 어렵다.
- 프로퍼티를 외부에서 변경할 수 있다면 클래스는 자신의 상태를 보장할 수 없다.
- 구체 접근자의 가시성을 제한해 모든 프로퍼티를 캡슐화 하는것이 좋다.
- 제한될수록 클래스의 변경을 쉽게 추적할 수 있으며, 더 쉽게 이해할 수 있고, 배울 수 있다.

 

728x90