1주 차의 미션은 숫자 야구 미션이었습니다.
문제 해결은 TDD방식과 MVC패턴으로 코드를 구조화하며
기능 요구사항을 해결해 나갔습니다.
이번 미션을 진행하면서
중요하게 생각한 것, 가장 많이 고민한 부분을 공유하고
동기들과의 리뷰 활동을 통해 느낀 점을 적으며 회고록을 남기려고 합니다.
미션을 어떻게 진행했나
TDD, MVC 패턴 적용하자
과제 진행 요구 사항은 다음과 같습니다.
기능을 구현하기 전 docs/README.md에 구현할 기능 목록을 정리해 추가한다.
기능 구현 목록을 먼저 작성하기 때문에,
기능에 무엇이 필요할지 고민해 보고
작은 단위의 코드부터 작성해 나갈 수 있도록 도와주는 의도를 가진 것 같다고 생각했습니다.
그래서 이번 미션은 MVC 패턴 재 공부하여,
TDD의 요구사항 구현 및 빠른 피드백으로 MVC 패턴을 적용해 나가며
각 역할을 수행하는 코드를 작성했습니다.
그 고민하는 과정에서 TDD로 인한 피드백들은
코드의 안정성과 자신감을 주었고, 클래스 분리를 명확히 하도록 도와주었던 것 같습니다.
테스트하기 어려운 영역 분리하자
작은 단위부터 시작하니 외부 파라미터로 구분하여 테스트할 수 있는 코드가 증가했습니다.
테스트하고자 하는 영역이 어렵다는 생각이 들 때,
그 영역을 보고 판단하는 부분을 테스트하기 위해 외부 파라미터로 넘겨주는 것으로 구현해 나갔습니다.
그 결과 테스트 어려운 영역을 구분하고 테스트를 진행할 수 있었고,
안정성과 클래스 분리를 잘 분리했던 것 같습니다.
가장 많이 고민한 부분
setter 없이 코딩을 진행하고 싶지만, 컴퓨터의 숫자를 변경할 때 사용하고야 말았습니다.
나는 TDD로 기능 요구사항을 순차적으로 해결해 나갔고,
그 과정에서 컨트롤러가 게임을 진행하는 기능을 문제없이 구현해 나갔습니다.
하지만, 추가 요구사항(플레이어는 게임을 새로 시작할 수 있다.)을 적용할 때 문제가 생겼습니다.
게임이 다시 시작될 때 새로운 Computer 객체를 생성해야 새로운 랜덤 한 숫자를 가질 것입니다.
여기서 컴퓨터 객체 생성은
게임 엔진(main)의 코드에서 반복 처리해야 할까?
컨트롤러에서 반복을 해야 할까?
게임 엔진의 반복 처리는 게임 재시작을 위한 메서드를 추가해야 했고,
컨트롤러에서 반복을 진행하니 이중 while 문이 완성되어 테스트하기가 어려움을 가졌습니다.
결론은 둘 다 이중 while 문 형태(게임 숫자 재생성, 플레이어 반복 입력)가 되어,
어떻게 처리해야 바람직한 코드인지 결론짓지 못했습니다.
나는 오랜 고민 끝에 이중 와일 문을 처리하기 위해 setter를 사용하고야 말았습니다.
그래서 제출 코드는 gamestart() -> while 문 1개(플레이어 상태), setter를 사용하기로 했습니다.
동기들과의 리뷰 활동
- 이중 와일문을 처리하기 위해 setter를 사용하는 것이 필연적일 것 같습니다.
제 고민을 해결하기 위해 많은 리뷰 활동을 진행했지만,
이중 와일문을 진행하신 분들 중 테스트코드를 작성하신 분을 찾지 못했습니다.
둘 중 어느 것이 더 바람직한 코드인지는 결론짓지 못했지만, 테스트코드를 작성하기 위해
이중 와일문을 사용하지 않고 수행할 때 setter로 상태를 변경하는 것이 필연적일 것 같다는 의견을 받았습니다.
- 메서드 검증을 일관되게 사용하시면 조금 더 좋을 것 같습니다.
유저가 세 자리 입력 시(넘버)
생성자와 함께 객체 생성 시 검증 함수를 실행시켜 객체에게 책임을 주는 메서드를 구현하였지만
재시작 입력은 inputview에서 검증을 진행해
메서드 검증을 일관되게 사용하면 좋을 것 같다는 의견이었습니다.
- 상수를 하드코딩 하지 않고 Enum을 사용하는 것이 어떨까요?
상수를 하드코딩하지 않고 작성하려고 했지만, 기능을 구현하는 과정에서 매직넘버가 사용되는 부분이 생겼습니다.
이 과정을 방지하기 위해 Enum을 사용하여 관리한다면 더 좋은 코드를 작성할 수 있을 것 같습니다.
- 람다식을 이용해 depth를 더 줄일 수 있을 것 같습니다!
람다식을 이용하여 depth를 줄이고 간략하게 표현해 보는 것에 대해 리뷰를 받았습니다.
- Computer 객체를 단순히 값을 저장하여 사용하기보다 객체에게 책임과 역할을 분리해 비즈니스로직을 갖게 하는 게 어떨까요?!
컴퓨터는 입력한 숫자에 대한 결과를 출력한다.라는 기능 요구사항과 같이,
컴퓨터에 비즈니스 로직(주도자 역할?)이 있도록 역할을 부여하는 방법을 통한 방법을 제시받았고,
getter를 지양해야 하는 이유에 대한 토론 또한 공유받았다.
그 이유는 크게,
getter를 사용하려면 그 코드를 이해하기 위해서 여러 가지 세부적인 내용들도 알아야 하고
변경에 취약한 코드가 될 수 있다는 점이었다.
정리
1주 차 리뷰활동 과 1주차 우테코의 피드백을 통해 많은 것을 배웠고,
리뷰활동에서 record클래스를 다루는 코드들을 많이 보았다.
2주 차 미션에서도 요구사항과 피드백반영이 되도록 노력해야 할 것 같다.
1주 차 미션 pr 주소는 여기서 볼 수 있습니다. :)
https://github.com/woowacourse-precourse/java-baseball-6/pull/1516
'우아한 테크코스' 카테고리의 다른 글
[우테코] 프리코스 4주차 '크리스마스 프로모션' 미션 회고록 (0) | 2023.11.18 |
---|---|
[우테코] 프리코스 3주차 '로또' 미션 회고록 (0) | 2023.11.12 |
[우테코] 프리코스 2주차 '자동차 경주' 미션 회고록 (0) | 2023.11.06 |
[우테코] 우아한테크코스 지원 [+2024 입학 설명회] (2) | 2023.10.19 |