12.17 TIL

천영석·2020년 12월 17일
post-thumbnail

블랙잭 너무 우습게 봤다.

어제까지만 해도 블랙잭 게임은 어렵지 않다고 생각했었다. 하지만 기능 사항을 제대로 보지 않아서 쉬워 보였던 것이었고, 딜러가 21을 초과하면 바로 딜러의 패배, 첫 두 장을 받았을 때 플레이어가 블랙잭인 경우 플레이어의 승리(딜러도 블랙잭이면 무승부)와 같은 기능을 요구하고 있었다.

이 부분을 구현하는 것이 어려웠는데, 솔직히 어렵다기보다는 혼란에 휩싸였다.

메소드 분리

오늘은 나의 무능력함을 느낄 수 있는 하루였다. 함수의 길이를 10 이상 넘지 않기 위해서는 함수를 분리하는 과정이 반드시 필요한데, 아직도 class에서 메소드를 분리하는 방법을 모르겠다.

class에 선언한 메소드는 프로토타입 메소드이기 때문에 인스턴스에 전달되지 않고 프로토타입 체인을 통해 인스턴스가 부모의 메소드를 자신의 것처럼 사용할 수 있다고 알고 있다.
이것때문에 계속 혼란이 생기고 있다. 그렇다면 인스턴스가 굳이 사용할 필요가 없는 메소드를 class안에 선언할 필요가 있을까?

예를 들면

class Baseball {
  constructor() {
    this.answerNumbers = [];
  }

  createAnswerNumbers() {
    const answerNumbers = [];
    const allNumbers = this.getAllNumbers(9);

    while (answerNumbers.length < 4) {
      const randomIndex = Math.floor(Math.random() * allNumbers.length);
      const pickedNumber = allNumbers.splice(randomIndex, 1);
      answerNumbers.push(...pickedNumber);
    }

    return (this.answerNumbers = answerNumbers);
  }

  getAllNumbers(length) {
    const allNumbers = Array(length)
      .fill()
      .map((_, i) => i + 1);

    return allNumbers;
  }
}

이런 코드가 있을 때, 인스턴스는 getAllNumbers메소드를 알 필요도 없고, 호출할 수도 없어야 한다고 생각한다. 왜냐하면 단지 createAnswerNumbers에서 필요한 모든 숫자들을 반환하는 메소드이기 때문이다.
하지만 함수의 길이를 짧게 하기 위해서는 꼭 분리를 해야 하는데, 그렇다면 어떻게 인스턴스는 모르게 할 수 있을까?
이걸 고민하다가 오늘 하루가 다 지나갔다.

난 지금까지는 getAllNumbers와 같은 메소드는 class에 있으면 안된다고 생각해서 class의 바깥에 만들었었다. 하지만 가독성 면에서도 좋지 않고, 이유는 모르겠지만 이건 아닌 것 같다는 생각을 하게 되었고, 다른 사람들은 어떻게 하는지 또는 방법을 찾기 위해 노력하고 있다.

아니면 인스턴스가 알아도 상관 없는 것일까? 캡슐화, 은닉화.. 이런 개념들이 존재하는데 정확하게 모르고, 여기에서 쓰이는 것인지도 잘 모르겠다.

자바스크립트에 대한 개념과 CS 개념 자체가 많이 부족하다는 것을 깨닫게 되는 하루였다.
나만 모르는 것 같아서 너무 속상하다.

profile
느려도 꾸준히 발전하려고 노력하는 사람입니다.

0개의 댓글