DSL 만들기
288
1 asked
안녕하세요 강사님. 내용을 몇번 더 봐야 더 잘 알겠지만
막히는 부분이 있어서 질문올립니다.
18강 내용중에서
service(name = "db") {
image { "mysql" }
env("USER").`is`("myuser")
env("PASSWORD").`is`("mypassword")
port(host = 9999, container = 3306)
}
env("USER").`is`("myuser") 이 DSL은 어떻게 만들수 있을지 감이 오지 않습니다. ㅜㅜ
Answer 1
3
안녕하세요 혜민님! 🙂 좋은 질문 감사드려요!!!
하나씩 설명 드려볼게요! 👍
먼저 env().`is`() 를 뜯어보면, env() 라는 함수를 호출한 이후, 곧 바로 is() 라는 함수를 연이어 호출한 모양입니다! 간단하죠?! 그럼 다음과 같이 코드를 작성할 수 있을거에요!
data class Environment(
val key: String,
val value: String?
) {
fun `is`(value: String): Environment {
this.value = value
return this
}
}
fun env(key: String): Environment() {
return Environment(key, null)
}여기서 is 라는 함수를 쓸 때 백틱 ` 을 붙이는 이유는, 코틀린에서 is 라는 별도의 예약어가 있기 때문입니다! 👍
위의 코드를 사용해보면요!
env("USER")까지 했을 때 Environment 클래스가 USER 라는 문자열이 key에 들어가 생성되고
env("USER").`is`("PASSWORD")is 라는 함수를 호출까지 하면, value에 "PASSWORD"라는 문자열이 들어간 후 최종적으로 Environment 클래스가 완성되게 됩니다!
물론 is 함수를 클래스 안에 넣으셔도 되고, 코틀린의 확장 함수를 사용하셔도 될 것 같아요~ 👍
이 DSL 이란 부분 자체가 코틀린의 문법을 요렇게 저렇게 막 돌려 활용하다 보니, 완성된 DSL만 봤을 때는 어렵게 느껴질 수 있어요! 🥺 이럴 때는 정말 단계별로 하나씩! 문법적인 내용과 코드를 함께 보시면 이해가 훨씬 쉬위실 겁니다~~~
답변이 도움이 되었으면 좋겠습니다. 감사합니다!! 🙏
싱글턴패턴
0
3
1
KType 관련 Kotlin 2.3 변경점
1
61
2
Kotlin 2.0(K2 컴파일러)에서 달라진 Java SAM 변환 동작
2
98
3
SuperTypeSafeCage에 대해 질문드립니다
0
62
2
좋은 코드 예시
0
94
2
val 키워드도 setValue가 있나요?
0
86
2
반공변성 질문드립니다.
1
114
3
[23강] SuperTypeToken의 equals 관련 질문
1
96
2
23강 타입 안전 이종 컨테이너 예제 관련 문의 드립니다.
0
111
2
abstract class Fish(name:String):Animal(name)
0
105
2
지식공유자님 inline에 대해서의 질문과 추가적인 질문 1가지가 있습니다!
1
118
1
안녕하세요 JMH 설정 관련 팁을 드릴까 합니다! (24년 12월 16일 기준)
0
164
2
Generic Func 질문이 있습니다
1
104
1
2강부터 영상 재생이 안되네요ㅠㅠ
0
152
2
by lazy 블럭 안에서 suspend 함수의 결과값을 받는게 가능한가요?
0
389
1
Sequence vs Stream
1
251
1
코틀린 indent 코드 스타일 질문입니다.
0
263
1
non-local return 질문입니다.
1
227
1
SynchronizedLazyImpl 함수관련 질문
0
424
2
제네릭 클래스를 정의하는 경우, 반드시 변성을 고려하는 것이 바람직한가요?
4
1327
1
실무에서 lateinit 이 필요한 경우는 어떤 상황일까요?
1
455
1
4강 타입소거 관련 질문
1
331
2
추상클래스의 공변 / 반공변, 추상 제네릭 일급컬랙션 리팩토링 에 대한 질문입니다.
2
598
1
lateinit 키워드 관련해서 질문드립니다!
1
314
1

