middlemoon
[우아한테크코스 프리코스]2주차를 마무리하면서 본문
1주에 대한 온보딩 기간을 마치고, 2주차에 접어들면서 문제여러개의 구현이 아닌, 하나의 프로젝트 처럼 만들어야하는
과정의 기준을 맞추게 되었다.
우아한테크코스에서는 개인별 피드백이 아닌, 공통 피드백으로 향후 방향성을 제시해주곤 하는데, 구현을 하는 것도 중요하지만
피드백에 대한 내용들을 파악하고 만들어내는 기능도 중요하다 생각했다. 전에는 한 메서드안에 모든 기능들을 하게 만들고 유지보수 처리하고 하는것이 다 인줄 알았지만, 생각보다 조건도 까다로웠고 많은 것들을 배울수 있는 시간들이었던 것 같다.
요구사항
해결과정
1) 게임 시작의 메세지를 알리는 문구들을 InputView Class안에 담아주어 각 메소드의 역할만 하도록 도왔다.
물론 OutputView Class에 담는것도 클래스역할에 적절하다 판단이 들었지만, 아직 리펙토링 전이라 클래스의 기능에 따라
역할을 할수 있도록 기준을 맞춰준다
package baseball;
import java.util.List;
import static camp.nextstep.edu.missionutils.Console.readLine;
public class Inputview {
public void startMessage(){
System.out.println("숫자 야구 게임을 시작합니다.");
}
public void startInputMessage(){
System.out.print("숫자를 입력해주세요 : ");
}
public void allCorretMessage(){
System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료");
}
public void restartMessage(){
System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.");
}
public String numberInputGame(){
Validator validator = new Validator();
String result = readLine();
validator.ValidatorAllList(result);
return result;
}
public String restartGame(){
return readLine();
}
}
numberInputGame() 메서드를 통해 예외사항을 처리할수 있도록 객체를 생성하도록 만들어주었다.
2)예외사항 처리부분이다. Validator로 통일시킨 모습이다.
package baseball;
public class Validator {
public void ValidatorAllList(String number){
ValidatorRangeNumber(number);
ValidatorNotEmpty(number);
ValidatorOnlyNumber(number);
}
public void ValidatorRangeNumber(String number){
if(number.length() != 3 ) {
throw new IllegalArgumentException("3자리의 숫자만 입력 가능합니다.");
}
}
public void ValidatorNotEmpty(String number){
for(int i = 0; i < number.length(); i++){
if(number.charAt(i) == ' '){
throw new IllegalArgumentException("공백은 들어올 수 없습니다");
}
}
}
public void ValidatorOnlyNumber(String number){
for(int i = 0; i < number.length(); i++){
if(number.length() == 0){
throw new IllegalArgumentException("0은 들어올 수 없습니다.");
}
}
}
}
public String Judgement(List<Integer> computer, List<Integer> player){
Judgement judgement = new Judgement();
// 몇 개의 숫자가 같은지 알아낸 뒤
int correctCount = judgement.correctCount(computer, player);
// 스트라이크의 개수를 구해 뺀다.
int strike = 0;
for(int index = 0; index < player.size(); index++){
if(judgement.hasPlace(computer, index, player.get(index) )){
strike++;
}
}
index 0 | index 1 | index 2 |
index 0부터 시작 computer(임의의 값) // player.get(index) 마찬가지로 index를 동시에 돌면서 player만 돌수 있도록 만들어준다.
Judgement의 함수는 이런 역할을 통해 스트라이크 카운터 수를 높히는 역할을 하게 된다.
package baseball;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class Application {
public static void judgementMethod(Inputview inputview, Referee referee) {
Computer computer = new Computer();
List<Integer> computerRandom = computer.NumberGenerator();
System.out.println(computerRandom.get(0));
System.out.println(computerRandom.get(1));
System.out.println(computerRandom.get(2));
String result = "";
while (true) {
List<Integer> numbers = new ArrayList<>();
inputview.startMessage(); // 숫자야구게임을 시작합니다
inputview.startInputMessage();
String gameNumber = inputview.numberInputGame();
for (String number : gameNumber.split("")) {
numbers.add(Integer.valueOf(number));
}
result = referee.Judgement(computerRandom, numbers);
if (result.equals("0볼 3스트라이크")){
result = "3스트라이크";
}
System.out.println(result);
if (result.equals("3스트라이크")) {
System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료");
break;
}
}
}
public static void main(String[] args) {
// TODO: 프로그램 구현
// Computer computer = new Computer();
// List<Integer> computerRandom = computer.NumberGenerator(); //135
// System.out.println(computerRandom.get(0));
// System.out.println(computerRandom.get(1));
// System.out.println(computerRandom.get(2));
Judgement judgement = new Judgement();
Inputview inputview = new Inputview();
Referee referee = new Referee();
judgementMethod(inputview, referee);
inputview.allCorretMessage();
inputview.restartMessage();
String re = inputview.restartGame();
if (Integer.parseInt(re) == 1) {
judgementMethod(inputview, referee);
}
if (Integer.parseInt(re) == 2){
}
}
2주차 회고
2주차에서는 클래스 마다 영역을 나누고 그에 해당하는 메서드들을 알맞게 분리하는 작업에 초점을 두었다.
추가된 요구사항 인덴트 들여쓰기의 초과 기준, 3항 연산자 금지, 한가지 메서드의 작은일을 할수 있도록 하게 하는것
물론 이 부분의 초점을 두고 짜다보면 테스트 코드를 작성하거나, 객체 지향 프로그래밍을 수월하게 짤 수 있지 않을까?
라는 생각이 들곤 했다.
혹시 한 메서드 안에 여러개의 역할을 하지 않았는지 확인해보고 기존의 테스트 코드가 아닌 추가된 테스트 코드를 어떻게 하면 잘 짤수 있을지에 대한 생각이 들었다.
이번 2주차에서도 지켜야할 사항과 구현하는 Application 부분에서 테스트 코드를 통과하는데
main 메소드를 분리하고 짠 뒤, 입력사항 예시와 같이 게임이 다시시작할때 메세지가 다시 뜰 수 있도록 하는 부분에서 많은 고민을 하고 동료 분과 함께 페어 프로그래밍을 진행하여 새로운 개념도 학습한 시간이 되었다.
요즘은 TDD에 대한 고민을 많이 하고 있는데 마침 좋은 블로그가 있어 참고용으로 올리면 좋을것 같아 공유한다.
https://mangkyu.tistory.com/182
[TDD] 단위 테스트와 TDD(테스트 주도 개발) 프로그래밍 방법 소개 - (1/5)
이번에는 여러 개발 서적들 및 실무 경험 그리고 시행 착오 등을 겪으면서 얻은 테스트 주도 개발 방법에 대해 소개해보고자 합니다. 이번 포스팅에서는 먼저 단위 테스트와 중요성 그리고 단위
mangkyu.tistory.com
'우테코' 카테고리의 다른 글
[우아한테크코스 프리코스]4주차를 마무리하면서 (0) | 2022.12.14 |
---|---|
[우아한테크코스 프리코스]3주차를 마무리하면서 (0) | 2022.12.10 |
[우아한테크코스 프리코스]1주차를 마무리하면서 (0) | 2022.11.30 |