[우아한 테크 캠프 Pro 2기] 1주차. 로또-TDD

[우아한 테크 캠프 Pro 2기] 1주차. 로또-TDD

코드 경로

https://github.com/next-step/java-lotto/pulls?q=is%3Apr+is%3Aclosed+author%3Ajordy-torvalds

주요 내용

자동/수동 로또 구매 및 당첨 및 당첨금액 확인을 하는 간단한 프로그램을 짜보는 미션이었습니다. 구현 도메인 자체는 쉬웠으나 요구되는 요구사항들을 준수하며 개발하는 것이 어려웠습니다. 요구된 요구사항은 대략 아래와 같습니다.

TDD로 모든 기능을 구현 비즈니스 로직와 UI 로직 분리

들여쓰기는 1단계 까지 가능

함수 길이는 15라인 이상 금지

자바 코드 컨벤션 준수 참고문서: https://google.github.io/styleguide/javaguide.html 또는 https://myeonguni.tistory.com/1596

else 예약어를 쓰지 않는다. 힌트: if 조건절에서 값을 return하는 방식으로 구현하면 else를 사용하지 않아도 된다. else를 쓰지 말라고 하니 switch/case로 구현하는 경우가 있는데 switch/case도 허용하지 않는다.

기능 단위 커밋

AngularJS Commit Message Conventions 준수

코드 리뷰 내용

아래와 같은 코드 리뷰를 받았습니다.

생성사 내 유효성 검사 로직을 별도 메소드로 분리할 것 & 커스텀 예외를 통해 예외를 좀 더 명확히 표현할 것

컬렉션 참조 변수의 변수명을 List 접미사 대신 복수형으로 표현할 것

validate 메소드에서 boolean 반환 보단 Exception을 throw 할 것

팩토리 클래스 별도 선언을 지양하고 해당 클래스에게 위임할 것

직접적인 List 대신 1급 컬렉션을 사용할 것

1급 컬렉션인 LottoGames에 매번 add해주는게 아닌 한 번에 주입해줄 것 도메인 특성상 생성자로 한 번에 주입시 add 메소드를 없애도 됩니다. 결론적으로 LottoGames를 불변 객체로 만들 수 있어, 사이드 이펙트를 줄일 수 있습니다.

원시값 대신 객체로 주고 받을 것

View와 Domain의 분리할 것

피드백 내용 외

로또 번호는 1에서 45까지 있어 Flyweight 패턴을 사용해서 미리 선언을 해놓은 후에 가져다 쓰는 식으로 비즈니스 로직을 작성함으로써 불필요한 객체 선언을 막을 수 있었다.

느낀점

제가 특정 객체를 생성해주는 팩토리를 별도로 만드는 심각한 팩토리 클래스 충(?)이란 것을 깨달을 수 있었습니다. 또한 좋은 코드는 객체와 객체간의 대화이며, 원시값을 직접 쓰기 보단 객체를 선언해서 명확하게 의도를 표현하는 것이 좋다는 것을 깨달을 수 있는 미션이었습니다.

전체적으로 중점적으로 강조하는 것은 주석이 아닌 코드로 의도를 들어내고, 코드로 미래의 개발자에게 메시지를 전달할 수 있는 코드를 작성하는 것이 중요하다는 것을 깨달았습니다.

이 미션은 처음부터 끝까지 TDD로 진행했는데 백문이불여일타라는말이 있듯 많이 하다보니 TDD가 많이 늘었다는 것을 알 수 있었습니다.

from http://jordy-torvalds.tistory.com/158 by ccl(A) rewrite - 2021-10-01 10:27:31