안녕하세요

우테코 프리코스 2주차 - 새로 알게된 것 본문

우테코 프리코스/2주차

우테코 프리코스 2주차 - 새로 알게된 것

sakuraop 2022. 11. 6. 18:13

class 안에서 생성한 함수들은 해당 class의 메서드로 생성된다.


   
play() {
        MissionUtils.Console.print("play() :");
        MissionUtils.Console.print(MESSAGE.START);
        this.gameStart();
    }

 

throw 예외처리는 new Error("메시지") 를 통해서 어디에서 에러가 발생했는지 확인하도록 한다.


   
questionFinish() {
        MissionUtils.Console.print("questionFinish() :");
        MissionUtils.Console.readLine(MESSAGE.FINISH, (answer) => {
            if (answer === "1") {
                this.gameStart();
            }
            if (answer === "2") {
                MissionUtils.Console.close();
            }

            throw new Error(MESSAGE.ERROR);
        });
    }

 

조건문은 캡슐화 시키기


   
isValidNumber(numberInput) {
        Console.print("isValidNumber()-------------------");
        if (this.hasZero(numberInput) || this.hasSameNumber(numberInput)) {
            throw new Error(MESSAGE.ERROR);
        }
    }
    hasZero(numberInput) {
        Console.print("hasZero()-----------------");
        return numberInput.includes("0");
    }
    hasSameNumber(numberInput) {
        Console.print("hasSameNumber()-----------------");
        const setInput = new Set(numberInput);
        return setInput.size !== this.user.length;
    }


   
questionFinish() {
        Console.print("questionFinish()-------------------");
        Console.readLine(MESSAGE.FINISHQUESTION, (finishInput) => {
            if (this.restartGame(finishInput)) {
                return this.gameStart();
            }
            if (this.finishGame(finishInput)) {
                return Console.close();
            }
            throw new Error(MESSAGE.ERROR);
        });
    }

    restartGame(finishInput) {
        Console.print("restartGame()-------------------");
        return finishInput === "1";
    }
    finishGame(finishInput) {
        Console.print("finishGame()-------------------");
        return finishInput === "2";
    }

 

깃 reset으로 커밋 특정 지점으로 되돌리기

1. 커밋 히스토리를 확인하기
$git log

2. 되돌아가고 싶은 지점의 커밋 해쉬 복사하기
398aed09

3. 해당 지점으로 되돌리기
$git reset --hard 398aed09

4. 깃을 현재 상태로 덮어씌우기
$git push origin --force

주의사항 : 절대 못 되돌리며, 협업 시에는 다른 협업자의 로컬 커밋과 충돌이 발생할 수 있으므로 반드시 협의 후에 결정할 것

 

깃 브랜치 클론

 

커밋컨벤션 직접 써 본 것만 정리

앞으로는 이렇게! <type>(<scope>): <subject>(<#issue number>)

이름 의미 예시
feat 새로운 기능 추가 feat: SF_1 게임 시작 시 메시지 출력
style 코드 포맷, 세미 콜론 누락, 코드 수정이 없는 경우 style: README 스타일 수정 __ 대신 ``로 강조
docs 문서 수정 관련 docs: README 구현 기능 목록 작성
rename 파일 혹은 폴더명을 수정하거나 옮기는 작업만인 경우 rename: constant 폴더 생성하고 그 안에 message.js 파일 이동
refactor 코드 리팩토링 refactor: Computer 클래스 모듈화

 

재사용성 높이기


    hasZero(userInput) {
        return userInput.includes("0");
    }

    hasSameNumber(userInput) {
        const setInput = new Set(userInput);
        return setInput.size !== userInput.length;
    }

 

하나의 메서드는 하나의 기능만 수행하기

(const ... ; return ...;) 형태로 마무리되는 모양이 가장 이상적인 것 같습니다.

개인적으로는 아래와 같이 true false를 반환하는 형태를 조건문에 넣는 형태가 가장 이해하기 쉽고 명확한 형태라 느껴집니다.

외부의 데이터를 변환하지 않고 오로지 해당 함수에서 스스로의 역할은 완전히 끝나기 때문에 에러를 발생시킬 일이 적고, 에러가 발생할다 하더라도 대부분 해당 함수만을 수정하면 해결되는 형태인 것 같습니다.


    checkValidInput(userInput) {
        if (this.hasZero(userInput) || this.hasSameNumber(userInput)) {
            throw new Error(NOTICE.ERROR);
        }
        return true;
    }

 

클래스 모듈화 (올바른 개념인지 확실하지 않음)

하나의 파일에서 수행하는 기능들을 computer, user, hint라는 class를 생성하고 기능들을 수행할 책임을 분산합니다.

이렇게 하면 각각의 클래스에서 어떤 함수의 기능이

무엇을 위한 것인지, 무엇에 영향을 미치는지 더 쉽게 알 수 있습니다.


class App {
    constructor() {
        this.computer = new Computer();
        this.user = new User();
        this.hint = new Hint();
    }

class Computer {
    constructor() {
        this.number = [];
    }

    setRandomNumber() {
        this.number = [];
        while (this.number.length < OPTION.PITCH_COUNT) {
            const number = Random.pickNumberInRange(1, 9);
            if (!this.number.includes(number)) {
                this.number.push(number);
            }
        }
        return this.number;
    }
}

module.exports = Computer;

---

class App {
    constructor() {
        this.computer = new Computer();
        this.user = new User();
        this.hint = new Hint();
    }

    gameStart() {
        this.computer.setRandomNumber();
    }

 

궁금한 점... constructor에서 생성한 객체 속성을 이용해도 되는가...?

const { strikeCount, ballCount } = this.hint.judgePitching(this.computer.number, this.user.number);


   
constructor() {
        this.computer = new Computer();
        this.user = new User();
        this.hint = new Hint();
    }

-----------------------------------

    pitching() {
        Console.readLine(NOTICE.NUMBER_QUESTION, (userInput) => {
            this.user.setNumberArray(userInput);
            const { strikeCount, ballCount } = this.hint.judgePitching(this.computer.number, this.user.number);

            this.printResult(strikeCount, ballCount);
        });
    }