확실히 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 메서드가 있어서 흠.. 다른 곳에서도 접근 가능성이 열려있는데 이게 맞는지 참 고민된다.
- 좀 더 고민해보자!
반응형
'대외활동 > [미션] 우아한테크코스 프리코스 | Java' 카테고리의 다른 글
[우아한테크코스 5기 백엔드] 지원 및 최종테스트 후기 (6) | 2022.12.29 |
---|---|
[우아한테크코스] 객체를 객체스럽게 사용하도록 리팩토링해라. (0) | 2022.11.26 |
[우아한테크코스] 프리코스 4주차 : 다리 건너기 (bridge) (0) | 2022.11.19 |
[우아한테크코스] 프리코스 3주차 : 로또 (lotto) (0) | 2022.11.13 |
댓글