1. 초간단 자동차 경주 게임
- Github 기반으로 온라인 코드 리뷰하는 경험
- JUnit 사용법을 익혀 단위 테스트하는 경험
- 자바 code convention을 지키면서 프로그래밍하는 경험
- 메소드를 분리하는 리팩토링 경험
자동차 경주게임 모두 진행하고 나서 작성하는 후기다
이 교육의 좋은 점은 처음부터 끝까지 미션마다 리뷰어가 배정된다는 점!
미션마다 다른 리뷰어가 배정되어 리뷰어마다 서로 다른 생각과 경험을 배우는게 좋다.
step1, 학습 테스트 실습
첫시작은 간단히 Github, JUnit 등 사용방법으로 시작했다
이전까지는 단순히 혼자 공부하면서 Github 에 커밋과 푸쉬하는 것만 몰랐는데
기본적으로 깃허브 사용방법 가이드를 제공하면서 많은 도움을 받았다.
말그대로 학습 테스트 실습으로 기본적인 부분으로 시작하고
사용방법만 학습하면 다음 단계로 넘어가는 수준.
그렇지만 리뷰어가 제대로 사용했는지 보완해야할지 꼼꼼하게 체크해줘서 좋았다.
step2, 문자열 계산기
본격적으로 시작되는 문자열 계산기다.
처음엔 문자열 계산기를 하면서 +, -, *, / 를 구분하기위해 switch를 사용하고,
이전 개발방식으로 하나의 메소드에 많은 로직을 때러넣었다는 사실...🙈
요구사항대로 문자열 계산기가 돌아가긴했다. 말 그대로 결과를 위한 개발을 했다는 것...
최대한 의식해서 객체지향적으로 하려고 했지만 부족한것은 사실.
리뷰 요청으로 리뷰어님에게 많이 뚜드려 맞았다!😭😭
그렇지만 잘못된 점을 알게되니 기분은 좋았다...???
여기서부터 많은 고민을 했다.🧐
어떻게해야 객체지향적으로 설계하고 책임과 역할을...
결론은 내가 할줄 아는 개발은 Java 7 이하의 방식이였던것.
인프런, 백기선님의 Java8 을 수강했다.
주된 학습 목적은 람다와 함수형 인터페이스, Stream 위주로 학습했다.
그리고 enum 을 다시 복습하고 문자열 계산기를 재진행했다.
처음에 했던 계산기 로직이다.
switch (data[i]) {
case "+" :
result = plus(result, number);
break;
case "-" :
result = minus(result, number);
break;
case "*" :
result = multiply(result, number);
break;
case "/" :
result = divide(result, number);
break;
default :
throw new IllegalArgumentException();
}
각 계산하는 메소드를 선언해서 더 많은 코딩라인을 차지한다.
Java8 을 학습하고 enum 을 사용해서 개선한 로직이다
for (int i = 1; i < strArr.length; i+=2) {
result = OperatorType.findOper(strArr[i])
.operation(result, operand.stringToInt(strArr[i+1]));
}
public enum OperatorType {
PLUS("+", (a, b) -> a + b),
MINUS("-", (a, b) -> a - b),
MULTIPLY("*", (a, b) -> a * b),
DIVIDE("/", (a, b) -> a / b);
public static OperatorType findOper(String symbol) {
return Arrays.stream(OperatorType.values())
.filter(oper -> oper.symbol.equals(symbol))
.findAny()
.orElseThrow(() -> new IllegalArgumentException(CalculatorErrorMessage.ARITHMETIC_SYMBOLS_ERROR));
}
}
Java8 과 enum 의 사용으로 이전에 비해 많이 깔끔해지고 간단해졌다.
하지만 findOper 같이 줄여쓰는 함수명의 사용을 자제해 달라 피드백을 받았다.
이전까지는 줄여쓰는게 원칙이였는데, 객체지향 생활체조에는 줄이지 말라는게 원칙!
그 외에도 도움이 되는 피드백들을 많이 받고 문자열 계산기를 통과했다.
step3, 자동차 경주
본격적이 미션이라 볼 수 있다.
경주에 참가할 자동차 개수와 진행할 횟수를 입력과
그 외 조건으로 진행되는 게임이다.
이번 단계에서 많은걸 배울 수 있었다.
처음엔 이동 여부 확인을 위해 단순히 임의의 숫자를 move(number) 로 넘겼지만 생각해보니
움직이는 메소드 내부에서 랜덤값을 뽑아 비교하면 되지 않나 생각에 move() 내부에서 실행되게 로직을 변경했다.
단순히 메소드만 호출하면 자동적으로 움직일지, 안 움직일지 객체 스스로 정한다.
하지만 문제는 테스트 할 방법이 없다는거. 테스트 코드에서 움직인다, 안 움직인다가 랜덤으로 정해져서 매번 다른 결과가 도출된다.
이를 통제 불능이라 하더라... 이 경우 어떻게 해야할까 고민을 했다.
그리고 데이터 중심이 아닌 역할과 책임을 중심으로 진행했지만 많은 부족함을 느끼고
리뷰 요청을 드리면서 질문을 남겼다.
많은 피드백을 받았다. 궁금했던 점과 잘못된 점, 그리고 보완해야할 점등을 받아 처리했고 두번째로 리뷰를 요청했다.
하지만 답변이 느렸고, 기다린 답변엔 결국엔 다시 해달라는 요청을 받았다.😭😭😭
알고보니 내가 진행하다가 이거 있으면 재미있겠네 하고 추가한 요소들이, 이번 단계의 큰 흐름에서 많이 벗어난 모양.😂😂😂
더군다나 진행하면서 역할과 책임에 대한 분배도 잘 안되고 내가 개념을 제대로 이해 못한거 같아
진행을 잠깐 멈추고 오브젝트 책을 읽었다
이후 진행한 자동차 경주는 이전과는 다른 양상을 보였다.
많은 변화가 있었다고 리뷰어가 피드백을 주면서 통과시켜준것!.
일주일동안 이번 단계에 잡혀있었지만 많은 변화를 느꼈다.
이제 요구사항이 있으면 데이터 중심이 아니라 역할 중심으로 바라보게 되었고,
이전 레거시환경에서 했던 코딩 스타일은 많이 벗어났다고 스스로 느낄 정도다.
아직 남은 미션을 생각하니 벌써 기대감이 한껏 차오른다.
step4, 자동차 경주(우승자)
이전 단계에서 간단한 요구사항이 추가된 단계다.
예상보다 빨리 진행되었다.
이전에 많은 고생?을 해서 그런지 요구사항을 금방 진행했고
리뷰어님도 간단한 피드백과 함께 한번에 통과시켜주셨다.
step5, 자동차 경주(리팩토링)
이전까지 진행한 자동차 경주를 리팩토링하는 단계이다.
UI 로직과 도메인은 분리하고 패키지별로 구분하는게 특징.
객체지향 생활체조 원칙에 일급컬렉션 사용과 모든 원시값과 문자열은 랩핑해야한다.
이번에도 한번에 진행되었다.
리뷰어님이 step4 를 통과시켜주시면서 피드백으로 간단히 랩핑만 해주면 곧바로 step5 통과시켜준다고 하셨을 정도!
후기
누구에겐 간단히 진행하는 미션인 자동차가 될 수 있지만
나 같은 경우엔 많은 걸 배운 기회가 되었다.
매번 리뷰어가 잘못된 점을 잡고 힌트를 주면서 알려준 덕분에 (많은 걸 도와준 리뷰어님에게 감사드린다)
역할과 책임에 대한 고민을 많이 하면서 객체를 중심으로 개발을 할 수 있는 경험을 했다. (가장 큰 배움이다.)
또한 이전에는 사용안하고(솔직히 아예 몰랐다)
Java8 기능을 중심으로 진행했던 점과
구현 -> 테스트(수동) 개발 방식이 아닌
테스트 -> 구현 -> 리팩토링 방식의 TDD 를 경험을 했다.
자바지기님이 엘레강트 오브젝트(극단적인 책이라 하신다)를 중심으로
자동차 경주 리팩토링을 보여주셨는데 새로운 경험을 했다.
이전까지 생성자보다 메소드가 많은걸 당연하다 생각했지만
그 관점을 깨트리고 반대로 메소드가 적고 생성자가 많은걸 코드로 직접 보니 결과는 대단했다.
생성자로 로직을 처리하는거에 놀라웠다는 사실!
이전과 비교해보니 많은 차이가 존재했다. 생성자가 적을땐 객체가 딱딱하다고 느꼈는데,
생성자가 추가될 수록 그만큼 유연해지는 걸 느꼈다. (엘레강트 오브젝트 책을 사야겠다.)
아직 첫번째 미션일뿐인데
공부하는 방법과 바라보는 관점까지 변하고 개발에 대한 재미를 느꼈다.
앞으로 남은 3가지 미션을 진행하면서 얼마나 더 많은 걸 배우고 변화될지 기대가 된다.
'교육 및 인강 > TDD, Clean Code with Java' 카테고리의 다른 글
TDD, Clean Code with Java - 미션4, 볼링(🎳) 후기 (0) | 2021.04.10 |
---|---|
TDD, Clean Code with Java - 미션3, 사다리 후기 (0) | 2021.04.06 |
TDD, Clean Code with Java - 미션2, 로또 후기 (0) | 2021.03.29 |
TDD, Clean Code with Java 시작하며.. (2) | 2021.03.18 |