Skip to content
Open

Step5 #6146

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 0 additions & 27 deletions src/main/java/racingcar/CarManager.java

This file was deleted.

24 changes: 3 additions & 21 deletions src/main/java/racingcar/RacingCar.java
Original file line number Diff line number Diff line change
@@ -1,29 +1,11 @@
package racingcar;

import java.util.List;

import racingcar.domain.Cars;
import racingcar.utils.NumberUtils;
import racingcar.utils.StringUtils;
import racingcar.view.InputView;
import racingcar.view.ResultView;
import racingcar.controller.RacingCarController;

public class RacingCar {

public static void main(String[] args) {
play();
}

private static void play() {
List<String> carNames = StringUtils.splitByComma(InputView.getCarNames());
Cars cars = CarManager.initCars(carNames);

int tryCount = NumberUtils.toInt(InputView.getTryCount());

ResultView.printInitialState();
CarManager.print(cars);

Cars movedCars = CarManager.move(cars, tryCount);
ResultView.printWinner(movedCars.getWinnerNames());
RacingCarController racingCarController = new RacingCarController();
racingCarController.play();
}
}
37 changes: 37 additions & 0 deletions src/main/java/racingcar/controller/RacingCarController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package racingcar.controller;

import java.util.List;

import racingcar.domain.Cars;
import racingcar.domain.RaceRecords;
import racingcar.utils.NumberUtils;
import racingcar.utils.StringUtils;
import racingcar.view.InputView;
import racingcar.view.ResultView;

public class RacingCarController {

public void play() {
List<String> carNames = StringUtils.splitByComma(InputView.getCarNames());
Cars cars = Cars.create(carNames);

int tryCount = NumberUtils.toInt(InputView.getTryCount());

RaceRecords raceRecords = RaceRecords.init(cars);
for (int sequence = 1; sequence <= tryCount; sequence++) {
cars = cars.move();
raceRecords.record(sequence, cars);
}

raceRecords.getValues()
.forEach(raceRecord -> {
ResultView.printSequence(raceRecord.getSequence());
raceRecord.getCars()
.getValues()
.forEach(car -> ResultView.print(car.getName(), car.getPositionValue()));
ResultView.printNewLine();
});

ResultView.printWinner(raceRecords.getWinnerNames());
}
}
10 changes: 5 additions & 5 deletions src/main/java/racingcar/domain/Car.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,15 +30,15 @@ public Car move(CarMovementPolicy policy) {
return this;
}

public int getPosition() {
public int getPositionValue() {
return this.position.getValue();
}

public String getName() {
return this.name.getValue();
public CarPosition getPosition() {
return this.position;
}

public boolean equals(int position) {
return this.position.equals(position);
public String getName() {
return this.name.getValue();
}
}
14 changes: 4 additions & 10 deletions src/main/java/racingcar/domain/Cars.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import java.util.stream.Collectors;

import racingcar.policy.CarMovementRandomizer;
import racingcar.utils.NumberUtils;
import racingcar.vo.CarPosition;

public class Cars {

Expand Down Expand Up @@ -32,16 +32,10 @@ public List<Car> getValues() {
return this.values;
}

public List<String> getWinnerNames() {
return getValues().stream()
.filter(car -> car.equals(NumberUtils.getMax(getPositions())))
.map(Car::getName)
.collect(Collectors.toList());
}

public List<Integer> getPositions() {
public CarPosition getMaxPosition() {
return getValues().stream()
.map(Car::getPosition)
.collect(Collectors.toList());
.max(Comparator.comparingInt(CarPosition::getValue))
.orElse(CarPosition.initialize());
}
}
43 changes: 43 additions & 0 deletions src/main/java/racingcar/domain/RaceRecord.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package racingcar.domain;

import java.util.List;
import java.util.stream.Collectors;

public class RaceRecord {

private static final int SEQUENCE_INIT = 0;

private final int sequence;
private final Cars cars;

public RaceRecord(Cars cars) {
this.sequence = SEQUENCE_INIT;
this.cars = cars;
}

public RaceRecord(int sequence, Cars cars) {
this.sequence = sequence;
this.cars = cars;
}

public int getSequence() {
return this.sequence;
}

public Cars getCars() {
return this.cars;
}

public List<String> getWinnerNames() {
return getCars().getValues()
.stream()
.filter(this::isMaxPosition)
.map(Car::getName)
.collect(Collectors.toList());
}

private boolean isMaxPosition(Car car) {
return getCars().getMaxPosition()
.equals(car.getPosition());
}
}
33 changes: 33 additions & 0 deletions src/main/java/racingcar/domain/RaceRecords.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package racingcar.domain;

import java.util.ArrayList;
import java.util.List;

public class RaceRecords {

private final List<RaceRecord> values;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
private final List<RaceRecord> values;
private final List<Cars> values;

이렇게해도 차이점이 없을것 같아요!

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

혹시 RaceRecord 객체에 sequence 필드를 추가했을 때, 기존 코드로 사용 가능한거 맞을까요??
sequence 필드 추가한 코드 커밋해보았습니다! 한 번 더 검토 부탁드립니다..!


public RaceRecords(List<RaceRecord> values) {
this.values = new ArrayList<>(values);
}

public static RaceRecords init(Cars cars) {
return new RaceRecords(List.of(new RaceRecord(cars)));
}

public void record(int sequence, Cars cars) {
this.values.add(new RaceRecord(sequence, cars));
}

public List<RaceRecord> getValues() {
return this.values;
}

public List<String> getWinnerNames() {
return getResult().getWinnerNames();
}

private RaceRecord getResult() {
return this.values.get(this.values.size() - 1);
}
}
12 changes: 8 additions & 4 deletions src/main/java/racingcar/view/ResultView.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,6 @@ public class ResultView {
private static final String INFIX = " : ";
private static final String WINNER_MESSAGE = "가 최종 우승했습니다.";

public static void printInitialState() {
System.out.println(RESULT);
}

public static void print(String prefix, int count) {
System.out.print(prefix);
System.out.print(INFIX);
Expand All @@ -25,6 +21,14 @@ private static void printHyphens(int count) {
System.out.println(HYPHEN.repeat(count));
}

public static void printSequence(int sequence) {
if (sequence == 0) {
System.out.println(RESULT);
return;
}
System.out.printf("[ Race: %d ]%n", sequence);
}

public static void printNewLine() {
System.out.println();
}
Expand Down
19 changes: 17 additions & 2 deletions src/main/java/racingcar/vo/CarPosition.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package racingcar.vo;

import java.util.Objects;

public class CarPosition {

private static final int ONE_STEP = 1;
Expand All @@ -22,8 +24,21 @@ public int getValue() {
return this.value;
}

public boolean equals(int value) {
return this.value == value;
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
CarPosition that = (CarPosition) o;
return value == that.value;
}

@Override
public int hashCode() {
return Objects.hashCode(value);
}
}

13 changes: 13 additions & 0 deletions src/main/resources/racingcar.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,16 @@
- [x] 사용자가 입력한 이름의 숫자 만큼 자동차 대수를 생성한다.
- [x] 자동차 이름과 위치를 출력한다.
- [x] 게임을 완료한 후 우승자를 출력한다.(공동 우승자 포함)
<hr/>

#### 5단계 전 리팩토링
- [x] CarPosition 리팩토링 (CarPositions 추가)

### 🚀 5단계 - 자동차 경주(리팩토링)
- [x] CarManager 제거
- [x] RaceRecord 추가
- [x] TC 추가 및 리팩토링
Comment on lines +32 to +34
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

- [x] Controller 추가 및 view 의존성 재정의
- [x] equals and hashCode 로직 수정
- [x] RaceRecord 리팩토링
- [x] getWinnerNames 메소드 리팩토링 및 CarPositions 삭제
23 changes: 15 additions & 8 deletions src/test/java/racingcar/RacingCarTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,7 @@
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import racingcar.domain.Car;
import racingcar.domain.Cars;
import racingcar.domain.*;
import racingcar.policy.CarImmovablePolicy;
import racingcar.policy.CarMovabilityPolicy;
import racingcar.utils.StringUtils;
Expand All @@ -22,7 +21,7 @@ public class RacingCarTest {
void 자동차_생성() {
Car car = Car.create("one");
assertThat(car).isInstanceOf(Car.class);
assertThat(car.getPosition()).isEqualTo(1);
assertThat(car.getPositionValue()).isEqualTo(1);
}

@Test
Expand All @@ -36,22 +35,21 @@ public class RacingCarTest {
void 자동차_여러_대_생성(String value, int count) {
Cars cars = Cars.create(StringUtils.splitByComma(value));
assertThat(cars.getValues()).hasSize(count);
assertThat(cars.getPositions()).hasSize(count);
assertThat(cars.getPositions()).allMatch(position -> position.equals(1));
assertThat(cars.getMaxPosition().getValue()).isEqualTo(1);
}

@Test
void 자동차_전진() {
Car car = Car.create("one");
Car moved = car.move(new CarMovabilityPolicy());
assertThat(moved.getPosition()).isEqualTo(2);
assertThat(moved.getPositionValue()).isEqualTo(2);
}

@Test
void 자동차_정지() {
Car car = Car.create("one");
car.move(new CarImmovablePolicy());
assertThat(car.getPosition()).isEqualTo(1);
assertThat(car.getPositionValue()).isEqualTo(1);
}

@ParameterizedTest
Expand All @@ -67,7 +65,16 @@ public class RacingCarTest {
.collect(Collectors.toList())
);

RaceRecords raceRecords = new RaceRecords(List.of(new RaceRecord(cars)));
List<String> expected = StringUtils.splitByComma(expectedWinners);
assertThat(cars.getWinnerNames()).isEqualTo(expected);

assertThat(raceRecords.getWinnerNames()).isEqualTo(expected);
}

@Test
void 자동차_위치_일치_여부() {
Car firstCar = Car.create("one").move(new CarMovabilityPolicy());
Car secondCar = Car.create("two").move(new CarMovabilityPolicy());
assertThat(firstCar.getPosition().equals(secondCar.getPosition())).isTrue();
}
}