보뇨 다이어리

코틀린 디자인 패턴 - 동작 패턴 이해하기 (해석기) 본문

컴퓨터 관련/Kotlin 정보

코틀린 디자인 패턴 - 동작 패턴 이해하기 (해석기)

보뇨 2024. 12. 16. 18:11
반응형

책에서는 해석기라고 되어있어서 뭐지 싶었는데 interpreter 패턴을 말하는것이였다.

근데 kotlin dsl 관련내용이라 사뭇 다르지만 해당 챕터를 통해서

그동안 예를들어 SelelectClause.() -> Unit 이런 형태의 비밀?! 에 대해 알게되었다.

즉, SelelectClause 라는 객체가 인자로 들어오는 (SelelectClause) -> Unit 이런형태와 동일하다고한다.

apply 를 왜 쓰면 좋은지 간접적으로도 나와있어서 한번 코드를 직접 작성하고 디버깅해보는것도 좋은거같다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
class Chapter04Interpreter {
 
    @Test
    fun query() {
        val query = select("name, age") {
            from("users") {
                where("age > 25")
            }
        }
 
        println(query) // SELECT name, age FROM users WHERE age > 25
    }
 
    fun select(columns: String, from: SelectClause.() -> Unit): SelectClause {
        return SelectClause(columns).apply(from)
    }
 
    class SelectClause(private val columns: String) {
        private lateinit var from: FromClause
 
        // 방법 1
//        fun from(table: String, where: FromClause.() -> Unit) = apply {
//            from = FromClause(table)
//            from.apply(where)
//        }
 
        // 방법 2
        fun from(table: String, where: FromClause.() -> Unit): FromClause {
            this.from = FromClause(table)
            return this.from.apply(where)
        }
 
        override fun toString() = "SELECT $columns $from"
    }
 
    class FromClause(private val table: String) {
        private lateinit var where: WhereClause
 
        fun where(condition: String) = this.apply {
            where = WhereClause(condition)
        }
 
        override fun toString() = "FROM $table $where"
    }
 
    class WhereClause(private val condition: String) {
        override fun toString() = "WHERE $condition"
    }
}
cs
반응형