Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

5단계 - 자동차 경주(리팩토링) #6080

Merged
merged 1 commit into from
Mar 22, 2025
Merged
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
7 changes: 3 additions & 4 deletions src/main/java/racingcar/RacingCarMain.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
package racingcar;

import racingcar.ui.RacingCarInputView;
import racingcar.ui.RacingCarResultView;
import racingcar.controller.RacingCarGameController;

public class RacingCarMain {
public static void main(String[] args) {
RacingCarGame racingCarGame = new RacingCarGame();
racingCarGame.start();
RacingCarGameController racingCarGameController = new RacingCarGameController();
racingCarGameController.start();
}
}
Original file line number Diff line number Diff line change
@@ -1,28 +1,31 @@
package racingcar;
package racingcar.controller;

import java.util.List;

import racingcar.ui.RacingCarInput;
import racingcar.ui.RacingCarInputView;
import racingcar.ui.RacingCarResult;
import racingcar.ui.RacingCarResultView;
import utils.RandomUtils;
import racingcar.domain.DefaultRacingCarGameWinnerStrategy;
import racingcar.domain.RacingCar;
import racingcar.domain.RacingCarFactory;
import racingcar.domain.RacingCarGameWinnerStrategy;
import racingcar.view.RacingCarInput;
import racingcar.view.RacingCarInputView;
import racingcar.view.RacingCarResult;
import racingcar.view.RacingCarResultView;

public class RacingCarGame {
public class RacingCarGameController {

private final RacingCarInputView inputView;
private final RacingCarResultView resultView;
private final RacingCarGameWinnerStrategy winnerStrategy;

public RacingCarGame() {
public RacingCarGameController() {
this(RacingCarInputView.getInstance(),
RacingCarResultView.getInstance(),
DefaultRacingCarGameWinnerStrategy.getInstance());
}

private RacingCarGame(RacingCarInputView inputView,
RacingCarResultView resultView,
RacingCarGameWinnerStrategy winnerStrategy) {
private RacingCarGameController(RacingCarInputView inputView,
RacingCarResultView resultView,
RacingCarGameWinnerStrategy winnerStrategy) {
this.inputView = inputView;
this.resultView = resultView;
this.winnerStrategy = winnerStrategy;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package racingcar;
package racingcar.domain;

import java.util.ArrayList;
import java.util.Collections;
Expand All @@ -15,24 +15,27 @@ public static DefaultRacingCarGameWinnerStrategy getInstance() {
return INSTANCE;
}

private List<RacingCar> sort(List<RacingCar> racingCars) {
racingCars = new ArrayList<>(racingCars);
Collections.sort(racingCars);
return racingCars;
}

@Override
public List<RacingCar> getWinners(List<RacingCar> racingCars) {
if (racingCars == null || racingCars.isEmpty()) {
return Collections.emptyList();
}

racingCars = sort(racingCars);
RacingCar winner = racingCars.get(0);
RacingCar firstPlace = getFirstPlace(racingCars);

return racingCars
.stream()
.filter(car -> winner.compareTo(car) == 0)
.filter(car -> firstPlace.compareTo(car) == 0)
.collect(Collectors.toList());
}

private RacingCar getFirstPlace(List<RacingCar> racingCars) {
return sort(racingCars).get(0);
}

private List<RacingCar> sort(List<RacingCar> racingCars) {
racingCars = new ArrayList<>(racingCars);
Copy link
Member

Choose a reason for hiding this comment

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

파라미터로 받은 인자를 재할당하지 않고 새로운 지역 변수를 선언하는 방법도 고려해 보시면 좋을 것 같아요.

Copy link
Author

Choose a reason for hiding this comment

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

@testrace
네 새로운 지역변수가 좋다고 생각하는데 이게 이름짓기가 만만치 않은 것 같아요.
리뷰 감사합니다.
첫미션이 용주님과 함께여서 참 좋았던 것 같습니다.

Collections.sort(racingCars);
return racingCars;
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package racingcar;
package racingcar.domain;

import racingcar.ui.RacingCarResult;
import racingcar.view.RacingCarResult;
import utils.RandomUtils;

public class RacingCar implements Comparable<RacingCar> {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package racingcar;
package racingcar.domain;

import java.util.ArrayList;
import java.util.List;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package racingcar;
package racingcar.domain;

import java.util.List;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package racingcar;
package racingcar.domain;

@FunctionalInterface
public interface RacingCarMoveStrategy {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package racingcar;
package racingcar.domain;

public class RacingCarName {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package racingcar;
package racingcar.domain;

import utils.RandomUtils;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package racingcar.ui;
package racingcar.view;

import java.util.Arrays;
import java.util.List;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package racingcar.ui;
package racingcar.view;

import java.util.List;
import java.util.Scanner;

public class RacingCarInputView {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package racingcar.ui;
package racingcar.view;

import java.util.List;

import racingcar.RacingCar;
import racingcar.domain.RacingCar;

import static java.util.stream.Collectors.toList;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
package racingcar.ui;
package racingcar.view;

import java.util.List;

import racingcar.RacingCar;

public class RacingCarResultView {

private final static RacingCarResultView INSTANCE = new RacingCarResultView();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
package racingcar;
package racingcar.domain;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThat;


class DefaultRacingCarGameWinnerStrategyTest {
class DefaultRacingCarGameControllerWinnerStrategyTest {

@Test
void 동점이면_모두_winner다() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
package racingcar;
package racingcar.domain;

import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.catchThrowableOfType;
import static org.junit.jupiter.api.Assertions.*;

class RacingCarNameTest {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package racingcar;
package racingcar.domain;

import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
package racingcar.ui;
package racingcar.view;

import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.catchThrowableOfType;
import static org.junit.jupiter.api.Assertions.*;

class RacingCarInputTest {

Expand Down