Skip to content
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

[숫자 야구 게임] 박진효 미션 제출합니다. #867

Open
wants to merge 74 commits into
base: main
Choose a base branch
from

Conversation

jinmidnight01
Copy link

No description provided.

* .eslintrc.json 구현 (airbnb 규칙 적용)
* .prettierrc.json 구현
* 기능 그룹 설계
* 코드 스타일 및 브랜치 전략 설계
* OpponentNumber 모델 생성
* GAME_START 메시지 추가
* 숫자 조건에 관련된 RANGE 필드 추가
* RANDOM_NUMBER 함수 구현
* .eslintrc.json 구현 (airbnb 규칙 적용)
* .prettierrc.json 구현
* 기능 그룹 설계
* 코드 스타일 및 브랜치 전략 설계
* 상대방(컴퓨터)의 숫자 생성
* startGame 함수 삭제, run 함수 수정, generateOpponent 함수 추가
* ValidationTest.js 파일 추가
* strikeCount와 ballCount에 따라 출력할 결과값 반환
* 사용자의 재시작 여부를 입력받아 User 객채의 isRestart 필드 값으로 저장
* return 문을 제거하고, 바로 출력하도록 수정
* print문 대신 View 함수를 사용하도록 수정
* strikeCount, ballCount 리셋 로직 추가
@jinmidnight01 jinmidnight01 changed the title [숫자 야구 게임] 박진효 미션 제출합니다 [숫자 야구 게임] 박진효 미션 제출합니다. Oct 25, 2023
Copy link

@optimal99 optimal99 left a comment

Choose a reason for hiding this comment

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

미션 진행하시느라 고생하셨습니다!

MVC 패턴을 공부하는데 많이 도움이 되었습니다! 감사합니다!
코드 리뷰 전에 README에 설명이 잘되어 있어 코드 리뷰가 수월했습니다!
컨트롤러, 모델, 뷰, 유틸 파일이 분리되어 있고 작명이 잘되어 있어 코드 추적이 쉬웠습니다!

Controller.js 안에 작성된 함수들과 utils 폴더의 함수들과 분리하게 된 이유가 함수 내부에서 작성한 다른 함수를 사용하느냐 차이일까요??
이렇게 분리하게 된 기준이 어떤 건지 궁금합니다!

ballCount = 0;

const userNumber = await this.saveUserInput();
const userNumberElements = userNumber.toString().split("").map(Number);

Choose a reason for hiding this comment

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

저는 이렇게 한번 작성해봤습니다!

Suggested change
const userNumberElements = userNumber.toString().split("").map(Number);
const userNumberElements = Array.from(String(userNumber),Number);

[참고자료]
https://github.com/parksb/javascript-style-guide#arrays--mapping
https://github.com/parksb/javascript-style-guide#coercion--strings

Copy link
Author

Choose a reason for hiding this comment

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

해당 코드로도 작성할 수 있겠네요!ㅎㅎ 감사합니다!

Copy link
Author

Choose a reason for hiding this comment

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

utils 폴더에는 여러 class에서 재사용성이 높을 것 같은 함수들로 구성하고자 했는데, 다시 보니 RandomNumber 함수는 utils 폴더 보다는 Controller 클래스에 구현하는 것이 나았겠다는 생각이 드네요 ㅎㅎ 감사합니다:)

Comment on lines +66 to +67
let strikeCount = 0;
let ballCount = 0;

Choose a reason for hiding this comment

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

미리 초기화하지 않아도 잘 동작합니다!

Suggested change
let strikeCount = 0;
let ballCount = 0;
let strikeCount;
let ballCount;

Choose a reason for hiding this comment

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

저는 개인적으로 count의 초기값을 정해준 모습이 좋다고 봅니다!

Copy link
Author

Choose a reason for hiding this comment

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

저도 초기화 하는 게 좀 더 좋을 것 같아서 초기화해봤습니다!

/**
* 게임 시작 메시지를 출력한다.
*/
const GAME_START_VIEW = () => {

Choose a reason for hiding this comment

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

함수 표현식 이름을 왜 대문자로 구성하셨는지 궁금합니다.
import해올 때 기존 함수명과 구분하기 위함일까요??

Copy link
Author

Choose a reason for hiding this comment

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

네이밍 컨벤션에 상수명은 SNAKE_CASE로 작성하라고 되어있어서 그렇게 했는데, 생각해보니까 상수명이라는 게 함수 표현식은 아닌 것 같네요! 다음 과제 때 참고해야겠네요 ㅎㅎ 감사합니다!

import Opponent from "../models/Opponent.js";
import User from "../models/User.js";

import GAME_START_VIEW from "../views/GameStartView.js";

Choose a reason for hiding this comment

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

import할 때 확장자를 생략하면 다른 환경의 시스템에서 파일 확장자를 변경해도 동일한 코드를 작성할 수 있어 호환성을 확보할 수 있습니다!

Suggested change
import GAME_START_VIEW from "../views/GameStartView.js";
import GAME_START_VIEW from "../views/GameStartView";

Copy link
Author

Choose a reason for hiding this comment

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

저도 처음에 그렇게 했는데 IDE 상에서 eslint 문법에 어긋난다 그래서 고쳤습니다 ㅠ 그런데 airbnb 컨벤션에도 말씀 주신 것처럼 확장자를 빼는 것을 추천하는 것 같아서 다시 한 번 확인해봐야겠네요! 감사합니다:)

Copy link

@rlaclghks123 rlaclghks123 left a comment

Choose a reason for hiding this comment

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

진효님 덕분에 많이 배웠습니다. 감사합니다.

Comment on lines +66 to +67
let strikeCount = 0;
let ballCount = 0;

Choose a reason for hiding this comment

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

저는 개인적으로 count의 초기값을 정해준 모습이 좋다고 봅니다!

* 사용자의 숫자 입력을 받는다
*/
const INPUT_NUMBER_VIEW = () => {
return Console.readLineAsync(MESSAGES.INPUT_NUMBER);

Choose a reason for hiding this comment

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

비동기로 받아오는 부분도 try,catch로 에러처리를 해주는 습관을 가지면 더 좋지 않을까 합니다.

Copy link
Author

Choose a reason for hiding this comment

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

아 그렇겠군요:) 다음에 비동기 내용 구현할 때 참고하겠습니다. 감사합니다!

@JichanPark12
Copy link

와,,,, 엄청 많이 배우고 갑니다 git 관리부터 시작해서 mvc까지 감사합니다.

* @param {number} ballCount
* @returns {string} result
*/
const OUTPUT_VIEW = (strikeCount, ballCount) => {

Choose a reason for hiding this comment

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

부정 연산자를 이용해 0, 즉, 있는지 없는지 확인하는걸 조금더 간단히 표현할 수 있을것 같아요 !

if (!ball && !strike) {} // 볼과 스트라이크가 없다면 
if(strike) {} // strike 자체가 0, undefined, null과 같은 falsy한 값이 아니라면 true로 평가됩니다 !

Copy link
Author

Choose a reason for hiding this comment

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

아 그렇네요 ㅎㅎ 감사합니다!

* 1~9의 숫자로 임의의 서로 다른 세자리 숫자를 생성하는 클래스
* @return {number}
*/
const RANDOM_NUMBER = () => {

Choose a reason for hiding this comment

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

parameterrandomNumbers의 생성할 length를 받아오는건 어떨까요 ?
사용할때 명시적으로 3자리를 생성한다는것도 알릴 수 있고 조금 더 유연하게 사용할 수 있을것 같아요 !

createRandomNumbers(length) {
const �computer = []
while (computer.length < length) {
// ... 랜덤숫자 생성로직
}

Copy link
Author

Choose a reason for hiding this comment

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

그게 더 재사용성이 높겠네요! 감사합니다:)

* 사용자의 입력 숫자를 반환한다.
* @return {number}
*/
getNumber() {

Choose a reason for hiding this comment

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

private 필드로 설정한 이유는 데이터의 은닉화라고 생각하는데 # 프리픽스로 숨겨놨던 프로퍼티를 return하면 의미가 조금 퇴색되는것 같습니다 !

해당 값으로 어떤 값을 만들고싶은지 알아보면 좋을것 같아요

Copy link
Author

@jinmidnight01 jinmidnight01 Oct 28, 2023

Choose a reason for hiding this comment

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

private 필드로 설정하는 이유에 데이터의 은닉화도 있지만 클래스의 필드에 직접적인 access를 방지하기 위함도 있다고 알고 있습니다. 대신 getter함수를 통해 간접적인 access를 할 수 있도록 구현한 것입니다!

const controller = new Controller();
const isRestart = await controller.run();
if (isRestart) {
await this.play();

Choose a reason for hiding this comment

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

이렇게 재귀적 호출을 하게되면 user가 1을 눌러 '게임을 시작합니다' 라는 문구가 다시 뜨게되는데 요구사항이랑은 조금 달라지는것 같아요 !

아예 App 인스턴스를 생성할때 시작메세지를 print를 해주는게 어떨까요 !

Copy link
Author

Choose a reason for hiding this comment

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

아 그렇네요! 제가 여기까지 신경을 못 썼네요. 감사합니다:)

@kd02109
Copy link

kd02109 commented Oct 29, 2023

MVC 패턴을 어떻게 작성해야 할까?에 대해서 고민을 많이 해보았는데, 진효님 코드를 읽으면서 많은 도움을 받았습니다. 감사합니다!

@pigpgw
Copy link

pigpgw commented Jan 31, 2024

코린이라 많이 방황하고 있었는데 진효님 코드보면서 많은 도움이 됬습니다. 너무 감사합니다!!

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.

7 participants