Skip to content

[πŸš€ 사이클2 - λ―Έμ…˜ (λΈ”λž™μž­ λ² νŒ…)] 이든 λ―Έμ…˜ μ œμΆœν•©λ‹ˆλ‹€.#1127

Open
JYL35 wants to merge 49 commits intowoowacourse:jyl35from
JYL35:step2
Open

[πŸš€ 사이클2 - λ―Έμ…˜ (λΈ”λž™μž­ λ² νŒ…)] 이든 λ―Έμ…˜ μ œμΆœν•©λ‹ˆλ‹€.#1127
JYL35 wants to merge 49 commits intowoowacourse:jyl35from
JYL35:step2

Conversation

@JYL35
Copy link

@JYL35 JYL35 commented Mar 14, 2026

μ•ˆλ…•ν•˜μ„Έμš”. 제이미!
사이클 1μ—μ„œλ„ 리뷰 λ°›μ•˜λ˜ μ΄λ“ μž…λ‹ˆλ‹€.
μš°μ„  이번 사이클도 제좜이 μ’€ λŠ¦μ–΄μ§„ 점 μ‚¬κ³Όμ˜ 말씀 λ“œλ¦½λ‹ˆλ‹€.

이번 μ‚¬μ΄ν΄μ—μ„œ 생각보닀 λ§Žμ€ μ‹œλ„λ₯Ό ν•˜κ²Œ λ˜μ–΄ 제좜이 λŠ¦μ–΄μ§„ 것 κ°™μŠ΅λ‹ˆλ‹€...

이번 리뷰도 잘 λΆ€νƒλ“œλ¦½λ‹ˆλ‹€!

체크 리슀트

  • λ―Έμ…˜μ˜ ν•„μˆ˜ μš”κ΅¬μ‚¬ν•­μ„ λͺ¨λ‘ κ΅¬ν˜„ν–ˆλ‚˜μš”?
  • Gradle testλ₯Ό μ‹€ν–‰ν–ˆμ„ λ•Œ, λͺ¨λ“  ν…ŒμŠ€νŠΈκ°€ μ •μƒμ μœΌλ‘œ ν†΅κ³Όν–ˆλ‚˜μš”?
  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ •μƒμ μœΌλ‘œ μ‹€ν–‰λ˜λ‚˜μš”?

μ–΄λ–€ 뢀뢄에 μ§‘μ€‘ν•˜μ—¬ 리뷰해야 ν• κΉŒμš”?

1. μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ 3개 μ œν•œκ³Ό 상속 κ΅¬μ‘°μ—μ„œμ˜ 카운트 κΈ°μ€€

이번 λ―Έμ…˜μ—μ„œ '3개 μ΄μƒμ˜ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό κ°€μ§„ 클래슀λ₯Ό μ“°μ§€ μ•ŠλŠ”λ‹€'λŠ” κ·œμΉ™μ„ μ§€ν‚€κΈ° μœ„ν•΄ λ…Έλ ₯ν–ˆμŠ΅λ‹ˆλ‹€. 그런데 상속 ꡬ쑰(예: Member > Player)λ₯Ό μ‚¬μš©ν•˜λ‹€ λ³΄λ‹ˆ, λΆ€λͺ¨ 클래슀의 ν•„λ“œμ™€ μžμ‹ 클래슀의 ν•„λ“œλ₯Ό 합쳀을 λ•Œ 이 기쀀을 μ–΄λ–»κ²Œ μ μš©ν•΄μ•Ό ν• μ§€ 고민이 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

λ¦¬λ·°μ–΄λ‹˜μ€ 상속 κ΄€κ³„μ—μ„œ λΆ€λͺ¨μ™€ μžμ‹μ˜ ν•„λ“œ 합계λ₯Ό ν•˜λ‚˜μ˜ 객체 크기둜 λ³΄μ‹œλŠ”μ§€, μ•„λ‹ˆλ©΄ 각 클래슀 λ‹¨μœ„λ‘œ λ³΄μ‹œλŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€.

λ˜ν•œ, ν•„λ“œ 개수λ₯Ό 쀄이기 μœ„ν•΄ 상속을 μ„ νƒν•˜λŠ” 것이 객체지ν–₯적으둜 μ˜³μ€ λ°©ν–₯인지에 λŒ€ν•œ μ˜κ²¬λ„ λ“£κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

2. λ””λ―Έν„° 법칙(Law of Demeter)κ³Ό μ„œλΉ„μŠ€ κ³„μΈ΅μ˜ μ±…μž„ λ²”μœ„

ν˜„μž¬ ꡬ쑰가 Service > GameTable > Members > Member 순으둜 λ ˆμ΄μ–΄κ°€ κ΅¬μ„±λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. ν•˜μœ„ 도메인이 데이터λ₯Ό λŒ€μ‹  전달해 μ£ΌλŠ” 방식을 νƒν•˜λ‹€ λ³΄λ‹ˆ μƒμœ„ 객체에 get ν˜•μ‹μ˜ μœ„μž„ λ©”μ„œλ“œκ°€ λ„ˆλ¬΄ λ§Žμ•„μ§€λŠ” ν˜„μƒμ΄ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

Serviceμ—μ„œ 직접 Member 객체λ₯Ό 가져와 μ œμ–΄ν•˜λŠ” 것이 계측 κ°„ 결합도λ₯Ό λ†’μ΄λŠ” ν–‰μœ„μΌκΉŒμš”?

μ•„λ‹ˆλ©΄ ν˜„μž¬μ²˜λŸΌ μƒμœ„ 도메인이 ν•˜μœ„ λ„λ©”μΈμ˜ κΈ°λŠ₯을 λŒ€μ‹  호좜(Wrapping)ν•΄ μ£Όλ©° μΊ‘μŠν™”λ₯Ό μœ μ§€ν•˜λŠ” 것이 더 λ‚˜μ€ μ„€κ³„μΌκΉŒμš”? 'Tell, Don't Ask' 원칙을 μ§€ν‚€λ©΄μ„œλ„ 연쇄 Getterλ₯Ό 막을 수 μžˆλŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€. ν˜Ήμ€ μ–΄λ–€ 것이 더 결합도λ₯Ό λ†’μ΄λŠ” ν–‰μœ„μΈμ§€ κΆκΈˆν•©λ‹ˆλ‹€.

3. ν…ŒμŠ€νŠΈ μ½”λ“œμ˜ μœ μ—°μ„±κ³Ό ν™•μž₯μ„± (OCP)

κΈ°λŠ₯이 μΆ”κ°€λ˜λ”λΌλ„ κΈ°μ‘΄ ν…ŒμŠ€νŠΈκ°€ 잘 κΉ¨μ§€μ§€ μ•ŠλŠ” 변경에 μœ μ—°ν•œ ꡬ쑰λ₯Ό λ§Œλ“€κ³ μž λ…Έλ ₯ν–ˆμŠ΅λ‹ˆλ‹€. μƒνƒœ νŒ¨ν„΄μ„ λ„μž…ν•˜λ©΄μ„œ μƒˆλ‘œμš΄ μƒνƒœ(예: μƒˆλ‘œμš΄ κ·œμΉ™μ˜ μΆ”κ°€)κ°€ 생겨도 기쑴의 State ν…ŒμŠ€νŠΈλ‚˜ κ΅¬ν˜„ 둜직이 μˆ˜μ •λ˜μ§€ μ•Šκ³  ν™•μž₯될 수 μžˆλ„λ‘ μ„€κ³„ν•˜κ³ μž ν–ˆμŠ΅λ‹ˆλ‹€. 이 뢀뢄이 μ˜λ„λŒ€λ‘œ 잘 μ½νžˆλŠ”μ§€ μ˜κ²¬μ„ λ“£κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

4. λΆˆλ³€ 객체(Immutable Object)와 μ—”ν‹°ν‹°μ˜ ν•„λ“œ λ³€κ²½

Handλ₯Ό λΆˆλ³€ 객체둜 λ¦¬νŒ©ν† λ§ν•˜λ©΄μ„œ 객체의 μ•ˆμ •μ„±μ€ λ†’μ•„μ‘ŒμœΌλ‚˜, 이λ₯Ό λ³΄μœ ν•œ μƒμœ„ 도메인인 Member의 hand ν•„λ“œμ— final을 μ‚¬μš©ν•  수 μ—†λŠ” λ¬Έμ œκ°€ μƒκ²ΌμŠ΅λ‹ˆλ‹€. λ§Œμ•½ MemberκΉŒμ§€ λΆˆλ³€μœΌλ‘œ λ§Œλ“€λ©΄ 이λ₯Ό κ΄€λ¦¬ν•˜λŠ” Members λ¦¬μŠ€νŠΈκΉŒμ§€ 맀번 μƒˆλ‘œ 생성해야 ν•˜λŠ” λΆˆλ³€μ˜ 연쇄 ν˜„μƒμ΄ λ°œμƒν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

λΆˆλ³€μ™€ κ°€λ³€μ˜ κ²½κ³„μ—μ„œ, λͺ¨λ“  μƒμœ„ 도메인을 λΆˆλ³€μœΌλ‘œ κ°€μ Έκ°€λŠ” 것이 MVC ν˜Ήμ€ 일반적인 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ΅¬μ‘°μ—μ„œ ν˜„μ‹€μ μΈ λŒ€μ•ˆμΌκΉŒμš”?

ν•„λ“œμ— final을 μ“°μ§€ λͺ»ν•˜λ”라도 λ‚΄λΆ€ μƒνƒœλ§Œ λΆˆλ³€μœΌλ‘œ μœ μ§€ν•˜λŠ” μ„ μ—μ„œ νƒ€ν˜‘ν•˜λŠ” 것이 μΌλ°˜μ μΈμ§€ λ¦¬λ·°μ–΄λ‹˜μ˜ 쑰언을 λ“£κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

κΈ΄ κΈ€ μ½μ–΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€!

JYL35 added 30 commits March 11, 2026 14:52
- 초기 HandλŠ” λΆˆλ³€ 리슀트둜 μ΄ˆκΈ°ν™”
- appendCard μ‹œμ— λΆˆλ³€ λ¦¬μŠ€νŠΈμ— μΉ΄λ“œλ₯Ό μΆ”κ°€ν•˜μ—¬ μƒˆλ‘œμš΄ Hand 객체λ₯Ό λ°˜ν™˜
- 멀버 λͺ…단 ν…ŒμŠ€νŠΈ
- μΉ΄λ“œ μΆ”κ°€ ν…ŒμŠ€νŠΈ
- λ”œλŸ¬ κ²Œμž„ κ²°κ³Ό κ²°μ • ν…ŒμŠ€νŠΈ
- ν”Œλ ˆμ΄μ–΄ κ²Œμž„ κ²°κ³Ό κ²°μ • ν…ŒμŠ€νŠΈ
- Draw μ‹œ 좜λ ₯ ν›„ early return이 λˆ„λ½λ˜μ–΄ μˆ˜μ •
- CardNumber, CardPatter ν•„λ“œ final λˆ„λ½μœΌλ‘œμΈν•΄ μˆ˜μ •
- Cotroller: λ©”μ†Œλ“œλͺ… μˆ˜μ • 및 κ²Œμž„ μ΄ˆκΈ°ν™” κΈ°λŠ₯ μ‚¬μš© λΆ„κΈ° μˆ˜μ •
- ν•„λ“œμ™€ λ©”μ†Œλ“œλ₯Ό λ”œλŸ¬μ™€ ν”Œλ ˆμ΄μ–΄λ‘œ 뢄리
- Word: ViewMessage둜 이름 λ³€κ²½ 및 λ”œλŸ¬ 이름 제거
- 52κ°€μ§€ μΉ΄λ“œλ₯Ό μ €μž₯ν•˜λ„λ‘ κ΅¬ν˜„
- νŒ©ν† λ¦¬ λ©”μ†Œλ“œλŠ” μ €μž₯μ†Œμ—μ„œ getν•˜μ—¬ λ°˜ν™˜
- 52κ°€μ§€ μΉ΄λ“œλ₯Ό 맀번 μƒμ„±ν•˜κ³  μ§€μ›Œμ•Όν•  일이 없어짐
- VO: 같은 κΈˆμ•‘μΌ λ•Œ 같은 객체둜 μ·¨κΈ‰ν•˜λ„λ‘ κ΅¬ν˜„ (같은 κ°€μΉ˜ μ·¨κΈ‰)
- μ˜ˆμ™Έ: λ² νŒ… κΈˆμ•‘μ΄ 0원 미만이면 μ˜ˆμ™Έ λ°œμƒ
- 수읡금 계산: 수읡λ₯ μ„ λ°›μ•„ 수읡금 계산
- μƒνƒœ νŒ¨ν„΄ λ„μž…μ„ μœ„ν•΄ State 계측 및 Started, Finished 좔상 클래슀 κ΅¬ν˜„
- μ’…λ£Œ μƒνƒœμΈ Bust와 Blackjack κ΅¬ν˜„
JYL35 and others added 19 commits March 15, 2026 02:45
- ν”Œλ ˆμ΄μ–΄κ°€ 더 이상 μΉ΄λ“œλ₯Ό λ°›μ§€ μ•Šκ³  μ‹Άμ–΄ν•˜λ©΄ μƒνƒœκ°€ Stay둜 λ°”λ€ŒλŠ” κΈ°λŠ₯ κ΅¬ν˜„
μƒνƒœ νŒ¨ν„΄ λ„μž… 및 λ² νŒ… κΈ°λŠ₯ μΆ”κ°€
BlackjackView κ΅¬ν˜„ 및 버그 μˆ˜μ •
Copy link

@jamie9504 jamie9504 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

μ•ˆλ…•ν•˜μ„Έμš”, 이든. 리뷰어 μ œμ΄λ―Έμž…λ‹ˆλ‹€.

μ½”λ©˜νŠΈ λ‚¨κ²¨λ‘μ—ˆμŠ΅λ‹ˆλ‹€.

@@ -1,12 +1,16 @@
package application;
Copy link

@jamie9504 jamie9504 Mar 15, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

μš°μ„  이번 사이클도 제좜이 μ’€ λŠ¦μ–΄μ§„ 점 μ‚¬κ³Όμ˜ 말씀 λ“œλ¦½λ‹ˆλ‹€.

λ―Έμ…˜ μš”κ΅¬μ‚¬ν•­μ— 제좜 κΈ°ν•œμ΄ λͺ…μ‹œλ˜μ–΄μžˆμ§€ μ•Šμ•˜λ‹€λ©΄, μ‚¬κ³Όν•˜μ§€ μ•ŠμœΌμ…”λ„ λ©λ‹ˆλ‹€.
μ €λŠ” μ‹ κ²½μ“°μ§€ μ•ŠλŠ” νŽΈμ΄μ§€λ§Œ, λ‹€λ₯Έ 리뷰어λ₯Ό λ§Œλ‚¬μ„ λ•ŒλŠ” μƒν˜Έκ°„μ˜ 일정을 μœ„ν•΄ 였래 걸릴 것 κ°™μœΌλ©΄ DM을 λ‚¨κ²¨λ‘λŠ” 방법도 μžˆμ„ 것 κ°™μ•„μš”.

λ¦¬λ·°μ–΄λ‹˜

제이미둜 μΆ©λΆ„ν•©λ‹ˆλ‹€.


  1. μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ 3개 μ œν•œκ³Ό 상속 κ΅¬μ‘°μ—μ„œμ˜ 카운트 κΈ°μ€€

    이번 λ―Έμ…˜μ—μ„œ '3개 μ΄μƒμ˜ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό κ°€μ§„ 클래슀λ₯Ό μ“°μ§€ μ•ŠλŠ”λ‹€'λŠ” κ·œμΉ™μ„ μ§€ν‚€κΈ° μœ„ν•΄ λ…Έλ ₯ν–ˆμŠ΅λ‹ˆλ‹€. 그런데 상속 ꡬ쑰(예: Member > Player)λ₯Ό μ‚¬μš©ν•˜λ‹€ λ³΄λ‹ˆ, λΆ€λͺ¨ 클래슀의 ν•„λ“œμ™€ μžμ‹ 클래슀의 ν•„λ“œλ₯Ό 합쳀을 λ•Œ 이 기쀀을 μ–΄λ–»κ²Œ μ μš©ν•΄μ•Ό ν• μ§€ 고민이 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

    λ¦¬λ·°μ–΄λ‹˜μ€ 상속 κ΄€κ³„μ—μ„œ λΆ€λͺ¨μ™€ μžμ‹μ˜ ν•„λ“œ 합계λ₯Ό ν•˜λ‚˜μ˜ 객체 크기둜 λ³΄μ‹œλŠ”μ§€, μ•„λ‹ˆλ©΄ 각 클래슀 λ‹¨μœ„λ‘œ λ³΄μ‹œλŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€.

    λ˜ν•œ, ν•„λ“œ 개수λ₯Ό 쀄이기 μœ„ν•΄ 상속을 μ„ νƒν•˜λŠ” 것이 객체지ν–₯적으둜 μ˜³μ€ λ°©ν–₯인지에 λŒ€ν•œ μ˜κ²¬λ„ λ“£κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

    • μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λž€, 일반적으둜 객체 ν•˜λ‚˜κ°€ λŸ°νƒ€μž„μ— μ‹€μ œλ‘œ λ³΄μœ ν•˜λŠ” ν•„λ“œμ˜ μ΄ν•©μœΌλ‘œ λ΄…λ‹ˆλ‹€. ν΄λž˜μŠ€μ— μ–΄λ–»κ²Œ μ„ μ–Έλ˜μ–΄ μžˆλŠ”μ§€λŠ” 크게 μ€‘μš”ν•˜μ§€ μ•Šμ•„μš”. 상속을 ν–ˆλ”λΌλ„, λŸ°νƒ€μž„μ— ν•΄λ‹Ή 객체가 μ‹€μ œλ‘œ κ°€μ§€κ³  μžˆλŠ” λ³€μˆ˜λŠ” 3κ°œκ°€ 되겠죠?
    • ν•„λ“œ 수λ₯Ό 쀄이기 μœ„ν•΄ 상속을 μ„ νƒν•˜λŠ” 것은 μ’‹μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 상속은 "is-a"κ°€ λͺ…ν™•ν•  λ•Œ μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. λ¬Όλ‘  μ§€κΈˆμ€ Playerκ°€ Member인 κ΄€κ³„λŠ” μžμ—°μŠ€λŸ½μ§€λ§Œ, ν•„λ“œμˆ˜ μ œν•œμ„ ν”Όν•˜λ €λŠ” λͺ©μ μœΌλ‘œ 상속을 μ‚¬μš©ν•œλ‹€λ©΄ 섀계 μžμ²΄κ°€ μ™œκ³‘λ  수 μžˆμ–΄μš”.
  2. λ””λ―Έν„° 법칙(Law of Demeter)κ³Ό μ„œλΉ„μŠ€ κ³„μΈ΅μ˜ μ±…μž„ λ²”μœ„

    ν˜„μž¬ ꡬ쑰가 Service > GameTable > Members > Member 순으둜 λ ˆμ΄μ–΄κ°€ κ΅¬μ„±λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. ν•˜μœ„ 도메인이 데이터λ₯Ό λŒ€μ‹  전달해 μ£ΌλŠ” 방식을 νƒν•˜λ‹€ λ³΄λ‹ˆ μƒμœ„ 객체에 get ν˜•μ‹μ˜ μœ„μž„ λ©”μ„œλ“œκ°€ λ„ˆλ¬΄ λ§Žμ•„μ§€λŠ” ν˜„μƒμ΄ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

    Serviceμ—μ„œ 직접 Member 객체λ₯Ό 가져와 μ œμ–΄ν•˜λŠ” 것이 계측 κ°„ 결합도λ₯Ό λ†’μ΄λŠ” ν–‰μœ„μΌκΉŒμš”?

    μ•„λ‹ˆλ©΄ ν˜„μž¬μ²˜λŸΌ μƒμœ„ 도메인이 ν•˜μœ„ λ„λ©”μΈμ˜ κΈ°λŠ₯을 λŒ€μ‹  호좜(Wrapping)ν•΄ μ£Όλ©° μΊ‘μŠν™”λ₯Ό μœ μ§€ν•˜λŠ” 것이 더 λ‚˜μ€ μ„€κ³„μΌκΉŒμš”? 'Tell, Don't Ask' 원칙을 μ§€ν‚€λ©΄μ„œλ„ 연쇄 Getterλ₯Ό 막을 수 μžˆλŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€. ν˜Ήμ€ μ–΄λ–€ 것이 더 결합도λ₯Ό λ†’μ΄λŠ” ν–‰μœ„μΈμ§€ κΆκΈˆν•©λ‹ˆλ‹€.

    • ν˜„μž¬ ꡬ쑰인 μƒμœ„ 도메인이 ν•˜μœ„ λ„λ©”μΈμ˜ κΈ°λŠ₯을 Wrappingν•˜λŠ” 방식이 더 λ‚«μŠ΅λ‹ˆλ‹€. 단, μœ„μž„ λ©”μ„œλ“œκ°€ κ³Όλ„ν•˜κ²Œ λŠ˜μ–΄λ‚œλ‹€λ©΄ 쀑간 계측 μžμ²΄κ°€ λΆˆν•„μš”ν•˜λ‹€λŠ” μ‹ ν˜ΈμΌ 수 μžˆμ–΄μš”.
    • Service β†’ GameTable β†’ Members 3단계보닀 Service β†’ Members 2λ‹¨κ³„λ‘œ μ€„μ΄λŠ” 것도 κ³ λ €ν•΄λ³΄μ„Έμš”. GameTable이 μ‹€μ§ˆμ μœΌλ‘œ Membersλ₯Ό μ–‡κ²Œ κ°μ‹ΈλŠ” μ—­ν• λ§Œ ν•œλ‹€λ©΄ 제거 λŒ€μƒμ΄ 될 수 μžˆμ–΄μš”.
  3. ν…ŒμŠ€νŠΈ μ½”λ“œμ˜ μœ μ—°μ„±κ³Ό ν™•μž₯μ„± (OCP)

    κΈ°λŠ₯이 μΆ”κ°€λ˜λ”λΌλ„ κΈ°μ‘΄ ν…ŒμŠ€νŠΈκ°€ 잘 κΉ¨μ§€μ§€ μ•ŠλŠ” 변경에 μœ μ—°ν•œ ꡬ쑰λ₯Ό λ§Œλ“€κ³ μž λ…Έλ ₯ν–ˆμŠ΅λ‹ˆλ‹€. μƒνƒœ νŒ¨ν„΄μ„ λ„μž…ν•˜λ©΄μ„œ μƒˆλ‘œμš΄ μƒνƒœ(예: μƒˆλ‘œμš΄ κ·œμΉ™μ˜ μΆ”κ°€)κ°€ 생겨도 기쑴의 State ν…ŒμŠ€νŠΈλ‚˜ κ΅¬ν˜„ 둜직이 μˆ˜μ •λ˜μ§€ μ•Šκ³  ν™•μž₯될 수 μžˆλ„λ‘ μ„€κ³„ν•˜κ³ μž ν–ˆμŠ΅λ‹ˆλ‹€. 이 뢀뢄이 μ˜λ„λŒ€λ‘œ 잘 μ½νžˆλŠ”μ§€ μ˜κ²¬μ„ λ“£κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

    • μƒνƒœ νŒ¨ν„΄ λ„μž…μœΌλ‘œ μƒˆλ‘œμš΄ μƒνƒœ μΆ”κ°€ μ‹œ κΈ°μ‘΄ ν…ŒμŠ€νŠΈκ°€ κΉ¨μ§€μ§€ μ•ŠλŠ” κ΅¬μ‘°λŠ” 잘 μž‘ν˜€ μžˆμ–΄μš”. λ‹€λ§Œ instanceof μ‚¬μš©μ΄ λ‚¨μ•„μžˆλŠ” ν•œ μ™„μ „ν•œ OCP라고 보기 μ–΄λ ΅μŠ΅λ‹ˆλ‹€. instanceof 제거 후에야 μ§„μ •ν•œ ν™•μž₯에 μ—΄λ¦° ꡬ쑰가 λ©λ‹ˆλ‹€.
  4. λΆˆλ³€ 객체(Immutable Object)와 μ—”ν‹°ν‹°μ˜ ν•„λ“œ λ³€κ²½

    Handλ₯Ό λΆˆλ³€ 객체둜 λ¦¬νŒ©ν† λ§ν•˜λ©΄μ„œ 객체의 μ•ˆμ •μ„±μ€ λ†’μ•„μ‘ŒμœΌλ‚˜, 이λ₯Ό λ³΄μœ ν•œ μƒμœ„ 도메인인 Member의 hand ν•„λ“œμ— final을 μ‚¬μš©ν•  수 μ—†λŠ” λ¬Έμ œκ°€ μƒκ²ΌμŠ΅λ‹ˆλ‹€. λ§Œμ•½ MemberκΉŒμ§€ λΆˆλ³€μœΌλ‘œ λ§Œλ“€λ©΄ 이λ₯Ό κ΄€λ¦¬ν•˜λŠ” Members λ¦¬μŠ€νŠΈκΉŒμ§€ 맀번 μƒˆλ‘œ 생성해야 ν•˜λŠ” λΆˆλ³€μ˜ 연쇄 ν˜„μƒμ΄ λ°œμƒν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

    λΆˆλ³€μ™€ κ°€λ³€μ˜ κ²½κ³„μ—μ„œ, λͺ¨λ“  μƒμœ„ 도메인을 λΆˆλ³€μœΌλ‘œ κ°€μ Έκ°€λŠ” 것이 MVC ν˜Ήμ€ 일반적인 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ΅¬μ‘°μ—μ„œ ν˜„μ‹€μ μΈ λŒ€μ•ˆμΌκΉŒμš”?

    ν•„λ“œμ— final을 μ“°μ§€ λͺ»ν•˜λ”라도 λ‚΄λΆ€ μƒνƒœλ§Œ λΆˆλ³€μœΌλ‘œ μœ μ§€ν•˜λŠ” μ„ μ—μ„œ νƒ€ν˜‘ν•˜λŠ” 것이 μΌλ°˜μ μΈμ§€ λ¦¬λ·°μ–΄λ‹˜μ˜ 쑰언을 λ“£κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

    • λͺ¨λ“  계측을 λΆˆλ³€μœΌλ‘œ λ§Œλ“ λ‹€λ©΄, λͺ¨λ“  계측을 λΆˆλ³€μœΌλ‘œ λ§Œλ“ λ‹€λ©΄ 객체 μž¬μƒμ„± λΉ„μš©κ³Ό μ½”λ“œ λ³΅μž‘λ„κ°€ 컀지겠죠?
      뭐든지 μ–΄λ–€ 것을 μ„ νƒν•˜λ˜ νŠΈλ ˆμ΄λ“œμ˜€ν”„μž…λ‹ˆλ‹€. μž₯/단점을 λΉ„κ΅ν–ˆμ„ λ•Œ μž₯점이 더 큰 κ²½μš°μ—λ§Œ μ‚¬μš©ν•˜λ©΄ λ©λ‹ˆλ‹€.
    • Member의 state ν•„λ“œμ— final을 λͺ» μ“°λŠ” 것은 ν˜„μž¬ 섀계상 μžμ—°μŠ€λŸ¬μš΄ νŠΈλ ˆμ΄λ“œμ˜€ν”„μž…λ‹ˆλ‹€. 이 경우 setterλ₯Ό λ…ΈμΆœν•˜μ§€ μ•Šκ³  receiveCard()처럼 μ˜λ―ΈμžˆλŠ” λ©”μ„œλ“œλ‘œλ§Œ μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ” 것이 쒋은 νƒ€ν˜‘μ μ΄μ—μš”.


@Override
public double earningRate(State dealerState) {
if (dealerState instanceof Bust) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

μƒνƒœ νŒ¨ν„΄μ˜ μž₯점 쀑 ν•˜λ‚˜κ°€ λ°”λ‘œ 이런 instanceof λΆ„κΈ°λ₯Ό μ—†μ• λŠ” 것인데,
ν˜„μž¬ earningRate λ‚΄λΆ€μ—μ„œ λ‹€μ‹œ instanceof둜 νŒλ³„ν•˜κ³  μžˆμ–΄μ„œ νŒ¨ν„΄μ˜ νš¨κ³Όκ°€ 반감되고 μžˆμ–΄μš”.

이 λΆ„κΈ°λ₯Ό μ œκ±°ν•  수 μžˆλŠ” 방법이 μžˆμ„μ§€ κ³ λ―Όν•΄λ³΄μ„Έμš”.
(μ½”λ“œ μ „λ°˜μ μœΌλ‘œ κ²€ν† ν•΄λ³΄μ„Έμš”.)

Comment on lines +41 to +44
@Override
public State stay() {
throw new IllegalArgumentException("λ”œλŸ¬λŠ” 슀슀둜 멈좜 수 μ—†μŠ΅λ‹ˆλ‹€.");
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

State μΈν„°νŽ˜μ΄μŠ€μ— stay()κ°€ μžˆλŠ”λ°, λ”œλŸ¬λŠ” 이λ₯Ό ν˜ΈμΆœν•  수 μ—†μ–΄ μ˜ˆμ™Έλ₯Ό λ˜μ§€κ³  μžˆλ„€μš”.

λ”œλŸ¬μ™€ ν”Œλ ˆμ΄μ–΄μ˜ μƒνƒœλ₯Ό 같은 μΈν„°νŽ˜μ΄μŠ€λ‘œ λ¬ΆλŠ” 것이 μ μ ˆν•œμ§€,
μ—­ν• λ³„λ‘œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό λΆ„λ¦¬ν•˜λŠ” λ°©ν–₯을 κ³ λ―Όν•΄λ³΄μ„Έμš”!

import domain.card.Card;
import domain.card.Deck;
import domain.member.Money;
import dto.MemberStatus;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

domain이 dtoλ₯Ό μ•Œκ³  있고, dto도 domain을 μ•Œκ³  μžˆλ„€μš”.
이런 κ΅¬μ‘°μ—μ„œ μ–΄λ–€ λ¬Έμ œκ°€ 생길 수 μžˆμ„μ§€ κ³ λ―Όν•΄λ³΄μ„Έμš”.

.map(name -> new MemberStatus(name, members.findCardByName(name), members.checkPlayerScore(name)))
.forEach(memberStatuses::add);
return List.copyOf(memberStatuses);
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

getMemberStatuses()의 둜직이 사싀상 members μ•ˆμ—μ„œ λͺ¨λ‘ 처리될 수 μžˆμ–΄ λ³΄μ—¬μš”.
GameTable이 이 역할을 직접 λ‹΄λ‹Ήν•˜λŠ” 것이 μ μ ˆν•œμ§€ κ³ λ―Όν•΄λ³΄μ„Έμš”.

@@ -0,0 +1,35 @@
package domain.card;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 μΉœκ΅¬λŠ” μ™œ 이 νŒ¨ν‚€μ§€μ— μœ„μΉ˜ν•΄ μžˆμ„κΉŒμš”?


import static org.assertj.core.api.Assertions.assertThat;

public class MembersTest {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

λ¬΄μŠΉλΆ€ μΌ€μ΄μŠ€λ‚˜, λ”œλŸ¬ μ μˆ˜κ°€ λ†’μ•„μ„œ νŒ¨λ°°ν•˜λŠ” μΌ€μ΄μŠ€ 등이 ν…ŒμŠ€νŠΈλ˜κ³  μžˆλ‚˜μš”?
TDD둜 κ΅¬ν˜„ν–ˆλ‹€λ©΄ 이런 μΌ€μ΄μŠ€κ°€ λˆ„λ½λ˜μ§€ μ•Šμ•˜μ„ 것 같은데, μ–΄λ–»κ²Œ μƒκ°ν•˜μ‹œλ‚˜μš”?

Comment on lines +45 to +47
@DisplayName("ν”Œλ ˆμ΄μ–΄κ°€ μΉ΄λ“œλ₯Ό 뽑아 21점이 λ˜μ—ˆμ„ λ•Œ μΉ΄λ“œ κ°œμˆ˜κ°€ 2κ°œκ°€ μ•„λ‹ˆλ©΄ Stay μƒνƒœλ₯Ό λ°˜ν™˜ν•œλ‹€")
@Test
void draw_TotalScoreIs21AndCardSizeIsNot2_ReturnBlackjack() {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DisplayNameκ³Ό λ©”μ„œλ“œλͺ…μ˜ μ˜λ―Έκ°€ λ‹€λ₯΄λ„€μš”.

Comment on lines +25 to +26
if (myScore > dealerScore) return MatchResult.WIN.profitRate();
if (myScore < dealerScore) return MatchResult.LOSE.profitRate();

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

기본적으둜 Java Style Guide을 μ›μΉ™μœΌλ‘œ ν•œλ‹€.

원칙을 ν•œ 번 읽어보고 μ μš©ν•΄λ³΄μ„Έμš”.

@DisplayName("κΈˆμ•‘μ΄ κ°™μœΌλ©΄ 같은 객체둜 μ·¨κΈ‰ν•œλ‹€ (VO)")
@Test
void equals_SameAmount_ReturnTrue() {
assertThat(new Money(10000)).isEqualTo(new Money(10000));

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

천 λ‹¨μœ„μ— _λ₯Ό μ‚¬μš©ν•˜λ©΄ 가독성이 μ’‹μ•„μ Έμš”. (예: 10_000)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants