[자동차 경주 미션 1,2단계] 김하은 미션 제출합니다.#170
Conversation
There was a problem hiding this comment.
안녕하세요 하은님 🙋♂️
첫 미션 고생하셨습니다!
하지만 지금 제출해 주신 미션에서 자동차 미션의 2단계의 중요한 요구사항이 하나 빠져 있는것 같아요
[2단계 요구사항 중..]
- "주어진 횟수" 동안 n대의 자동차는 전진 또는 멈출 수 있다.
- **"0에서 9 사이에서 random 값"**을 구한 후 random 값이 4 이상일 경우 전진하고, 3 이하의 값이면 멈춘다.
이 요구사항을 마저 반영하신 다음에 좀 더 디테일하게 리뷰를 남겨 보도록 할게요!!
궁금하셨던 점
Q. Git 사용이 아직 익숙하지 않아 질문드립니다. commit 후에 바로 push를 하는 방식이 일반적인지, 아니면 commit을 여러 개 쌓아둔 뒤 마지막에 한 번에 push하는 방식이 더 권장되는지 궁금합니다.
푸시는 내 로컬에서 작업한 내용(커밋)을 원격 저장소(깃허브)에 올리는 것이기 때문에,
모든 작업이 완료된 뒤 한 번에 push를 해도 괜찮습니다
다만 push 시점 자체보다 더 중요한 것은 커밋의 단위를 어떻게 나누느냐라고 생각해요
내가 작업한 부분이 무엇인지 명확하게 드러나도록 커밋 단위를 나누고 메시지를 작성하면,
나중에 변경 이력을 되돌아볼 때도 훨씬 이해하기 쉽고,
문제가 생겼을 때 어떤 작업에서 변경이 발생했는지도 더 빠르게 파악할 수 있습니다
또 협업 상황에서는 다른 사람이 커밋 내역만 보더라도
어떤 의도로 수정했는지 흐름을 이해하는 데 도움이 되기 때문에,
작업이 잘게 보이더라도 의미 있는 단위로 커밋을 나누는 습관이 더 중요하다고 생각해요
Q. 자바 코딩에 아직 익숙하지 않아 기초 미션임에도 어려움을 느꼈습니다. 특히 for문 안에 if문을 사용하지 않는 조건과 메서드 길이 제한 조건 때문에 RacingGame 클래스의 코드를 여러 메서드로 분리하는 과정이 가장 어려웠습니다.
이 부분은 미션이 왜 이러한 제약 조건을 제시했는지를 고민해 보시면 좋을거 같아요 !
미션에는 다음과 같은 제약이 존재했었는데요,
- indent(인덴트, 들여쓰기) depth를 2를 넘지 않도록 구현한다. 1까지만 허용한다.
예를 들어 while문 안에 if문이 있으면 들여쓰기는 2이다.
힌트: indent(인덴트, 들여쓰기) depth를 줄이는 좋은 방법은 함수(또는 메서드)를 분리하면 된다.
이런 제약은 단순히 코드를 잘게 나누라는 의미보다는,
하나의 메서드가 너무 많은 일을 하지 않도록 만들고,
각 메서드가 조금 더 명확한 역할을 가지도록 연습해보라는 의도에 가깝다고 생각해요. +) 코드 가독성
그래서 메서드를 분리할 때도
단순히 제약을 맞추기 위해 쪼개는 것에서 끝나기보다,
이 메서드가 어떤 역할을 맡고 있는지,
분리했을 때 오히려 의도가 더 잘 드러나는지를 같이 고민해보면 더 좋을 것 같습니다 !
P.S 이번 미션에서 위의 제약을 만족하기 위함이 아니라
메서드들이 하나의 책임만을 가지도록 분리해 보는 연습을 해 보시면 감이 오실거에요
제가 드릴 추가 요구사항
이제 남은 요구사항을 추가로 진행하시게 될 텐데, 제가 드릴 몇 가지 요구사항이 있습니다!
-
메서드 시그니처만으로도 해당 메서드가 무슨 동작을 하는지 의도가 보일 수 있도록 메서드 네이밍을 고민해 주세요.
-
RacingGame클래스의 책임은 무엇일까? 를 고민하면서 빠진 요구사항을 진행해 주세요. -
커밋 메시지는 작업 내용이 드러나도록 구체적으로 작성해 주세요. (⭐️일단은 제목만!!⭐️)
-
이번 자동차 경주 미션에서 구현한 내용을
README.md에 간단히 정리해 주세요.
3번 요구사항의 커밋 메시지는, 보통 많은 팀에서 공통적으로 사용하는 작성 규칙이 있습니다
이런 규칙을 컨벤션이라고 하는데,
커밋 로그만 보아도 어떤 작업이 추가되었는지, 수정되었는지 쉽게 파악할 수 있도록 도와줍니다
국룰처럼 많이 사용되는 방식이 있는데요, 이걸 따라서 한번 해 보시는 것도 좋을것 같아요
위 링크는 공식 문서 같은건데 처음 입문하긴 좀 어려워서
요기 간단 정리된 블로그를 참고하면서 감을 잡아 보시는 걸 추천해요!
처음부터 모든 형식을 완벽히 지키실 필요는 없고,
커밋 제목만 읽어도 작업 내용이 드러나도록 작성해보시면 좋을것 같아요!!
예를 들면 다음과 같이 작성할 수 있어요
- feat: 우승자 판별 기능 구현
- test: 자동차 이동 테스트 추가
- docs: 자동차 경주 미션 내용 README 작성
어떻게 진행할지 방향을 잘 못 잡으시겠다면 물어봐 주셔도 좋고,
스터디원들의 리뷰를 읽어 보는것도 도움이 많이 될거에요 !
화이팅 🔥🔥🔥🔥🔥
P.S 리뷰 반영이 완료 되면 디스코드 스레드에 멘션 남겨 주세요!
| public void move(int randomValue){ | ||
| if(randomValue >= 4){ | ||
| this.position++; | ||
| } | ||
| } |
There was a problem hiding this comment.
이동 조건 값 4는 상수로 분리하는건 어떨까요?
현재 move() 메서드 안에서 4가 직접 사용되고 있는데,
이런 값은 의미를 담은 상수로 분리해 두면 코드를 읽는 사람이 이 4라는 숫자가 무엇을 의미하는지 더 쉽게 이해할 수 있을 것 같아요.
또 나중에 기준값이 바뀌더라도 여러 곳을 찾지 않고 한 곳만 수정하면 되어서 유지보수도 쉬워지고요.
예를 들면 단순한 숫자 4보다,
전진 가능한 최소 값 같은 의미가 드러나는 이름이 있으면 의도가 훨씬 잘 보일 것 같습니다!
| } | ||
| } | ||
|
|
||
| public boolean isAtPosition(int MaxPosition){ |
There was a problem hiding this comment.
다른 코드는 잘 작성해 주셨는데 요기는 아마 실수인거 인거 같아요
MaxPosition은 자바 네이밍 관례상 maxPosition이 더 자연스러워 보입니당
| @Test | ||
| void 자동차가_4이상일때_전진하고_3이하일때_멈추는지_테스트(){ | ||
| Car car = new Car("Pobi"); | ||
|
|
||
| car.move(4); | ||
| assertThat(car.getPosition()).isEqualTo(1); | ||
|
|
||
| car.move(3); | ||
| assertThat(car.getPosition()).isEqualTo(1); | ||
| } |
There was a problem hiding this comment.
현재 이 테스트에서는 전진하는 경우와 전진하지 않는 경우를 한 번에 같이 검증하고 있는데,
이 둘을 나누면 테스트가 무엇을 확인하는지 더 분명해질 것 같아요
그래서 테스트가 실패했을 때도
- 전진해야 하는데 못 한 건지
- 전진하면 안 되는데 전진한 건지
원인을 더 바로 파악할 수 있어요
There was a problem hiding this comment.
단일 자동차의 이동 로직을 RacingTest에서 검증하는 것이 맞을지도 한 번 고민해보시면 좋을 것 같아요
현재 코드를 보면 단일 자동차의 이동 여부는 Car 클래스가 직접 결정하고 있으므로,
이 규칙은 레이싱게임 보다는 개별 자동차의 책임에 더 가깝게 느껴집니다
+) 테스트 클래스 파일을 쉽게 생성하는 인텔리제이 단축키가 있는데
테스트를 하고자 하는 로직이 있는 클래스에서 다음의 단축키를 누르면 간편하게 테스트 클래스를 생성할수 있어요
mac [ cmd + Shift + T ]
windows [ Ctrl + Shift + T ] ?? 윈도우를 쓰진 않아서 맞는지 잘 모르겠네요
| public class Car { | ||
| private final String name; | ||
| private int position; |
There was a problem hiding this comment.
여기 name을 final 로 선언한 것은 매우 좋은것 같네요!
final 로 선언을 했을때 무슨 이점이 있을까요??
| @Test | ||
| void 자동차가_4이상일때_전진하고_3이하일때_멈추는지_테스트(){ |
There was a problem hiding this comment.
정답이 있는 부분은 아니지만,
테스트 이름에서 의도는 잘 드러나긴 하는데, 조금 더 개선해보면 좋을 것 같습니다
개인적으로는 메서드명을 ~테스트처럼 마무리하기보다
테스트의 조건과 기대하는 결과가 함께 드러나도록 작성하면 더 명확한것 같더라구요
~테스트라는 표현은 단순히 테스트 코드라는 사실만 전달하는 반면,
에를 들어 4이상일때_자동차는_전진해야_한다처럼 작성하면
이 테스트가 어떤 규칙(명세)을 검증하는지를 더 분명하게 드러낼 수 있기 때문이에요
안녕하세요. 자동차 경주 미션 제출합니다.
구현 내용
-Car 클래스 생성
-RacingGame 클래스 생성
-기타 기능 구현
궁금한 점
Git 사용이 아직 익숙하지 않아 질문드립니다. commit 후에 바로 push를 하는 방식이 일반적인지, 아니면 commit을 여러 개 쌓아둔 뒤 마지막에 한 번에 push하는 방식이 더 권장되는지 궁금합니다.
==
자바 코딩에 아직 익숙하지 않아 기초 미션임에도 어려움을 느꼈습니다. 특히 for문 안에 if문을 사용하지 않는 조건과 메서드 길이 제한 조건 때문에 RacingGame 클래스의 코드를 여러 메서드로 분리하는 과정이 가장 어려웠습니다.
아직 많이 부족한 단계이지만 리뷰해 주신다면 많은 도움이 될 것 같습니다. 잘 부탁드립니다!
감사합니다.