Skip to content

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

Open
yItWorks wants to merge 15 commits intowoowacourse:yitworksfrom
yItWorks:step2
Open

[πŸš€ 사이클2 - λ―Έμ…˜ (λΈ”λž™μž­ λ² νŒ…)] 둜운 λ―Έμ…˜ μ œμΆœν•©λ‹ˆλ‹€.#1115
yItWorks wants to merge 15 commits intowoowacourse:yitworksfrom
yItWorks:step2

Conversation

@yItWorks
Copy link

μ•ˆλ…•ν•˜μ„Έμš”, μ œλ‚˜! λ‘œμš΄μž…λ‹ˆλ‹€.
이번 리뷰도 잘 λΆ€νƒλ“œλ¦½λ‹ˆλ‹€!

체크 리슀트

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

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

1. μΊ‘μŠν™”

handλ₯Ό private둜 λ°”κΎΈλŠ” 것이 μΊ‘μŠν™”μ— 더 νš¨κ³Όμ μ΄λΌλŠ” 리뷰λ₯Ό λ°›κ³ , hand의 μ ‘κ·Όμ œν•œμžλ₯Ό protectedμ—μ„œ private둜 λ°”κΎΈλ©° Dealer ν΄λž˜μŠ€μ—μ„œ handλ₯Ό 직접 μ‚¬μš©ν•˜λŠ” λ°©μ‹μ˜ μ½”λ“œλ₯Ό λ°”κΎΈλ©΄μ„œ λ¬Έμ œκ°€ λ°œμƒν•˜μ˜€λ˜ 뢀뢄은 두 λΆ€λΆ„μ΄μ—ˆμŠ΅λ‹ˆλ‹€.

  • λ”œλŸ¬λŠ” ν•˜λ‚˜μ˜ μΉ΄λ“œλ§Œ μ˜€ν”ˆν•˜λŠ” 상황
  • λ”œλŸ¬κ°€ hand.calculateScore()λ₯Ό 톡해 hit μ—¬λΆ€λ₯Ό μ •ν•˜λŠ” 둜직

ν›„μžμ˜ 경우 μ‘°μ–Έμ£Όμ‹ λŒ€λ‘œ getScore()λ₯Ό 톡해 ν•΄κ²°ν•˜μ˜€μ§€λ§Œ μ „μžμ˜ 경우 indexλ₯Ό λ”œλŸ¬λ§Œ μ•Œκ³ μžˆλŠ” 것이 λ°”λžŒμ§ν•˜λ‹€κ³  μƒκ°ν•΄μ„œ 고민을 ν–ˆμ—ˆμŠ΅λ‹ˆλ‹€. getCardNames()λ₯Ό μ˜€λ²„λ‘œλ”©ν•΄μ„œ ν•΄κ²°ν•˜μ˜€λŠ”λ° μ˜¬λ°”λ₯Έ ν•΄κ²° 방법인지 κΆκΈˆν•©λ‹ˆλ‹€.

2. μ›μ‹œκ°’μ— λŒ€ν•˜μ—¬

2-1.
이름을 μ›μ‹œκ°’μΈ String으둜 두지 μ•Šκ³  Nickname 클래슀λ₯Ό λ§Œλ“€μ–΄ μ²˜λ¦¬ν•˜λŠ” κ³Όμ •μ—μ„œ λ¬Έμ œκ°€ λ°œμƒν•˜μ˜€μŠ΅λ‹ˆλ‹€. μ œκ°€ μ •ν•œ κ·œμΉ™μ€ 이름 μž…λ ₯ μ‹œ, 4~10자만 μž…λ ₯λ˜λ„λ‘ ν•˜λŠ” κ²ƒμ΄μ—ˆλŠ”λ°, λ”œλŸ¬λŠ” 이름이 2κΈ€μžλΌλŠ” μ μ΄μ—ˆμŠ΅λ‹ˆλ‹€.

이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ Nickname ν΄λž˜μŠ€μ—μ„œ β€œλ”œλŸ¬β€ 만 μ˜ˆμ™Έλ‘œ 두기보닀 Name μΈν„°νŽ˜μ΄μŠ€λ₯Ό 두고 Nicknameκ³Ό DealerName으둜 λΆ„λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€.

λ‹¨μˆœνžˆ μ›μ‹œκ°’ ν•˜λ‚˜λ₯Ό μœ„ν•΄ μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ„μž…ν•˜λŠ” 것이 μ˜€λ²„ μ—”μ§€λ‹ˆμ–΄λ§μ΄ μ•„λ‹Œμ§€, μ‹€λ¬΄μ—μ„œλ„ λΉ„μŠ·ν•˜κ²Œ ν™œμš©ν•˜λŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€.

2-2.
μˆ˜μ΅κΈˆμ— λŒ€ν•΄μ„  클래슀λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³  μ›μ‹œκ°’μΈ Double둜 μ²˜λ¦¬ν•˜λ„λ‘ ν•˜μ˜€μŠ΅λ‹ˆλ‹€. μˆ˜μ΅κΈˆμ€ κ²Œμž„ 결과에 따라 λ°°νŒ… κΈˆμ•‘μ„ ν•©μ‚°ν•˜λŠ” μ—­ν• λ§Œ ν•œλ‹€κ³  μƒκ°ν•˜μ—¬ 객체λ₯Ό λ§Œλ“€μ§€ μ•Šκ³  μ§„ν–‰ν•˜μ˜€μŠ΅λ‹ˆλ‹€. λͺ¨λ“  μ›μ‹œκ°’μ„ 포μž₯ν•˜λŠ” 것이 κ³Όμ—° 쒋은 것인지 κΆκΈˆν•©λ‹ˆλ‹€.

3. TDD에 λŒ€ν•˜μ—¬

TDD둜 κ°œλ°œν•˜λ €λ©΄ ν…ŒμŠ€νŠΈλ₯Ό λ¨Όμ € κ΅¬ν˜„ν•˜κ³  κ°œλ°œμ„ μ‹œμž‘ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

ν…ŒμŠ€νŠΈ κ΅¬ν˜„ μ‹œ, μ–΄λ–€ λ©”μ†Œλ“œκ°€ ν•„μš”ν•œμ§€λ‚˜ 도메인이 μ–΄λ–»κ²Œ μƒκ²ΌλŠ”μ§€ λŒ€λž΅ 섀계λ₯Ό λ¨Όμ €ν•˜κ³  ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•˜λŠ” κ²½μš°κ°€ λ§Žμ•„μ„œ 사싀 이게 TDDκ°€ λ§žλŠ”μ§€μ— λŒ€ν•œ 고민이 λ§Žμ•˜μŠ΅λ‹ˆλ‹€.

μ œκ°€ λŠλΌκΈ°μ—λŠ” μ½”λ“œλ§Œ μž‘μ„±ν•˜μ§€ μ•Šμ„ 뿐이지 섀계λ₯Ό ν•˜κ³  ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•˜λŠ” κ±° κ°™μ•„μ„œ μ½”λ“œ μž‘μ„± μˆœμ„œλ§Œ ν‰μ†Œμ™€ λ°˜λŒ€λ‘œ ν•˜λŠ” 것 κ°™λ‹€λŠ” 생각이 λ“€μ–΄μ„œ κ³Όμ—° 효과적인 방법인지 계속 이 방법을 μ‚¬μš©ν•΄μ•Ό ν•  μ§€ κ³ λ―Όμž…λ‹ˆλ‹€.

심지어 μ½”λ“œ μž‘μ„± 쀑 초기 μ„€κ³„μ—μ„œ μˆ˜μ •ν•˜κ³  싢은 뢀뢄이 생기면 ν…ŒμŠ€νŠΈλ₯Ό 고치게 λ˜λŠ” μˆœκ°„μ΄ 생겨 TDD둜 잘 ν•˜κ³  μžˆλŠ” 것인지 항상 λ˜λ‡Œμ΄κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

λ¦¬λ·°μ–΄λ‹˜μ΄ μƒκ°ν•˜μ‹œλŠ” TDDλž€ 무엇인지, μ œκ°€ ν˜„μž¬ ν•˜κ³  μžˆλŠ” 방법이 λ§žλŠ” 것인지, κ³Όμ—° κΌ­ ν•„μš”ν•œ 것 인지, μ‹€λ¬΄μ—μ„œλ„ 자주 μ‚¬μš©ν•˜λŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€.

public static final String DEALER_NICKNAME = "λ”œλŸ¬";

private final Trump trump;
private final Name nickname;
Copy link

Choose a reason for hiding this comment

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

λ”œλŸ¬ 이름은 항상 'λ”œλŸ¬'인데 λ”°λ‘œ ν•„λ“œλ‘œ κ°€μ§ˆ ν•„μš”κ°€ μžˆμ„κΉŒμš”?

@@ -0,0 +1,5 @@
package blackjack.domain.participant;

public interface Name {
Copy link

Choose a reason for hiding this comment

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

toString() λ©”μ„œλ“œλŠ” λͺ¨λ“  Object ν΄λž˜μŠ€μ— 이미 μ„ μ–Έλ˜μ–΄ μžˆμ–΄μš”. 이 μΈν„°νŽ˜μ΄μŠ€λŠ” μ•„λ¬΄λŸ° κ°•μ œ 사항도 μ—†μ–΄λ³΄μ—¬μš”, μ–΄λ–€ ν΄λž˜μŠ€λ“  λ³„λ„μ˜ λ©”μ„œλ“œλ₯Ό μž‘μ„±ν•˜μ§€ μ•Šκ³ λ„ 이 μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€

@@ -0,0 +1,24 @@
package blackjack.domain.participant;

public class Nickname implements Name{
Copy link

Choose a reason for hiding this comment

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

BettingMoneyInfoλŠ” Map<Name, BettingMoney>λ₯Ό μ €μž₯ν•˜κ³  Name ν‚€λ₯Ό μ‚¬μš©ν•˜μ—¬ 값을 μ‘°νšŒν•˜μ§€λ§Œ Nickname은 equals() λ˜λŠ” hashCode()λ₯Ό μž¬μ •μ˜ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ μ°Έμ‘° λ™λ“±μ„±μœΌλ‘œ λŒ€μ²΄λ©λ‹ˆλ‹€.
e.g) μƒˆλ‘œμš΄ Nickname("pobi") != κΈ°μ‘΄ Nickname("pobi")

public void decideHit() {
int totalScore = hand.calculateScore();
int totalScore = getScore();
if (totalScore > DEALER_HIT_THRESHOLD) {
Copy link

Choose a reason for hiding this comment

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

method name 이 행동과 μΌμΉ˜ν•˜μ§€ μ•ŠλŠ”κ±°κ°™μ•„μš”. decideStay() λ₯Ό ν™•μΈν•˜λŠ” 것 처럼 λ³΄μž…λ‹ˆλ‹€!

public List<String> getOpenCardNames() {
final int holeIndex = 1;
return hand.getCardNames(holeIndex);
return getCardNames(holeIndex);
Copy link

Choose a reason for hiding this comment

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

HandλŠ” μΉ΄λ“œλ₯Ό κ±΄λ„ˆλ›°λ €λŠ” μ΄μœ μ— λŒ€ν•΄μ„œλŠ” μ „ν˜€ μ•Œ ν•„μš”κ°€ μ—†λ‹€κ³  μƒκ°ν•΄μš”.
startInclusive λ§€κ°œλ³€μˆ˜λŠ” 였직 λ”œλŸ¬μ˜ νŠΉμ • κ·œμΉ™, 즉 νžˆλ“  μΉ΄λ“œ λ•Œλ¬Έμ— μ‘΄μž¬ν•©λ‹ˆλ‹€. κ·Έλ ‡λ‹€λ©΄ Hand 에 λ©”μ„œλ“œλ₯Ό μ˜€λ²„λ‘œλ”©ν•˜λŠ” 것 보닀 μ•„μ˜ˆ λ”œλŸ¬μ— λ‘œμ§μ„ κ΅¬ν˜„ν•˜λŠ” 것은 μ–΄λ–¨κΉŒμš”?

public List<String> getOpenCardNames() {
      List<String> all = getCardNames();
      return all.subList(1, all.size()); // dealer's own concern
  }

.mapToDouble(money -> -money)
.sum();
}

Copy link

Choose a reason for hiding this comment

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

😒 파일 ν¬λ§·νŒ… ν™•μΈν•΄μ£Όμ„Έμš”

Copy link

@yenawee yenawee left a comment

Choose a reason for hiding this comment

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

μ•ˆλ…•ν•˜μ„Έμš” 둜운!

2단계 잘 κ΅¬ν˜„ν•΄μ£Όμ…¨λ„€μš” 😸
μ½”λ©˜νŠΈ ν™•μΈν•΄μ£Όμ„Έμš”! (λ‹€λ₯Έ μ§ˆλ¬Έλ“€μ€ μ½”λ“œ 리뷰 μ½”λ©˜νŠΈλ₯Ό ν™•μΈν•΄μ£Όμ„Έμš”)

λ‹¨μˆœνžˆ μ›μ‹œκ°’ ν•˜λ‚˜λ₯Ό μœ„ν•΄ μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ„μž…ν•˜λŠ” 것이 μ˜€λ²„ μ—”μ§€λ‹ˆμ–΄λ§μ΄ μ•„λ‹Œμ§€, μ‹€λ¬΄μ—μ„œλ„ λΉ„μŠ·ν•˜κ²Œ ν™œμš©ν•˜λŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€.

ν˜„μž¬ 'Name' interface λ•Œλ¬Έμ— μš”λŸ° 고민이 λ‚˜μ˜¨κ±° κ°™μ•„μš”. 그런데 생각해보면 μΈν„°νŽ˜μ΄μŠ€λŠ” 보톡 'ν–‰μœ„' λ₯Ό μΆ”μƒν™”ν•˜λŠ”λ° μ‚¬μš©λ˜μ§€λ§Œ Name 은 'μƒνƒœ(Data/Value)' 에 가깝기 λ•Œλ¬Έμ— ν˜Όλž€μ΄ 온 것이라고 μƒκ°ν•΄μš”. 이런 값듀은 VO λ₯Ό μ‚¬μš©ν•΄μ„œ μœ νš¨μ„± 검증을 ν•˜λŠ” 방식이 일반적인 방법 κ°™λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

μˆ˜μ΅κΈˆμ— λŒ€ν•΄μ„  클래슀λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³  μ›μ‹œκ°’μΈ Double둜 μ²˜λ¦¬ν•˜λ„λ‘ ν•˜μ˜€μŠ΅λ‹ˆλ‹€. μˆ˜μ΅κΈˆμ€ κ²Œμž„ 결과에 따라 λ°°νŒ… κΈˆμ•‘μ„ ν•©μ‚°ν•˜λŠ” μ—­ν• λ§Œ ν•œλ‹€κ³  μƒκ°ν•˜μ—¬ 객체λ₯Ό λ§Œλ“€μ§€ μ•Šκ³  μ§„ν–‰ν•˜μ˜€μŠ΅λ‹ˆλ‹€. λͺ¨λ“  μ›μ‹œκ°’μ„ 포μž₯ν•˜λŠ” 것이 κ³Όμ—° 쒋은 것인지 κΆκΈˆν•©λ‹ˆλ‹€.

λͺ¨λ“  μ›μ‹œκ°’μ„ 포μž₯ν•΄μ•Ό ν•œλ‹€λŠ” 강박을 κ°€μ§ˆ ν•„μš”λŠ” μ—†μŠ΅λ‹ˆλ‹€. νŠΉλ³„ν•œ μœ νš¨μ„± κ²€μ¦μ΄λ‚˜ ν–‰μœ„κ°€ μ—†λ‹€λ©΄μš”.
ν•˜μ§€λ§Œ 돈, λ‹¨μœ„, μ‹λ³„μž, μ’Œν‘œ 등은 VO 둜 포μž₯ν–ˆμ„λ•Œ κ°€μ§€λŠ” 이점이 맀우 ν½λ‹ˆλ‹€. 예λ₯Ό λ“€λ©΄ λˆμ„ double 둜 κ΄€λ¦¬ν•˜λ©΄ λΆ€λ™μ†Œμˆ˜μ  μ˜€μ°¨κ°€ μƒκΈΈμˆ˜ μžˆμ–΄μ„œ BigDecimal 을 μ‚¬μš©ν•΄μš”. 또 ν˜„μž¬ λ”œλŸ¬μ˜ μˆ˜μ΅μ„ κ³„μ‚°ν•˜κΈ° μœ„ν•΄ -money 처럼 λ§ˆμ΄λ„ˆμŠ€λ₯Ό λΆ™μ΄κ±°λ‚˜ κΈˆμ•‘ 계산 둜직 응집도λ₯Ό μœ„ν•΄μ„  포μž₯ν•˜λŠ” 것이 μ•ˆμ „ν•  κ±° κ°™μ•„μš”.

TDD 에 λŒ€ν•΄μ„œ

TDD 라고 ν•΄μ„œ ν…ŒμŠ€νŠΈλΆ€ν„° λ¬΄μž‘μ • μž‘μ„±ν•  μˆ˜λŠ” μ—†μœΌλ‹ˆ λŒ€λž΅μ μΈ 섀계, 도메인을 머릿속에 κ·Έλ €λ³΄λŠ” 건 λ‹Ήμ—°ν•˜λ‹€κ³  μƒκ°ν•΄μš”. 섀계가 λ°”λ€Œμ–΄μ„œ ν…ŒμŠ€νŠΈλ₯Ό 고치게 λ˜λŠ” 것은 초반 섀계 κ³ μΉ˜λŠ” λ°©ν–₯λ•ŒλŠ” 그럴수 μžˆμ§€λ§Œ κ³„μ†ν•΄μ„œ λ°œμƒν•œλ‹€λ©΄ μ™œ 고치게 λ˜λŠ” 것인지, λ‚΄ ν…ŒμŠ€νŠΈκ°€ 'ν–‰μœ„'λ₯Ό 잘 ν…ŒμŠ€νŠΈν•˜κ³  μžˆλŠ” 것인지 확인해볼 ν•„μš”μ„±μ€ μžˆλ‹€κ³  λ΄μš”. μ§€κΈˆμ€ 첫 λ―Έμ…˜μ΄κ³  λ‹¨κ³„λ³„λ‘œ μš”κ΅¬μ‚¬ν•­μ΄ μƒˆλ‘œ μΆ”κ°€λ˜μ–΄μ„œ λ¦¬νŒ©ν„°λ§μ„ ν–ˆμ„λ•Œ TDD κ°€ μ£ΌλŠ” μ•ˆμ •κ°μ„ λŠλΌκΈ°μ— λ„ˆλ¬΄ 초반인 것 같은데 μ €λŠ” λ―Έμ…˜ μ§„ν–‰ν•˜λ©΄μ„œ 느껴본 적이 λ§Žμ•„μ„œ λ‘œμš΄λ„ ν•œλ²ˆ μš°ν…Œμ½” μ§„ν–‰ν•˜λ©΄μ„œ μ²΄κ°ν•΄λ³΄μ…¨μœΌλ©΄ ν•˜λŠ” λ°”λžŒμž…λ‹ˆλ‹€..πŸ™
μ§€κΈˆ μΌν•˜λ©΄μ„œλŠ” κΈ°μ‘΄ μ½”λ“œμ— μ½”λ“œλ₯Ό λ§λΆ™μ΄λŠ” 일듀이 많기 λ•Œλ¬Έμ— 사싀 ν…ŒμŠ€νŠΈ μ½”λ“œλΆ€ν„° λ¨Όμ € μ§œλŠ” κ²½μš°λŠ” 극히 λ“œλ¬Όμ–΄μš”. ν•˜μ§€λ§Œ μ–΄λ–»κ²Œ μ§€μ§€ μ•„μ˜ˆ 감이 μ•ˆμž‘νžλ•Œ, input, output μƒκ°ν•˜κ³  ν…ŒμŠ€νŠΈμ½”λ“œλΆ€ν„° 짰던 적이 λ“œλ¬Όκ²Œ μžˆμ—ˆκΈ΄ ν•©λ‹ˆλ‹€!

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