Skip to content

Commit 598fef0

Browse files
committed
feat: 예제 코드 추가
1 parent b5ebb8c commit 598fef0

1 file changed

Lines changed: 77 additions & 0 deletions

File tree

chapter05/해성/Chapter05.md

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,4 +134,81 @@ https://johngrib.github.io/wiki/law-of-demeter/
134134
- 연관관계의 주인은 외래키의 위치와 관련해서 정해야지 비즈니스 중요도로 접근하면 안된다.
135135
- 양방향 매핑시에는 무한루프에 빠지지 않게 조심해야한다.
136136

137+
## 예제 개선해보기
138+
```kotlin
139+
class Team (
140+
private val members: MutableList<Member>
141+
) {
142+
internal fun add(member: Member) {
143+
if (!members.contains(member)) {
144+
members.add(member)
145+
}
146+
}
147+
internal fun remove(member: Member) {
148+
members.remove(member)
149+
}
150+
}
151+
152+
class Member(
153+
var team: Team?
154+
) {
155+
internal fun hasTeam(): Boolean {
156+
return team != null
157+
}
158+
internal fun isIn(team: Team): Boolean {
159+
return this.team?.let { it == team } ?: false
160+
}
161+
internal fun isInOtherTeam(team: Team): Boolean {
162+
return hasTeam() && !isIn(team)
163+
}
164+
internal fun join(team: Team) {
165+
this.team = team
166+
}
167+
internal fun withdraw() {
168+
this.team = null
169+
}
170+
}
137171

172+
class JoinService {
173+
fun join(
174+
member: Member,
175+
team: Team
176+
) {
177+
if (member.hasTeam()) {
178+
throw IllegalStateException()
179+
}
180+
if (member.isIn(team)) {
181+
throw IllegalStateException()
182+
}
183+
member.join(team)
184+
team.add(member)
185+
}
186+
}
187+
188+
class ChangeService(
189+
private val joinService: JoinService,
190+
private val withdrawalService: WithdrawalService
191+
) {
192+
fun change(
193+
member: Member,
194+
team: Team
195+
) {
196+
if (member.isInOtherTeam(team)) {
197+
withdrawalService.withdraw(member)
198+
}
199+
joinService.join(member, team)
200+
}
201+
}
202+
203+
class WithdrawalService {
204+
fun withdraw(
205+
member: Member
206+
) {
207+
if (!member.hasTeam()) {
208+
throw IllegalStateException()
209+
}
210+
member.withdraw()
211+
member.team?.remove(member)
212+
}
213+
}
214+
```

0 commit comments

Comments
 (0)