프리코스 2주 차를 마치고 후기를 작성하려고 한다.
이번과제는 자동차경주게임이었다. 기능구현은 크게 어렵지는 않았다.
대신 2주 차 피드백인 함수의 분리와 함수별로 테스트를 작성하는 것에 시간을 들였다.
공통 피드백을 확인하면서 내가 만든 코드들을 살펴보겠다.
공통 피드백
1. 기능 목록을 재검토한다 , 기능 목록을 업데이트한다.
기능 목록을 클래스를 설계하면서 기능목록과는 다르게 계속 변경되었기 때문에 이번엔 세세한 기능을 적는다기보단
전체적인 기능목록만 작성했다. 특티 그냥 기능목록이 아니라 예외가 발생했을 때 기능목록도 추가로 적어서 작성했다.
그리고 피드백내용대로 예외상황은 추가는 언제든 발생할 수 있기 때문에 기능을 구현하면서 계속 docs를 수정하며 작업을 했다.
2. 한 함수가 한가지 기능만 담당하게 한다.
최대한 함수하나당 하나의 기능을 담당하게 작은 기능들을 전부 함수를 나눠서 기능을 구현했다.
예를 들어 Winner라는 승자를 구별하는 객체에서는 가장 큰 스코어를 찾아 우승자를 선택하는 객체에서 여러 메서드를 나눠서 만들었다.
public static String findWinners(Map<CarName, Integer> map) {
int maxScore = findMaxScore(map);
List<CarName> winningCarNames = findWinningCarNames(map, maxScore);
return buildWinnersString(winningCarNames);
}
//Map을 순환하여 가장큰 스코어를 찾는 함수
public static int findMaxScore(Map<CarName, Integer> map) {
int maxScore = 0;
for (Integer score : map.values()) {
maxScore = Math.max(maxScore, score);
}
return maxScore;
}
//가장큰 스코어를 찾아 키값을 리스트에 저장하는 함수
public static List<CarName> findWinningCarNames(Map<CarName, Integer> map, int maxScore) {
List<CarName> winningCarNames = new ArrayList<>();
for (Map.Entry<CarName, Integer> entry : map.entrySet()) {
if (entry.getValue() == maxScore) {
winningCarNames.add(entry.getKey());
}
}
return winningCarNames;
}
//리스트를 반복문돌려 2번째 우승자부터 , 찍어서 append해주는 함수
public static String buildWinnersString(List<CarName> winningCarNames) {
StringBuilder winners = new StringBuilder();
for (int i = 0; i < winningCarNames.size(); i++) {
if (i > 0) {
winners.append(", ");
}
winners.append(winningCarNames.get(i));
}
return winners.toString();
}
3. 처음부터 큰 단위의 테스트를 만들지 않는다.
시작부터 큰 단위의 테스트를 만들게 된다면 작성한 코드에 대한 피드백을 받기까지 많은 시간이 걸린다고 한다.
그래서 문제를 작게 나누고 그중 핵심 기능에 가까운 부분부터 작게 테스트를 만들었다.
나같은 경우는 우승자를 찾는 거부터 가장 큰 스코어 찾기 우승자가 다수일 경우 테스트를 진행했다.
@Test
void 우승자_테스트() {
String name1 = "inho";
String name2 = "ru";
List<CarName> carNames = new ArrayList<>();
carNames.add(new CarName(name1));
carNames.add(new CarName(name2));
assertThat(Winner.buildWinnersString(carNames))
.contains("inho, ru");
}
@Test
void 가장큰_스코어_찾기() {
// given
String name1 = "inho";
String name2 = "se";
String name3 = "agg";
HashMap<CarName, Integer> carMap = new HashMap<>();
carMap.put(new CarName(name1), 5);
carMap.put(new CarName(name2), 1);
carMap.put(new CarName(name3), 3);
// when
int maxScore = Winner.findMaxScore(carMap);
// then
assertEquals(5, maxScore);
}
@Test
void 우승자_리스트_테스트() {
// given
String name1 = "inho";
String name2 = "se";
String name3 = "agg";
HashMap<CarName, Integer> carMap = new HashMap<>();
carMap.put(new CarName(name1), 5);
carMap.put(new CarName(name2), 1);
carMap.put(new CarName(name3), 3);
int maxScore = 5;
// when
List<CarName> winningCarNames = Winner.findWinningCarNames(carMap, maxScore);
// then
assertThat(winningCarNames.contains("inho"));
}
}
느낀 점
이번 미션은 함수를 분리하는 작업을 집중적으로 구현했다. 그래서 그런지 클래스가 여러 개가 되고 그 클래스 안에 여러 개의 함수가 만들어졌다. 이렇게 하니깐 함수하나의 하나의 기능들이 있다 보니 이 함수가 어떤 기능을 하는지 가독성이 높아졌고
함수 하나하나가 독립적으로 사용하다 보니 재사용하기가 무척이나 쉬워졌다.
그리고 함수마다 기능하나이니 단위테스트도 함수마다 작은 단위로 테스트하기 수월해졌다. 이래서 함수를 분리와
작은 단위테스트를 연습하라고 했던 거였구나 생각이 든다 두 개가 관련성이 있기 때문에 이런 과제를 내어주신 거 같다.
정말 감탄스럽다. 다음 미션은 또 어떤 미션이 나올지 굉장히 기대가 된다.
https://github.com/inhoru/java-racingcar-6/tree/inhoru
GitHub - inhoru/java-racingcar-6: 자동차 경주
자동차 경주. Contribute to inhoru/java-racingcar-6 development by creating an account on GitHub.
github.com
'우테코' 카테고리의 다른 글
우아한테크코스 프리코스 4주차 후기 (0) | 2023.11.27 |
---|---|
우아한테크코스 프리코스 3주차 후기 (0) | 2023.11.11 |
우아한테크코스 프리코스 1주차 후기 (0) | 2023.10.28 |