본문 바로가기
프로그래밍 놀이터/Kotlin, Coroutine

[Effective Kotlin] Item 39 : Prefer class hierarchies to tagged classes

by 돼지왕 왕돼지 2022. 5. 19.
반응형

이 글은 Effective Java 를 완독하고, Kotlin 을 상용으로 사용하는 개발자 입장에서
Effective Kotlin 글 중 새로운 내용, remind 할 필요 있는 부분, 핵심 내용 등만 추려 정리한 내용입니다.

 

#
class 가 어떻게 동작해야 하는지를 명시하는 "mode" 라는 constant 를 가진 class 들이 있다.
이 클래스들을 tagged class 라고 부른다.
tagged class 의 가장 큰 문제는 다른 mode 에 대해서 코드가 공존하면서 충돌을 일으킨다는 점이다.

 

#
tagged class 의 문제들은 다음과 같다.

  1. 복수개의 mode 를 다루므로 boilerplate 가 발생한다.
  2. property 사용에 대한 일관성이 떨어진다. mode 에 따라 미사용하는 property 들이 발생한다.
  3. state 의 일관성과 올바름을 보호하기가 어렵다. (값 변화 trigger point 가 다양하므로)
  4. object 가 올바르게 생성되었는지 보장을 얻기 위해 factory method 를 요구한다.

 

#
tagged class 대신 Kotlin 에서는 sealed class 를 사용할 수 있다.

sealed class ValueMatcher<T> {
	abstract fun match(value: T): Boolean

	class Equal<T>(val value: T): ValueMatcher<T>() {
		override fun match(value: T): Boolean = (value == this.value)
	}

	class NotEqual<T>(val value:T): ValueMatcher<T>(){
		override fun match(value: T): Boolean = (value != this.value)
	}
    
	...
}

 

 

Sealed modifier

#
sealed 대신 abstract 를 쓸 수도 있다.
sealed 의 장점은 file 바깥에서 subclass 가 생성되는 것을 방지한다.
그래서 when 문을 사용할 때 else branch 를 사용하지 않아도 된다. (abstract 는 else 필요)

 

 

Tagged classes are not the same as state pattern

#
state pattern 은 내부 상태에 따라 동작이 달라지는 design pattern 을 말한다.

 

 

Summary

 

 

 

반응형

댓글