이번에도 게임의 로직 자체는 간단했다.
이번에는 전체 코드를 보여주는 식은 별로 안좋은 것 같아서
나중에 추가 학습이 필요한 부분만 짚어보자
소프트웨어 시스템은 애플리케이션 객체를 제작하고 의존성을 서로 연결하는 준비과정과 준비과정 이후에 이어지는 런타임 로직을 분리해야 한다.
Clean Code - Robert C. Martin
이리 저리 찾다보니 이런 글을 찾게 되었다.
시스템 제작과 사용의 분리하라는 말 같은데..
이 게임의 메인인 Application에서 사용될 객체를 생성하고,
객체 간의 의존 관계를 설정하고,
런타임 로직을 실행한다.
InputView.java
public List<String> inputCarName() {
List<String> carNameList = new ArrayList<>();
System.out.println(INPUT_CARS_NAME_MESSAGE);
String carNameString = scanner.nextLine();
StringTokenizer stringTokenizer = new StringTokenizer(carNameString, TOKENIZER_DELIM);
while (stringTokenizer.hasMoreTokens()) {
carNameList.add(stringTokenizer.nextToken());
}
return carNameList.
stream()
.filter(Validator::validationInputName)
.map(String::trim)
.collect(Collectors.toList());
}
사용할 Car의 이름을 입력 받는 것은 사전 준비 로직인지,
런타임 로직인지 분간이 가지 않았다.
이 값은 검증도 거치고, 이 후 Cars 객체로 넘어가며 로직을 진행하는 등 단순히 사전준비라고 보기엔 너무 많은 역할을 할 데이터 인 것 같았다..
Car.java
private static int maxPosition = 0;
Cars.java
public List<String> getWinnerList() {
return cars.stream()
.filter(Car::isWinner)
.map(Car::getName)
.collect(Collectors.toList());
}
우승자를 가리기 위한 함수로 static 변수로 maxPosion을 둬서 확인을 했는데..
아직 개념이 약한 것이 느껴진다.
일급 컬렉션에서 변경과 재할당이 없으면 원본 값에 접근해도 괜찮은 것인가..?
일급 컬렉션 복습 . . . ..
Cars.java
private String[] getData(String name, int position) {
return new String[]{name, intToHyphen(position)};
}
게임의 결과를 출력하기 위해 Car의 getter로 데이터를 넘겨주는데,
Cars 클래스 밖으로 Car의 데이터를 직접 꺼내는 것은 아무래도 껄끄럽고 일급 컬렉션으로 감싼 의미가 없는 것 같아, getData() 를 만들어 String[] 타입으로 변환 시켜줬다.
그런데 이건 그냥 DTO 이긴한데...
오로지 이 한 부분을 대체하기 위해 DTO를 짜는게 배보다 배꼽이 큰게 아닌가 싶기도 하면서..
내가 귀찮아서 변명을 하는건지 ㅠ
GameController.java
public void play() {
Cars cars = new Cars(inputView.inputCarName());
int gameStepCount = Integer.parseInt(inputView.inputGameStepCount());
OutputView.printGameMessage();
while (gameStepCount > 0) {
List<String[]> carData = cars.nextGameStep();
OutputView.printGameStep(carData);
gameStepCount--;
}
List<String> winnerList = cars.getWinnerList();
OutputView.printGameWinner(winnerList);
}
게임의 진행횟수를 진행할때마다 숫자를 체크하며 진행하고 있었다.
근데 저 0도 하드코딩인가 라는 생각이 들었다.
뭐 이래저래 생각을 했는데 막상 찾아보니 하드코딩이 맞다 ! 제거하장 ㅎㅎ
그런데 어떻게 제거를 하느냐 인데,
체크 함수를 만들어 boolean으로 리턴을 줄지,
아니면 똑같은 식이지만 0만 상수화를 시켜줄지.. 이것을 좀 찾아봐야겠다.
어떤 선배님의 코드를 보았는데,, 현직 개발자가 아닌가 싶을 정도로 엄청나 보였다..
그 분을 본 받아야할 거같다.
그런데 요구사항에 없는 검증을 빽뺵하게 해놓으셨는데,
아무래도 요구사항에 없는 검증이 필요한가 싶기도 하다.
물론 검증은 빡세게 할수록 좋은 거긴한데....
유연한 입력이 의도였을 수도 있는거 아닌가????
또 느낀게 참 네이밍이 어렵다 ㅠㅠ..
영어도 어렵고..... 뭐 .. 이거 참..
다른 분들이 어떤 네이밍을 쓰는지 많이 봐야될거 같다.
하 . 계속 커밋을 잊고 무아지경으로 코드만 치고있다.
기능 별 커밋을 해야한다 !!!!!
근데 커밋 하는것도 참 어렵다...
커밋 메세지도 선배님들의 것을 보면서 감을 잡아야 할듯 ㅠ