자동차 경주 미션
🫡 구현 시 집중한 부분
1. 단위 테스트
테스트 가능한 가장 작은 소프트웨어를 실행하여 예상대로 동작하는지 확인하는 테스트
각 객체가 가지는 책임에 대해 테스트 하도록 함
2. MVC 패턴
- domain 패키지
- 핵심 비지니스 로직을 가지는 객체
- view 패키지
- UI 관련한 객체
- controller 패키지
- view와 domain의 연결 객체
주의
view 패키지의 객체가 domain 패키지 객체에 의존할 수 있지만, domain 패키지의 객체는 view 패키지 객체에 의존하지 않도록 구현해야 함
👥 짝(페어)과의 공유한 내용
1. 재귀를 통한 재입력
처음 구현 시, 사용자의 입력값에 따라 에러가 발생했을 경우 재입력을 받도록 하였다.
나는 보통 재귀를 통해 재입력을 받는 것도록 구현을 했었는데, 페어가 flag를 통해 재입력을 받는 방법에 대해 제안해주었다.
flag를 사용했을 경우의 장점
- 재귀를 사용했을 때, 예외 발생 시 스택 트레이스가 계속해서 쌓이게 되는데에 반해, flag는 그렇지 않다.
- 재귀를 사용했을 때, 명확한 종료 조건 없이는 무한히 호출되어 시스템의 과부하나 메모리 소진으로 이어질 가능성이 있는데, flag는 그렇지 않다.
📖 미션을 진행하면서 학습한 것들
1. 일급 컬렉션
자동차 경주 미션동안 가장 헷갈렸던 개념이 일급 컬렉션이였다.
어떻게 활용했는지, 어떤 부분이 헷갈렸는지에 대해 정리한 글을 첨부한다.
https://mincanit.tistory.com/60
수업 피드백
1. Junit5, Assert 학습
https://mincanit.tistory.com/55
2. getter 메서드 없이 구현
코드리뷰에서도 getter의 사용을 최대한 지양해보라는 의견을 많이 들었다.
왜 getter을 지양해야 할까?하는 생각이 들었다.
이유는 캡슐화가 깨진다. getter를 사용하게 되면 외부에서 객체의 상태를 완전히 알게 된다.
때문에 getter를 사용하는 것보다는 다른 메서드를 통해 객체의 내부를 알지 모르는 채로 객체에게 질문해야 한다.
또한 setter/getter 메서드를 사용하지 말라는 것은 핵심 비지니스 로직을 구현하는 도메인 객체에서의 사용을 말한다.
DTO의 경우에는 setter/getter가 허용된다고 한다.
👩💻 코드 리뷰
1. 요구사항 준수
일단, 주어진 요구사항을 만족하는 것이 최우선이어야 한다.
특별한 요구사항이 없다면 에러가 나게 둬도 괜찮다. 에러가 나면 그냥 에러가 나게 두는 것도 방법이다.
2. 검증 로직에 대한 위치
나는 프로그램 규모도 크지 않고 검증 로직도 많이 없어서,Validator라는 하나의 클래스에 모든 검증 로직을 두어 객체를 검증했다.
하지만,검증에 대한 로직을 모아둔 클래스가 있을 때 검증 로직이 많아진다면 이 클래스에는 어떤 일이 생길지에 대해 고민해보라는 피드백을 받았다.
현재의 방식을 사용했을 경우, 검증해야 할 클래스의 수가 늘어나고, 검증에 대한 로직이 많아진다면 유지보수하기 힘들 것 같다는 생각이 들었다.
또 각 객체가 자신의 데이터에 대한 검증의 책임을 가지고 있는 것이 맞다.
3. toString
이번 미션을 구현하면서 도메인의 상태를 출력해주어야 했었는데, 이때 아래와 같이 toString()을 활용하여 포맷을 해주었다.
// Car.java
@Override
public String toString() {
return this.name + " : " + "-".repeat(this.position);
}
toString()은 디버깅 용도로 주로 사용되기 때문에 출력을 위한 로직을 작성하는 것은 적절하지 않다고 볼 수 있다.
또, 출력에 대한 로직이 도메인에 존재했을 때 출력 포맷이 변경된다면 도메인의 코드가 변경되어버린다는 문제점이 있다.
'우아한테크코스 6기 > 1단계' 카테고리의 다른 글
[블랙잭 미션] 페어프로그래밍 단계 학습 내용 정리 (0) | 2024.04.13 |
---|---|
[사다리 타기 미션] 학습 내용 정리 (0) | 2024.03.26 |
일급 컬렉션 (1) | 2024.03.25 |
[자동차 경주 미션] 개인 회고 (0) | 2024.03.25 |
List의 copyof()와 of() (0) | 2024.03.14 |