본문 바로가기
대외활동/[미션] 우아한테크코스 프리코스 | Java

[우아한테크코스] 숫자 야구(baseball) 리팩토링

by HelloJudy 2022. 11. 28.

확실히 4주 프리코스 뒤 다시 2주 차 미션을 보니

더 좋은 방식으로 구현할 수 있을것 같다.

 

그렇다는 건 내가 발전하고 있다는 시그널🌟

 


📌 리팩토링할 미션

 

[우아한테크코스] 프리코스 2주차 : 숫자 야구(baseball)


1. 리팩토링 필요한 부분 분석

 

📂 기존 폴더 구조

├─main
│  └─java
│      └─baseball
│          │  Application.java
│          │
│          ├─controller
│          │      BaseBallGame.java
│          │
│          ├─domain
│          │      GameLogic.java
│          │      RandomNumbers.java
│          │
│          ├─validator
│          │      NumbersValidator.java
│          │      NumberValidator.java
│          │
│          └─view
│                  InputView.java
│                  OutputView.java

 

 

✔️ View

  • InputView는 입력을 받는 곳인데 지나치게 로직이 많이 있다.
  • 그리고 한 메서드 안에 여러 기능이 들어있다. 검증부터 전처리까지. 분리해야된다.

 

✔️ Controller

  • 지금은 컴퓨터 숫자(정답)와 플레이어 숫자를 각자 다르게 담고 있다.
  • 3자리 숫자라는 공통점이 있는데 객체를 하나 만들 수 있을것 같다.

 

  • 현재 게임 로직이라는 객체에서 비교와 결과 저장 모두 하고 있다.
  • 그렇다면 게임 로직이 가지고 있는 특성은 어떤걸까. 혼자 너무 많은 일을 하는 것 같다.

 

 

✔️ GameLogic

  • 결과를 String으로 만들어서 저장하고 있다.
  • 뭔가 좀 더 raw하게 데이터를 가지고 있고 String으로 출력하는건 OutputView에서 해줘도 될 것 같다.

 

 

✔️ RandomNumbers

  • numbers를 가지고 있는 객체인데 getter로 객체 밖으로 꺼내는건 좋아보이지 않는다.

 

 

스스로 코드 리뷰 끝!

 

 


2. 리팩토링

 

📂 수정한 폴더 구조

├─main
│  └─java
│      └─baseball
│          │  Application.java
│          │
│          ├─controller
│          │      BaseBallGame.java
│          │
│          ├─domain
│          │      GameResult.java
│          │      GenerateNumbersImple.java
│          │      GenerateRandomNumbers.java
│          │      Numbers.java
│          │
│          ├─validator
│          │      CommandValidator.java
│          │      NumbersValidator.java
│          │
│          └─view
│                  InputView.java
│                  OutputView.java

 

 

✔️ Numbers

  • 3개의 숫자 야구 번호를 가지고 있는 객체
  • 현재 게임에서는 입력으로 받는 번호와 자동으로 생성한 번호가 있다.

 

  • 두 번호 모두 Numbers 객체에 상태를 저장해줬다. 생성 방법이 달라 생성자를 두 가지로 해줬다.
  • 생성자는 객체를 생성해주는 것이 아니라 인스턴스 변수를 초기화 시켜주는 역할이다.
  • 그래서 컴퓨터 숫자는 랜덤 숫자를 만들어서 초기화 시키고, 유저가 입력한 숫자는 검증과 전처리를 거쳐서 초기화 시켰다.

 

 

✔️ Numbers : 숫자를 이용한 로직

  • 객체 밖으로 값을 꺼내지 않고 값 내부에 메세지를 보내 결과를 얻을 수 있도록 리팩토링했다.

 

 

✔️ GameResult

  • ballCount와 strikeCount. 즉 결과를 가지고 있는 객체를 따로 만들어주었다.

 

  • 기존 코드에서는 Controller에서 받은 결과를 바탕으로 3스타라이크일 때 게임을 종료했다.
  • 지금은 결과를 꺼내지 않고 Result 객체에 성공했는지 묻고 성공 여부만 알 수 있도록 구현했다.
  • 외부에서는 어떤 로직으로 성공했는지 알 필요없다. 은닉화!

 

 

✔️ GenerateRandomNumbers : 랜덤한 숫자를 만드는 객체

  • 인터페이스를 정의해주고

 

  • 구현체로 오버라이딩해서 구현했다.
  • 숫자를 만드는게 랜덤한 숫자일수도 유저가 입력한 번호일수도 있다. 구현체는 언제나 변경될 수 있다.

 


객체를 객체스럽게 리팩토링하기 위해서 노력했다.

객체에 대해서 처음엔 잘 이해가 안됐는데

책을 읽으면서 코드를 고쳐나가니 감이 조금씩 잡힌다.

 


+ 추가 리팩토링

 

✔️ GameResult

  • 게임 결과를 저장하는 객체를 Controller단에서 꺼내서 출력을 위해 View로 넘기지 않기 위해서 다음과 같이 Result 내부에서 OutputView를 넘겨줬다.
  • 하지만 도메인 내부에서 View로직을 부르는게 다소 부자연스러워보였고 고민했다.
  • 그리고 getter를 사용하되 Controller에서 바로 꺼내지 않는 방법을 선택했다.

 

  • 그래서 showResult 대신 getter로 코드를 바꿔주고

 

  • View에 결과를 저장한 객체 자체를 넘겨주고 결과를 출력하는 메서드에서 getter로 데이터를 꺼내면 되겠다는 생각을 했다.

  • 하지만 public으로 getter 메서드가 있어서 흠.. 다른 곳에서도 접근 가능성이 열려있는데 이게 맞는지 참 고민된다.
  • 좀 더 고민해보자!
반응형

댓글