Skip to content

Commit 0bf19ff

Browse files
committed
리뷰 반영-2단계 자동차경주
1 parent d30b560 commit 0bf19ff

File tree

5 files changed

+61
-60
lines changed

5 files changed

+61
-60
lines changed

src/main/java/Car.java

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,28 @@
11
public class Car {
2-
private final String carName;
3-
private int position = 0;
42

5-
public Car(String name){
6-
this.carName = name;
7-
}
3+
private final String carName;
4+
private int position = 0;
5+
private final RandomMove randomMove;
86

9-
public void move(Movable movable){
10-
if(movable.canMove()){
11-
position++;
12-
}
13-
}
7+
public Car(String name, RandomMove randomMove,int position) {
148

15-
public String getCarName(){
16-
return carName;
17-
}
9+
this.carName = name;
10+
this.randomMove = randomMove;
11+
this.position = position;
12+
}
1813

19-
public int getPosition() {
20-
return position;
14+
public void move(Movable movable) {
15+
if (randomMove.canMove()) {
16+
position++;
2117
}
18+
}
19+
20+
public String getCarName() {
21+
return carName;
22+
}
23+
24+
public int getPosition() {
25+
return position;
26+
}
2227

2328
}

src/main/java/Movable.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
//움직일 수 있나? 만 보는 인터페이스
2+
@FunctionalInterface
23
public interface Movable {
3-
boolean canMove();
4+
boolean canMove();
45
}
6+

src/main/java/RandomMove.java

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
1+
import java.util.concurrent.ThreadLocalRandom;
2+
13
public class RandomMove implements Movable {
2-
//값의 의미나 목적을 코드에서 명확하게 알리고 가독성을 위한 상수 사용
3-
//4는 전진 조건, 10은 랜덤 범위를 의미. 추후 변경 시 상수만 수정하면 됨
4-
private static final int MOVE_THRESHOLD = 4;
5-
private static final int RANDOM_BOUND = 10;
6-
7-
@Override
8-
public boolean canMove(){
9-
//nextInt(10)은 0~9까지의 랜덤한 값을 반환. 그 값이 4보다 크거나 같으면 true 반환
10-
return (int)(Math.random() * RANDOM_BOUND) >= MOVE_THRESHOLD;
11-
}
12-
}
4+
5+
private final int moveThreshold;
6+
private final int randomBound;
7+
8+
//생성자에서 전진 조건을 설정
9+
public RandomMove(int moveThreshold, int randomBound) {
10+
this.moveThreshold = moveThreshold;
11+
this.randomBound = randomBound;
12+
}
13+
14+
@Override
15+
public boolean canMove() {
16+
return (ThreadLocalRandom.current().nextInt(randomBound)) >= moveThreshold;
17+
}
18+
}

src/main/java/Winners.java

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
1-
import java.util.ArrayList;
21
import java.util.List;
2+
import java.util.stream.Collectors;
33

44
public class Winners {
5-
public static List<String> findWinnersNames(List<Car> cars){
6-
List<String> winners = new ArrayList<>();
7-
for(int i = 0; i < cars.size(); i++){
8-
if(cars.get(i).getPosition() >= 5){
9-
winners.add(cars.get(i).getCarName());
10-
}
11-
}
12-
return winners;
13-
}
5+
6+
public static List<String> findWinnersNames(List<Car> cars) {
7+
return cars.stream()
8+
.filter(car -> car.getPosition() >= 5)
9+
.map(Car::getCarName)
10+
.collect(Collectors.toList());
11+
}
1412
}

src/test/java/WinnersTest.java

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,20 @@
1-
import org.junit.jupiter.api.DisplayName;
2-
import org.junit.jupiter.api.Test;
1+
import static org.assertj.core.api.Assertions.assertThat;
32

43
import java.util.List;
5-
6-
import static org.assertj.core.api.Assertions.assertThat;
4+
import org.junit.jupiter.api.DisplayName;
5+
import org.junit.jupiter.api.Test;
76

87
public class WinnersTest {
9-
@Test
10-
@DisplayName("우승자(들) 이름을 반환한다")
11-
void returnWinnerNames(){
12-
Car carA = new Car("Car A");
13-
Car carB = new Car("Car B");
14-
Car carC = new Car("Car C");
15-
16-
for(int i = 0; i < 5; i++){
17-
carA.move(()->true);
18-
}
198

20-
for(int i = 0; i < 4; i++){
21-
carB.move(()->true);
22-
}
23-
for(int i = 0; i < 5; i++){
24-
carC.move(()->true);
25-
}
9+
@Test
10+
@DisplayName("우승자(들) 이름을 반환한다")
11+
void returnWinnerNames() {
12+
Car normalCar = new Car("Car A",new RandomMove(4,10),5);
13+
Car electricCar = new Car("Car B",new RandomMove(5,10),4);
14+
Car truck = new Car("Car C",new RandomMove(6,10),2);
15+
Car mini = new Car("Car D",new RandomMove(3,10),5);
2616

27-
List<Car> cars = List.of(carA, carB, carC);
28-
assertThat(Winners.findWinnersNames(cars)).containsExactlyInAnyOrder("Car A","Car C");
29-
}
17+
List<Car> cars = List.of(normalCar, electricCar, truck, mini);
18+
assertThat(Winners.findWinnersNames(cars)).containsExactlyInAnyOrder("Car A", "Car D");
19+
}
3020
}

0 commit comments

Comments
 (0)