JAVA/우아한테크코스 4기

[220213][JAVA] 페어 협업미션 리뷰어의 피드백_자동차 경주 미션

kth990303 2022. 2. 13. 17:10
반응형

이번에는 자동차 경주 미션 관련 피드백이다.

문자열 덧셈 계산기에 비해 로직이 많다보니, 리뷰 내용도 상당히 많았는데, 한 번 살펴보도록 하자.

 

전체 피드백은 https://github.com/woowacourse/java-racingcar/pull/256 여기서 볼 수 있으며,

포스팅에는 인상깊었던 피드백 위주로 작성할 예정이다.


Stream, Lambda로 불필요한 메소드와 변수를 줄이자.

이번에도 역시 stream 피드백이 존재한다.

아직 stream에 익숙하지 않아서 서툰 면이 많이 존재하는데, filter를 이용하면 List에 maxPosition에 해당하는 값들만 넣어줄 수 있기 때문에 stream을 사용하면 26~29라인에 해당하는 줄들을 바로 return문에 넣을 수 있다.

return cars.stream()
            .filter(car -> car.getPosition() == findMaxPosition())
            .collect(Collectors.toList());

깔끔하게 바꼈다.


객체의 역할을 생각하며 책임을 부여하자.

피드백 내용대로,

Car 객체는 자신의 이름, 현재 위치 외에는 관심을 가질 필요가 없다.

자동차 경주 자체에서 winner를 파악하기 위해 최대거리가 필요할 순 있지만, 이는 자동차에게는 전혀 필요하지 않다.

또한, 자동차 전진 메소드에서,

Car 객체가 언제 전진해야 할 지 알 필요까진 없다.

특정 객체에서 전진하라고 메시지를 던져주면, 자동차 객체에서 전진을 하면 된다.

왜냐? 자동차는 말그대로 전진하면서 자신의 위치 값에만 관심을 가지면 되기 때문이다.

자동차가 언제 전진을 해야되는지, 경주 내에서 자신이 앞서가는지 등은 알 필요도 없고, 만약 필요하다면 Racing객체에게 메시지를 던져 물어보면 된다.

public void proceed() {
    this.position++;
}

자동차는 위처럼 전진해야 할 경우, 다른 걸 따질 필요 없이 전진만 하면 된다.


비즈니스 로직과 UI 로직을 분리하자

비즈니스 로직 안에 ui 로직이 존재한다.

비즈니스 로직과 ui 로직을 같이 쓰면, 생산성이 저하되기 때문에 둘은 분리해서 써야 한다.

또한, ui 로직 안에 utils 로직이 있는 상황 또한 변경해주는 것이 좋다.

비즈니스 로직, ui 로직, utils 로직을 잘 분리해주어 생산성을 높이도록 해주자.

 

피드백 반영을 위하여 utils 패키지 안에 새로운 클래스를 추가로 만들어서 진행해주었다.

그리고 입력을 받고 자동차 객체를 만들어주는 역할은 ui 클래스가 아닌, utils 클래스에 부여해주었다.


Junit 어노테이션들을 적극 활용하자

그 동안은 자동차 전진 여부를 테스트하기 위한 메소드마다 

Car 객체를 계속 생성해두고 각 메소드마다 다르게 전진시키면서 테스트 중이었다.

 

같은 클래스의 Car이어도, 서로 다른 상태의 car에서 테스트를 해야 했기 때문에, 메소드마다 Car 객체를 새로 생성중이었다.

그러나 미르가 알려준 @BeforeEach 어노테이션을 이용하면 매 메소드가 실행되기 전에 BeforeEach가 먼저 실행되기 때문에 코드 중복을 줄일 수 있다!

@BeforeEach
void beforeEach(){
    carA = new Car("A");
    carB = new Car("B");
    carC = new Car("C");
    carD = new Car("D");

    cars = new ArrayList<>();
    cars.add(carA);
    cars.add(carB);
    cars.add(carC);
    cars.add(carD);

    racingService = new RacingService(cars);
}

이렇게 미리 car랑 racingService 인스턴스를 생성해놓는 걸 BeforeEach로 해놓는다면,

하나의 코드로 매 메소드마다 위 작업을 실행하도록 할 수 있다.

 

역시 많은 기능을 알수록 똑똑하게 프로그래밍이 가능한 듯하다.


어떻게 보면 항상 같은 얘기이나, 실제로 코드를 짜다보면 지키기가 생각보다 힘든 것들...

 

객체지향 책을 읽다보면 항상 같은 얘기를 해서 지루하다고 생각이 들 때도 있지만,

 

실제로 코드를 짜다보면 어느 순간 고칠 점들이 생겨나고,

놓쳤던 부분들을 리뷰어님께서 봐주시면서 새롭게 또 배우고

선순환이 반복되고 있다는 걸 느끼는 중이다 :)

 

이렇게 실습을 통해, 그리고 리뷰를 통해 좋은 코드를 짜는 습관과 버릇이 생기도록 많이 체화해야겠다~

 

반응형