[로또] 박세연 미션 제출합니다.#1
Conversation
khj0426
left a comment
There was a problem hiding this comment.
먼저 고생하셨습니다!
코드를 보면서 오히려 제가 더 배워가는 거 같아욤 !! 💯 전반적으로 큰 문제 없이 잘 읽혔습니다 👍 👍 👍 👍
첫번쨰 질문 <-
일단 제가 TDD를 많이 경험해 보지 못했기 떄문에 명확한 답은 드리기 힘들수도 있지만,
TDD는 코드를 작성하기 전 테스트 코드를 적는 것을 의미해요!
보통은 예상치 못한 버그를 잡기 위해 TDD를 사용하게 됩니다!
언제 TDD를 도입하고, 왜 TDD를 사용해야 하는지 알기 이전에 무엇을 테스트해야하는지부터 정하는 게 중요할 것 같아요!
팀마다 처한 상황이 다르고, 무엇을 테스트할지에 대한 기준도 서로 다르기 때문에,
팀의 논의가 꼭 필요할 것 같습니다..!
두번째 질문<-(지극히 개인적인 의견입니다..!)
요것도 처한 상황에 따라 다를 것 같긴 합니다! 당장 요구사항이 많고 빠듯한 일정이라면,
어떻게든 요구사항을 만족시키고 기능을 구현하는 것이 최우선이라고 생각해요
(구현 후 한번씩 기술부채나 리팩토링을 할 수도 있겠죠?!)
| out_of_range_bonus: '[ERROR] 보너스 번호는 1부터 45 사이의 숫자여야 합니다.', | ||
| duplicate_bonus: | ||
| '[ERROR] 보너스 번호는 로또 번호랑 중복된 숫자를 입력하면 안됩니다.', | ||
| }); |
There was a problem hiding this comment.
너무 깔끔합니다.. 👍 에러 유형별로(구입금액 입력, 당첨번호 입력, 보너스번호 입력) 별로 한 깊이 더 객체가 만들어질 수도 있을 것 같아요!
또 요렇게 전역적으로 에러 상수를 관리할 수도 있지만 , 폴더 별로 관리할 수도 있습니다!
(폴더 별로 해당 폴더 안의 상수들을 관리하는 용도)
그래서 상황에 따라 적절한 방법을 골라서 사용하면 될 것 같아요!
| prize: 5000, | ||
| message: '3개 일치 (5,000원) - ', | ||
| }, | ||
| FOURTH: { |
There was a problem hiding this comment.
console.log(LOTTO_RESULT.FOURTH.bonus);
LOTTO_RESULT.FOURTH.bonus = true;
console.log(LOTTO_RESULT.FOURTH.bonus);요 결과는 어떻게 나올까요?
There was a problem hiding this comment.
처음에는 두 가지 때문에 안 바뀔 거라고 생각했었습니다.
- const 때문에 안 될 것이다.
- Object.freeze() 때문에 안 바뀔 것이다.
이렇게 생각했었는데 생각해보니 1번은 객체의 참조 주소만 바뀌지 않으면 가능할 것 같았습니다. 그리고 직접 해보니 바뀌는 걸 알 수 있었습니다.
그래서 왜 바뀌는지 궁금해서 찾아보니, 2번도 얕은 동결만 되고 있고, 깊은 동결이 되지 않아 객체 안의 값이 바뀔 수 있다는 걸 알 수 있었습니다! 감사합니다 :)
| #validate(numbers) { | ||
| if (numbers.length !== 6) { | ||
| throw new Error("[ERROR] 로또 번호는 6개여야 합니다."); | ||
| changeStringToArray(inputNumbers) { |
There was a problem hiding this comment.
map메소드를 사용한다면 어떻게 바꿀 수 있을까요?
There was a problem hiding this comment.
changeStringToArray는 범용적으로 쓸 수 있는 함수일 것 같은데요!
요 함수가 꼭 이곳에 위치해야 할까요?
사용하는 입장에서 문자열 -> 배열로 바꾸는 함수를 사용하려면 lotto객체를 만들어야만 사용할 수 있는데,
해당 방법이 바람직할까요 ?!!
| import LottoGenerator from './LottoGenerator.js'; | ||
|
|
||
| class Game { | ||
| constructor() { |
There was a problem hiding this comment.
이렇게 사용하면 사용하는 바깥에서 맘대로 멤버변수를 제어할 수 있게 됩니당.
예를 들어 Game클래스로 만든 인스턴스를 사용하는 바깥에서는
const game = new Game();
game.purchase = 6;
console.log(game.purchase);다음과 같이 맘대로 멤버변수에 접근하고 수정할 수 있어요!
Game의 규칙이 잘 지켜지도록, 바깥에서 조작할 수 없도록 하려면 어떻게 하면 좋을까요?!
There was a problem hiding this comment.
앞에 #을 붙이면 될 것 같아요! 제가 생각한 게 맞을까요?
| import { Random } from '@woowacourse/mission-utils'; | ||
| import { LOTTO } from './constants/Constants.js'; | ||
|
|
||
| const LottoGenerator = { |
There was a problem hiding this comment.
요부분은 클래스로 구현하지 않고 객체로 구현한 이유가 있을까욤?!
There was a problem hiding this comment.
이 부분은 다른 팀원분이 작성해주신 부분이라 잘 모르겠습니다..! 물어보고 이유가 있으면 추가해서 댓글 달아놓을게요!
There was a problem hiding this comment.
물어보니 큰 이유는 없는 것 같아요! 클래스로 구현하는 게 더 통일성 있고 좋을까요?
| import { LOTTO_RESULT } from './constants/Constants.js'; | ||
|
|
||
| class Statistics { | ||
| #results = { 3: 0, 4: 0, 5: 0, '5+1': 0, 6: 0 }; |
There was a problem hiding this comment.
요부분은 상수로 따로 뺴시지 않은 이유가 궁금합니당
There was a problem hiding this comment.
생각을 못 했는데 상수로 빼면 좋을 것 같아 그렇게 수정했습니다!
| this.winningNumber = winningNumber; | ||
| this.bonusNumber = bonusNumber; | ||
| // this.#statistics = statistics; | ||
| } |
There was a problem hiding this comment.
요부분도 외부에서 멤버변수를 조작할 수 있을 것 같은데 어떻게 방지할 수 있을까요?!
const statistics = new Statistics(
this.lottos,
this.winningNumbers,
this.bonusNumber
);
statistics.bonusNumber = 'Hi!'There was a problem hiding this comment.
외부에서 멤버 변수를 조작할 수 없도록 구현 수정했습니다!(#을 이용했어요)
| } | ||
|
|
||
| calculateRank(matchNumber, lotto) { | ||
| if (matchNumber >= 3) { |
There was a problem hiding this comment.
요기서 관리하는 3,5도 의미있는 숫자 같아요!
실행 과정
이번 페어 미션은 세 명이서 진행해서 지금까지 진행했던 거와는 느낌이 달랐습니다. 더욱 다양한 의견을 들을 수 있어서 좋았습니다. 하지만, 다양한 의견이 있었던 만큼 진행하는 시간도 더 걸릴 수밖에 없었습니다. 특히 이번에는 테스트 주도 개발(TDD)도 시도해보고자 했기에 더 시간이 오래 걸렸다고 생각합니다.
느낀 점
이번 미션은 TDD도 하고, 두 명의 페어와 함께 했기 때문에 시간이 많이 들었습니다. 3~4일 동안 매일 디스코드로 만나서 했어서 체력적으로 지치기도 했지만, 페어들과 함께 문제를 해결하는 과정이 재밌었습니다. 이번에는 메시지나 상수들도 다 파일에 선언해서 사용했는데, 이렇게 해본 건 처음이라 어색했습니다. 하지만, 실제 개발에서는 잘 사용되는 방법일 것 같아서 익숙해지면 좋겠다고 생각했습니다.
배운 점
: 한 파일 안에 여러 개 export하면 import 할 때 {} 해야만 한다! 한 파일에 한 개 export하면 export default라고 적어주고, import할 때 {} 안 적어줘야 한다!
: 이러면 forEach()도 이용 가능!
: 개발자가 형변환해주고 매개변수에 대입해야 잘 작동한다.(Number.isNaN(Number(a)); 이런 식으로!)
궁금한 점