@@ -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.team?.remove(member)
211+ member.withdraw()
212+ }
213+ }
214+ ```
0 commit comments