-
Notifications
You must be signed in to change notification settings - Fork 2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[숫자 야구 게임] 강철원 미션 제출합니다. #4
base: main
Are you sure you want to change the base?
Conversation
에러내용이 깔끔하도록 수정 및 게임이 끝났을 때 안내문 추가
사용자가 서로다른 3자리 숫자를 입력하면 미리 만들어져있던 컴퓨터 숫자와 대조하여 올바른 힌트 출력
3스트라이크가 아닐시 다시 숫자 입력단계로 이동 단 컴퓨터 숫자는 이전과 동일
1을 입력하면 재시작 2를 입력하면 앱을 종료시킨다.:
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
에러처리가 인상적입니다!
src/Validator/GameCommand.js
Outdated
#checkNumber() { | ||
checkNumber(this.#input); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
굳이굳이굳이찝자면 공통된 부분을 무조건 추리는 것보단 .,,하나만 utils로 빼기위해 utils를 만드는 것보다는 공통된 index에서 하거나 그냥 빼지 않고 각각 유효성 검증하는 코드를 넣어 작성하는 것이 가독성에 좋을 것 같습니다!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
네 이 부분은 너무 억지로 조합을 사용한 것 같습니다.
해당 부분은 수정하였습니다 감사합니다!
const isStrike = | ||
this.#computerNumbers.includes(Number(cur)) && this.#computerNumbers.indexOf(Number(cur)) === index; | ||
const isBall = this.#computerNumbers.includes(Number(cur)); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
굳이굳이굳이찝자면 isStrike, isBall 또한 구현하는 부분이기 때문에 외부로 메서드로 분리하는 것도 함수역할을 덜 수 있을 것 같습니다!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
아하 compose method 패턴적용 말씀이군요
그렇게 해도될 것 같습니다.
하지만 메서드로 만들면 함수에 인자가 두 개가 필요하고 isStrike는 두 번 필요하기에 두 번 모두 호출되어야합니다.
그래서 이렇게 설계했던 것 같습니다.
지금은 이렇게 리팩토링 되었습니다.
const isStrike = | |
this.#computerNumbers.includes(Number(cur)) && this.#computerNumbers.indexOf(Number(cur)) === index; | |
const isBall = this.#computerNumbers.includes(Number(cur)); | |
compareUserWithComputerNumbers(input) { | |
this.#forEach(this.#spread(input)); | |
return this.#score; | |
} | |
#spread(input) { | |
return [...input]; | |
} | |
#forEach(input) { | |
input.forEach((cur, index) => { | |
const isStrike = this.#computerNumbers.indexOf(Number(cur)) === index; | |
const isBall = this.#computerNumbers.includes(Number(cur)); | |
if (isStrike) this.#score.strike += 1; | |
if (!isStrike && isBall) this.#score.ball += 1; | |
}); | |
} |
this.#computerNumbers = RandomNumberGenerator.generateRandomNumber(); | ||
} | ||
compareUserWithComputerNumbers(input) { | ||
input.split('').forEach((cur, index) => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
str split vs spread
를 비교해보니 spread
연산자가 더 빠르다고 합니다!
str split vs spread
관련된 근거를 찾아보려고했지만 자료가 있지 않아서 추가적으로 발견하게 되면 공유해드리겠습니다!!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
오! 감사합니다
계속 까먹네요.
src/Validator/GameNumber.js
Outdated
#input; | ||
|
||
checkGameNumbers(input) { | ||
this.#input = input; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Validator에게 input이라는 상태가 필요한 이유가 있을까요?
프로퍼티 메서드를 사용하는 데에선 input을 인자로 사용하기 때문에 의미상 input으로 들어온 값을 검증한다는 느낌입니다.
하지만 input으로 멤버를 변경하면 Validator의 상태를 변경합니다. 그렇다고 유효성 검증 결과만 바뀌지 과정이 변경되는 것이 아닙니다.
이 관점에서 저라면 멤버로 사용하지 않고 인자로 넘겨주는 방식을 사용할 것 같은데 이렇게 멤버로 사용하시는 이유가 따로 있을까요?!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
단순히 input이 반복적으로 여러 메서드의 인자로 들어가는 것을 막기위해 그렇게 했는데
아예 근원부터가 잘못된 것 같습니다.
굳이 필요없는 필드를 여러개를 사용해가면서 클래스로 만들이유가 있나 라는 생각을 해보았고 결굴 필요없다는 결론에 이르러 전부 함로 변경해주었고 input도 인자로 사용하도록 변경했습니다.
감사합니다.!
src/Controller/BaseballController.js
Outdated
#handleError(error) { | ||
if (error instanceof ValidationError) { | ||
return this.#view.printError(new ReadError('Validation Error', error)); | ||
} | ||
throw error; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
혹시 입력에 관한 에러를 다른 에러로 오버라이딩 하시는건가요? 하나 배워갑니다~!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
좋은 코드 공유 감사합니다 !! 많이배워가요 ㅎㅎ
node_modules | ||
.template.txt |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
EOL 빼먹으셨네요..!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
prettier
에 EOL
설정이 있으니 참고해보셔도 좋을거 같아요!!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@turtle601 EOL 설정은 이전부터 이미 되어있습니다.
.gitignore에는 적용이 안되는 것 같은데 이유를 아시나요 ?
.prettierignore 파일을 추가하여 ignore 설정 한 것은 없습니다.
운영체제가 다른 사람과 협업하는 게 아닌 저 혼자 mac os에서 하기에 lf로 설정해 두었습니다.
"endOfLine": "lf",
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Ryan-Dia
음... 사실 .gitignore
에 대한 내용은 잘 모르겠습니다 ㅜㅜ
저 같은 경우에는 npm install -D prettier
로 하고 prettierrc
파일을 따로 설정,
대신 package.json
과 prettierrc
파일을 upstream에 올리지 않는 방식을 사용하고 있습니다
(추가적으로 endOfLine: auto
로 두고 작업하고 있습니다.)
이렇게 할 경우 다른 레포에 적용도 안되서 다른 분들고 협업에도 지장이 없을 거 같다는 제 추측입니다!!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
제가 스터디 PR인줄도 모르고 코드 리뷰를 남겼네요 ㅜㅜㅜ 죄송합니다 🙏🙏
#view; | ||
|
||
#model; | ||
|
||
#baseballController; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
MVC 디자인패턴에서는 컨트롤러만이 모델과 뷰에 모두 접근 가능한데, 컨트롤러만 app에서 선언해주고 나머지는 컨트롤러에서 선언해주는게 더 좋지 않았을까요?
src/Constants/Message.js
Outdated
const ERROR_MESSAGE = { | ||
error: '[ERROR]', | ||
length_one: '1자릿수가 아닙니다.', | ||
length_three: '3자릿수가 아닙니다.', | ||
only_number: '숫자이외의 다른 문자가 존재합니다.', | ||
not_zero: '0을 포함시켜면 안됩니다. ', | ||
not_duplication: '서로 다른 숫자를 입력하시옵소서', | ||
one_or_two: '숫자 1 또는 2만 입력이 가능합니다.', | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
불변성 유지해주셨으면 더 좋았을 것 같습니다! 물론 저도 깜빡했습니다 ㅎㅎ..
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
해당부분 스터디 전에 찾아서 몰래 바꾸어 놓았습니다.
앞으로는 잘 체크해야할 것 같습니다.
const ValidationError = require('../Error/ValidationError'); | ||
const Validator = require('../Validator'); | ||
|
||
const RESTART = '1'; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
간단한 상수는 위에 따로 표기하는 방법 좋은거같아요!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
철원님 코드에는 항상 새롭게 시도해보려는 코드가 들어가서 보면서 항상 많이 배우는 것 같습니다!
이번에도 코드 잘 봤습니다! 코멘트 남겨두었으니 참고해주세요!
this.#model = new BaseballModel(); | ||
this.#baseballController = new BaseballController(this.#view, this.#model); | ||
} | ||
play() { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
한 칸 띄워주는 사소한 컨벤션~! 사소하지만 그래도 지켜줍시다~!
generateRandomNumber() { | ||
const computer = []; | ||
while (computer.length < GENERATOR.pick_number_end) { | ||
const number = Random.pickNumberInRange(GENERATOR.start_number, GENERATOR.end_number); | ||
if (!computer.includes(number)) computer.push(number); | ||
} | ||
return computer; | ||
}, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
다음과 같이 집합 Set
을 사용하면 includes
사용을 없애 시간 복잡도를 낮출 수 있고 if
문을 사용하지 않아도 됩니다!
generateRandomNumber() { | |
const computer = []; | |
while (computer.length < GENERATOR.pick_number_end) { | |
const number = Random.pickNumberInRange(GENERATOR.start_number, GENERATOR.end_number); | |
if (!computer.includes(number)) computer.push(number); | |
} | |
return computer; | |
}, | |
generateRandomNumber() { | |
const computer = new Set(); | |
while (computer.length < GENERATOR.pick_number_end) { | |
const { start_number, end_number } = GENERATOR; | |
const number = Random.pickNumberInRange(start_number, end_number); | |
computer.add(number); | |
} | |
return computer; | |
}, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
const RandomNumberGenerator = {
generateRandomNumber() {
const computer = new Set();
while (computer.size < GENERATOR.pick_number_end) {
const number = Random.pickNumberInRange(GENERATOR.start_number, GENERATOR.end_number);
computer.add(number);
}
return computer;
},
};
오 감사합니다. 이 경우에는 set이 훨씬 좋군요
해당사항은 반영하였습니다.
set은 고려해보지 않았는데 다음번에는 set도 고려해보겠습니다.
src/Validator/GameCommand.js
Outdated
#checkNumber() { | ||
checkNumber(this.#input); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 checkNumber
만 왜 외부에서 만든 함수를 가지고 오는 건가요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
상속대신 조합을 사용하였는데
지금 다시 생각해보니 굳이 하나의 함수를 가져오는 데는 필요없을 것 같아 각각 원래 코드로 바꾸었습니다.
src/Validator/index.js
Outdated
#gameNumber; | ||
|
||
#gameCommand; | ||
|
||
constructor() { | ||
this.#gameNumber = new GameNumber(); | ||
this.#gameCommand = new GameCommand(); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Validator
를 클래스화 해보려고 한 것은 좋은 것 같습니다. 하지만 이로인해 외부에서는 사용하지 않고 불필요하게 선언된 필드가 총 4개가 생성되었습니다. 저라면 클래스를 만들더라도 필드를 만들어주지는 않을 것 같습니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
맞습니다. 다시 곰곰이 생각해보니
굳이 필요없는 필드를 만들면서 까지 클래스를 쓸 필요는 없을 것 같습니다.
따라서 전부 함수로 변경해주었습니다. 감사합니다.
|
||
printGameEnd() { | ||
Console.print(OUTPUT_MESSAGE.end); | ||
Console.close(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 Console.close();
는 밑의 finishGame()
으로 대체해도 좋을 것 같아요!
@@ -0,0 +1,35 @@ | |||
const RandomNumberGenerator = require('../RandomNumberGenerator'); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
구조 분해 할당 하고 싶어지네요..ㅎㅎ
물론 이대로 사용하셔도 무방합니다..!
src/Model/BaseballModel.js
Outdated
this.#computerNumbers = RandomNumberGenerator.generateRandomNumber(); | ||
} | ||
compareUserWithComputerNumbers(input) { | ||
console.log(this.#computerNumbers); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
!!
} | ||
|
||
start() { | ||
this.#view.pinrtStart(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
소소한 오타이기는 하지만.. 수정하면 좋을 것 같아요~!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
오호!!
바로 수정했습니다!
감사합니다!
피드백에 따라 클래스를 사용보다 함수로 처리하는 것이 더 맞다고 생각하여 변경
const { ERROR_MESSAGE } = require('../Constants/Message'); | ||
|
||
const GameCommand = { | ||
checkGameCommand(input) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
메서드 체이닝
을 통해서 코드를 더 이쁘게 만들어볼 수 있을 거 같아요!!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
혹시 예를 들어 어떤식으로 하는지 알려주실 수 있나요 ?
}, | ||
|
||
checkNumber(input) { | ||
if (/\D/.test(input)) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
REGEX
변수도 상수화하면 유지보수 측면에서 더 좋을거 같아요!!
가독성 향상을 위해 controller구조 변경 문제 조건과 다르게 다른 값을 입력하면 종료되는 것이 아니라 오류 출력후 다시 입력 할 수 있도록 변경
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
늦어서 죄송합니다!
코드 잘 봤습니다 : )
const computer = []; | ||
while (computer.length < GENERATOR.pick_number_end) { | ||
const number = Random.pickNumberInRange(GENERATOR.start_number, GENERATOR.end_number); | ||
if (!computer.includes(number)) computer.push(number); | ||
} | ||
return computer; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
set을 사용하신다면 if (!computer.includes(number))
를 확인하지 않아도 될 것 같아요!
src/Validator/GameNumber.js
Outdated
#checkNumber() { | ||
checkNumber(this.#input); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
GameCommand.js
파일에서도 동일하게 checkNumber
함수를 사용하고 있는 것 같아요!
이를 부모 클래스에 선언한뒤 super
를 사용하게 하는건 어떨까요?
const isStrike = | ||
this.#computerNumbers.includes(Number(cur)) && this.#computerNumbers.indexOf(Number(cur)) === index; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
includes
는 불필요한 것 같습니다
const isStrike = | |
this.#computerNumbers.includes(Number(cur)) && this.#computerNumbers.indexOf(Number(cur)) === index; | |
const isStrike = this.#computerNumbers.indexOf(Number(cur)) === index; |
미션 제출합니다! ⛄️