From 0ff1c697f7fa667eb785e8eff938af5b2e076a55 Mon Sep 17 00:00:00 2001 From: Slowth-KIM <rt.slowth@gmail.com> Date: Mon, 3 Jul 2023 21:30:33 +0900 Subject: [PATCH 1/5] =?UTF-8?q?feat(builder):=20=EB=B9=8C=EB=8D=94=20?= =?UTF-8?q?=ED=8C=A8=ED=84=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - java to kotlin --- .../builder/after/DefaultTourBuilder.kt | 48 +++++++++++++++++++ .../gof/pattern/builder/after/TourDirector.kt | 22 +++++++++ .../pattern/builder/after/TourPlanBuilder.kt | 13 +++++ .../gof/pattern/builder/before/DetailPlan.kt | 8 ++++ .../gof/pattern/builder/before/TourPlan.kt | 19 ++++++++ .../pattern/builder/after/TourDirectorTest.kt | 35 ++++++++++++++ .../pattern/builder/before/TourPlanTest.kt | 47 ++++++++++++++++++ 7 files changed, 192 insertions(+) create mode 100644 zeri/gof/src/main/kotlin/com/gof/pattern/builder/after/DefaultTourBuilder.kt create mode 100644 zeri/gof/src/main/kotlin/com/gof/pattern/builder/after/TourDirector.kt create mode 100644 zeri/gof/src/main/kotlin/com/gof/pattern/builder/after/TourPlanBuilder.kt create mode 100644 zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/DetailPlan.kt create mode 100644 zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt create mode 100644 zeri/gof/src/test/kotlin/com/gof/pattern/builder/after/TourDirectorTest.kt create mode 100644 zeri/gof/src/test/kotlin/com/gof/pattern/builder/before/TourPlanTest.kt diff --git a/zeri/gof/src/main/kotlin/com/gof/pattern/builder/after/DefaultTourBuilder.kt b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/after/DefaultTourBuilder.kt new file mode 100644 index 0000000..4beef43 --- /dev/null +++ b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/after/DefaultTourBuilder.kt @@ -0,0 +1,48 @@ +package com.gof.pattern.builder.after + +import com.gof.pattern.builder.before.DetailPlan +import com.gof.pattern.builder.before.TourPlan +import java.time.LocalDate + +class DefaultTourBuilder : TourPlanBuilder { + private var title: String = "" + private var nights: Int = 0 + private var days: Int = 0 + private var startDate: LocalDate = LocalDate.now() + private var whereToStay: String = "" + private var plans: MutableList<DetailPlan>? = null + + override fun nightsAndDays(nights: Int, days: Int): TourPlanBuilder { + this.nights = nights + this.days = days + return this + } + + override fun title(title: String): TourPlanBuilder { + this.title = title + return this + } + + override fun startDate(localDate: LocalDate): TourPlanBuilder { + this.startDate = localDate + return this + } + + override fun whereToStay(whereToStay: String): TourPlanBuilder { + this.whereToStay = whereToStay + return this + } + + override fun addPlan(day: Int, plan: String): TourPlanBuilder { + if (plans == null) { + plans = mutableListOf() + } + + plans?.add(DetailPlan(day, plan)) + return this + } + + override fun getPlan(): TourPlan { + return TourPlan(title, nights, days, startDate, whereToStay, plans ?: emptyList()) + } +} diff --git a/zeri/gof/src/main/kotlin/com/gof/pattern/builder/after/TourDirector.kt b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/after/TourDirector.kt new file mode 100644 index 0000000..5e796e8 --- /dev/null +++ b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/after/TourDirector.kt @@ -0,0 +1,22 @@ +package com.gof.pattern.builder.after + +import com.gof.pattern.builder.before.TourPlan +import java.time.LocalDate + +class TourDirector(private val tourPlanBuilder: TourPlanBuilder) { + fun cancunTrip(): TourPlan { + return tourPlanBuilder.title("칸쿤 여행") + .nightsAndDays(2, 3) + .startDate(LocalDate.of(2020, 12, 9)) + .whereToStay("리조트") + .addPlan(0, "체크인하고 짐 풀기") + .addPlan(0, "저녁 식사") + .getPlan() + } + + fun longBeachTrip(): TourPlan { + return tourPlanBuilder.title("롱비치") + .startDate(LocalDate.of(2021, 7, 15)) + .getPlan() + } +} diff --git a/zeri/gof/src/main/kotlin/com/gof/pattern/builder/after/TourPlanBuilder.kt b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/after/TourPlanBuilder.kt new file mode 100644 index 0000000..03dd10a --- /dev/null +++ b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/after/TourPlanBuilder.kt @@ -0,0 +1,13 @@ +package com.gof.pattern.builder.after + +import com.gof.pattern.builder.before.TourPlan +import java.time.LocalDate + +interface TourPlanBuilder { + fun nightsAndDays(nights: Int, days: Int): TourPlanBuilder + fun title(title: String): TourPlanBuilder + fun startDate(localDate: LocalDate): TourPlanBuilder + fun whereToStay(whereToStay: String): TourPlanBuilder + fun addPlan(day: Int, plan: String): TourPlanBuilder + fun getPlan(): TourPlan +} diff --git a/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/DetailPlan.kt b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/DetailPlan.kt new file mode 100644 index 0000000..71ce8bf --- /dev/null +++ b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/DetailPlan.kt @@ -0,0 +1,8 @@ +package com.gof.pattern.builder.before + +data class DetailPlan(var day: Int, var plan: String){ + + override fun toString(): String { + return "DetailPlan{ day= $day , plan = $plan }" + } +} diff --git a/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt new file mode 100644 index 0000000..a17e914 --- /dev/null +++ b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt @@ -0,0 +1,19 @@ +package com.gof.pattern.builder.before + +import java.time.LocalDate + +data class TourPlan(var title: String, var nights: Int, var days: Int, + var startDate: LocalDate, var whereToStay: String, + var plans: List<DetailPlan>,) { + + constructor() : this("", 0, 0, LocalDate.now(), "", listOf()) + + override fun toString(): String { + return "TourPlan{ title= $title , nights = $nights, days = $days , startDate = $startDate , " + + "whereToStay = $whereToStay , plans = $plans }" + } + + fun addPlan(day: Int, plan: String) { + plans = plans + DetailPlan(day, plan) + } +} diff --git a/zeri/gof/src/test/kotlin/com/gof/pattern/builder/after/TourDirectorTest.kt b/zeri/gof/src/test/kotlin/com/gof/pattern/builder/after/TourDirectorTest.kt new file mode 100644 index 0000000..7c3041b --- /dev/null +++ b/zeri/gof/src/test/kotlin/com/gof/pattern/builder/after/TourDirectorTest.kt @@ -0,0 +1,35 @@ +package com.gof.pattern.builder.after + +import com.gof.pattern.builder.before.DetailPlan +import com.gof.pattern.builder.before.TourPlan +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test +import java.time.LocalDate + +class TourDirectorTest{ + @Test + @DisplayName("빌더 패턴이 정상적으로 작동한다") + fun builderPatternAfterTest() { + // given + val director = TourDirector(DefaultTourBuilder()) + + + // when + val cancunPlan: TourPlan = director.cancunTrip() + val longBeachTrip: TourPlan = director.longBeachTrip() + + // then + assertEquals("롱비치", longBeachTrip.title) + assertEquals(LocalDate.of(2021, 7, 15), longBeachTrip.startDate) + + assertEquals("칸쿤 여행", cancunPlan.title) + assertEquals(2, cancunPlan.nights) + assertEquals(3, cancunPlan.days) + assertEquals(LocalDate.of(2020, 12, 9), cancunPlan.startDate) + assertEquals("리조트", cancunPlan.whereToStay) + assertEquals(2, cancunPlan.plans.size) + assertEquals(DetailPlan(0, "체크인하고 짐 풀기"), cancunPlan.plans[0]) + assertEquals(DetailPlan(0, "저녁 식사"), cancunPlan.plans[1]) + } +} diff --git a/zeri/gof/src/test/kotlin/com/gof/pattern/builder/before/TourPlanTest.kt b/zeri/gof/src/test/kotlin/com/gof/pattern/builder/before/TourPlanTest.kt new file mode 100644 index 0000000..bb1e8d3 --- /dev/null +++ b/zeri/gof/src/test/kotlin/com/gof/pattern/builder/before/TourPlanTest.kt @@ -0,0 +1,47 @@ +package com.gof.pattern.builder.before + +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test +import java.time.LocalDate + +class TourPlanTest{ + @Test + @DisplayName("빌더패턴 적용 전 테스트가 정상 작동한다.") + fun builderPatternBeforeTest() { + // given + val shortPlan = TourPlan() + val tourPlan = TourPlan() + + // when + shortPlan.title = "오레곤 롱비치 여행" + shortPlan.startDate = LocalDate.of(2021, 7, 15) + + tourPlan.title = "칸쿤 여행" + tourPlan.nights = 2 + tourPlan.days = 3 + tourPlan.startDate = LocalDate.of(2020, 12, 9) + tourPlan.whereToStay = "리조트" + tourPlan.addPlan(0, "체크인 이후 짐풀기") + tourPlan.addPlan(0, "저녁 식사") + tourPlan.addPlan(1, "조식 뷔페에서 식사") + tourPlan.addPlan(1, "해변가 산책") + tourPlan.addPlan(1, "점심은 수영장 근처에서 먹기") + tourPlan.addPlan(1, "리조트 수영장에서 놀기") + tourPlan.addPlan(1, "저녁은 BBQ 식당에서 스테이크") + tourPlan.addPlan(2, "조식 부페에서 식사") + tourPlan.addPlan(2, "체크아웃") + + + // then + assertEquals("오레곤 롱비치 여행", shortPlan.title) + assertEquals(LocalDate.of(2021, 7, 15), shortPlan.startDate) + + assertEquals("칸쿤 여행", tourPlan.title) + assertEquals(2, tourPlan.nights) + assertEquals(3, tourPlan.days) + assertEquals(LocalDate.of(2020, 12, 9), tourPlan.startDate) + assertEquals("리조트", tourPlan.whereToStay) + assertEquals(9, tourPlan.plans.size) + } +} From 72090225611f0c03ab2952bed2440e63eb180823 Mon Sep 17 00:00:00 2001 From: Slowth-KIM <rt.slowth@gmail.com> Date: Mon, 3 Jul 2023 21:38:45 +0900 Subject: [PATCH 2/5] =?UTF-8?q?feat(builder):=20=EB=B9=8C=EB=8D=94=20?= =?UTF-8?q?=ED=8C=A8=ED=84=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ktlint --- .../main/kotlin/com/gof/pattern/builder/before/DetailPlan.kt | 2 +- .../main/kotlin/com/gof/pattern/builder/before/TourPlan.kt | 4 ++-- .../kotlin/com/gof/pattern/builder/after/TourDirectorTest.kt | 3 +-- .../kotlin/com/gof/pattern/builder/before/TourPlanTest.kt | 3 +-- 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/DetailPlan.kt b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/DetailPlan.kt index 71ce8bf..662cfc7 100644 --- a/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/DetailPlan.kt +++ b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/DetailPlan.kt @@ -1,6 +1,6 @@ package com.gof.pattern.builder.before -data class DetailPlan(var day: Int, var plan: String){ +data class DetailPlan(var day: Int, var plan: String) { override fun toString(): String { return "DetailPlan{ day= $day , plan = $plan }" diff --git a/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt index a17e914..c69e57f 100644 --- a/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt +++ b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt @@ -2,9 +2,9 @@ package com.gof.pattern.builder.before import java.time.LocalDate -data class TourPlan(var title: String, var nights: Int, var days: Int, +data class TourPlan (var title: String, var nights: Int, var days: Int, var startDate: LocalDate, var whereToStay: String, - var plans: List<DetailPlan>,) { + var plans: List<DetailPlan>) { constructor() : this("", 0, 0, LocalDate.now(), "", listOf()) diff --git a/zeri/gof/src/test/kotlin/com/gof/pattern/builder/after/TourDirectorTest.kt b/zeri/gof/src/test/kotlin/com/gof/pattern/builder/after/TourDirectorTest.kt index 7c3041b..8404817 100644 --- a/zeri/gof/src/test/kotlin/com/gof/pattern/builder/after/TourDirectorTest.kt +++ b/zeri/gof/src/test/kotlin/com/gof/pattern/builder/after/TourDirectorTest.kt @@ -7,14 +7,13 @@ import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test import java.time.LocalDate -class TourDirectorTest{ +class TourDirectorTest { @Test @DisplayName("빌더 패턴이 정상적으로 작동한다") fun builderPatternAfterTest() { // given val director = TourDirector(DefaultTourBuilder()) - // when val cancunPlan: TourPlan = director.cancunTrip() val longBeachTrip: TourPlan = director.longBeachTrip() diff --git a/zeri/gof/src/test/kotlin/com/gof/pattern/builder/before/TourPlanTest.kt b/zeri/gof/src/test/kotlin/com/gof/pattern/builder/before/TourPlanTest.kt index bb1e8d3..6d82520 100644 --- a/zeri/gof/src/test/kotlin/com/gof/pattern/builder/before/TourPlanTest.kt +++ b/zeri/gof/src/test/kotlin/com/gof/pattern/builder/before/TourPlanTest.kt @@ -5,7 +5,7 @@ import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test import java.time.LocalDate -class TourPlanTest{ +class TourPlanTest { @Test @DisplayName("빌더패턴 적용 전 테스트가 정상 작동한다.") fun builderPatternBeforeTest() { @@ -32,7 +32,6 @@ class TourPlanTest{ tourPlan.addPlan(2, "조식 부페에서 식사") tourPlan.addPlan(2, "체크아웃") - // then assertEquals("오레곤 롱비치 여행", shortPlan.title) assertEquals(LocalDate.of(2021, 7, 15), shortPlan.startDate) From d9cdee59538c4db4085302cb705b1dfe4a7d5fde Mon Sep 17 00:00:00 2001 From: Slowth-KIM <rt.slowth@gmail.com> Date: Mon, 3 Jul 2023 21:44:04 +0900 Subject: [PATCH 3/5] =?UTF-8?q?feat(builder):=20=EB=B9=8C=EB=8D=94=20?= =?UTF-8?q?=ED=8C=A8=ED=84=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ktlint --- .../com/gof/pattern/builder/before/TourPlan.kt | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt index c69e57f..d35379c 100644 --- a/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt +++ b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt @@ -2,10 +2,14 @@ package com.gof.pattern.builder.before import java.time.LocalDate -data class TourPlan (var title: String, var nights: Int, var days: Int, - var startDate: LocalDate, var whereToStay: String, - var plans: List<DetailPlan>) { - +data class TourPlan ( + var title: String, + var nights: Int, + var days: Int, + var startDate: LocalDate, + var whereToStay: String, + var plans: List<DetailPlan> +) { constructor() : this("", 0, 0, LocalDate.now(), "", listOf()) override fun toString(): String { From cffcf6f168d836480cde9cd7c7275bd782638eb9 Mon Sep 17 00:00:00 2001 From: Slowth-KIM <rt.slowth@gmail.com> Date: Mon, 3 Jul 2023 21:46:33 +0900 Subject: [PATCH 4/5] =?UTF-8?q?feat(builder):=20=EB=B9=8C=EB=8D=94=20?= =?UTF-8?q?=ED=8C=A8=ED=84=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ktlint --- .../main/kotlin/com/gof/pattern/builder/before/TourPlan.kt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt index d35379c..555a53a 100644 --- a/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt +++ b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt @@ -2,19 +2,18 @@ package com.gof.pattern.builder.before import java.time.LocalDate -data class TourPlan ( +data class TourPlan( var title: String, var nights: Int, var days: Int, var startDate: LocalDate, var whereToStay: String, - var plans: List<DetailPlan> + var plans: List<DetailPlan>, ) { constructor() : this("", 0, 0, LocalDate.now(), "", listOf()) override fun toString(): String { - return "TourPlan{ title= $title , nights = $nights, days = $days , startDate = $startDate , " + - "whereToStay = $whereToStay , plans = $plans }" + return "TourPlan{ title= $title , nights = $nights, days = $days , startDate = $startDate , " + "whereToStay = $whereToStay , plans = $plans }" } fun addPlan(day: Int, plan: String) { From e617812ffe8c7b93b469a714087cc856927db2eb Mon Sep 17 00:00:00 2001 From: Slowth-KIM <rt.slowth@gmail.com> Date: Mon, 3 Jul 2023 21:46:45 +0900 Subject: [PATCH 5/5] =?UTF-8?q?feat(builder):=20=EB=B9=8C=EB=8D=94=20?= =?UTF-8?q?=ED=8C=A8=ED=84=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ktlint --- .../src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt index 555a53a..60672f2 100644 --- a/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt +++ b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt @@ -13,7 +13,7 @@ data class TourPlan( constructor() : this("", 0, 0, LocalDate.now(), "", listOf()) override fun toString(): String { - return "TourPlan{ title= $title , nights = $nights, days = $days , startDate = $startDate , " + "whereToStay = $whereToStay , plans = $plans }" + return "TourPlan{ title= $title , nights = $nights, days = $days , startDate = $startDate , whereToStay = $whereToStay , plans = $plans }" } fun addPlan(day: Int, plan: String) {