-
Notifications
You must be signed in to change notification settings - Fork 5
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
자동차 경주 게임! #15
base: master
Are you sure you want to change the base?
자동차 경주 게임! #15
Conversation
} | ||
|
||
private void checkPositive(int count) { | ||
if (isNotPositive(count)) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이거는 개인 코드 차이인데요, 만약 이 조건문이 일회성으로 사용된다면 저는 private 이어도 method로 빼지 않는 편입니다.
조건문을 메서드로 빼서 중복을 해결할 수 있다면 정답이지만
한번만 사용되는 조건문이라면 지역변수로 넣어두기도 하는 분도 있다고 들었습니다..!
여튼 조건문이 어떤걸 확인하는지 리터럴로 지정해주는건 보는 사람이 코드를 읽기 쉽게 만들어주는 거라서 좋다고 봅니다.
boolean isNotPositive = count <= 0;
src/main/java/racing/domain/Car.java
Outdated
return distance; | ||
} | ||
|
||
public void move() { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이부분 테스트를 어떻게 하고 있나요?
랜덤이라서 테스트가 어려울 것 같은데 조언을 받아보세요!
public void move(int distance){
this.distance += distance
}
이런식으로 함수를 만들고 인자로 넣어줄 때 randomtuil 을 사용한다면 테스트도 가능한 함수가 됩니다 :)
지금도 좋은데!! 다른분들은 어떻게 테스트를 했는지 얘기해보면 좋을것 같아요
|
||
private List<Car> collectCars(int carCount) { | ||
List<Car> cars = new ArrayList<>(); | ||
while (remainCar(carCount--)) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
음 오히려 while 문을 사용해서 가독성이 떨어지는 것 같아요.
다들 많이 사용하는 for문 사용해도 좋을것 같아요 혹시라도 리터럴이 걱정이라면
for(int carIndex =0; carIndex < carCount; carIndex++)
이런식으로 평소 자주 사용하는 int i =0 보다 내용을 나타낼 수 있습니다. 아니면 IntStream을 사용하는 방법도 있구요!
import java.util.ArrayList; | ||
import java.util.List; | ||
|
||
public class Cars { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
일급 컬렉션 굿b
import racing.util.RandomUtil; | ||
|
||
public class Car { | ||
private int distance; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
엇근데 random으로 받은 distance 값을 바탕으로 outputview를 작성하는데,
이렇게 하면 주어진 요구사항에 맞지 않을 것 같습니다.
레이싱 게임 요구사항을 확인해주세요.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
소소한 리뷰를 남겼어!
이제 2단계로 넘어가보자!
@@ -0,0 +1,54 @@ | |||
package racing.domain; | |||
|
|||
import racing.view.ResultView; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
도메인에 View 의존성이 존재하네요!
구조를 바꿔봅시다!
public void operate(int tryCount) { | ||
ResultView resultView = new ResultView(); | ||
while (remainTryCount(tryCount--)) { | ||
moveCars(); | ||
resultView.printResult(this); | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
뷰 의존성 제거해볼게요!
while (remainCar(carCount--)) { | ||
cars.add(new Car(0)); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
제 생각에는 for문을 사용하는게 오히려 가독성에 좋을것 같아요
src/main/java/racing/domain/Car.java
Outdated
public void move() { | ||
this.distance += RandomUtil.getRandomDistance(); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 부분에 대한 테스트가 가능하게 의존성 분리를 해보는 것은 어떨까요?
import java.util.Random; | ||
|
||
public class RandomNumberGenerator implements NumberGenerator { | ||
private final int MAX = 10; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
상수는 static
을 붙여주는게 좋을것 같아!
@@ -0,0 +1,13 @@ | |||
package racing.util; | |||
|
|||
public class RandomUtil { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
사용되는 메서드의 이름이 public static int getRandomDistance
인데 클래스의 이름이 RandomUtil
인 것은 조금 어색한것 같아 의미를 더 드러낼수 있도록 네이밍을 수정해 보는건 어떨까?
|
||
public int inputCarCount() { | ||
System.out.println(FIRST_QUESTION); | ||
return new InputCount(sc.nextInt()).getCount(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
단순히 검증을 거쳤다 바깥으로 반환하는 용도로 사용하고 있는 객체인데
검증 로직을 한번 안쪽으로 숨긴것 밖에 안되는 것 같아!
객체 자체를 바깥으로 내보내서 사용하게 하는건 어떨까?
@DisplayName("자동차가 랜덤으로 들어온 값이 4이상일 때 전진한다.") | ||
@ParameterizedTest | ||
@ValueSource(ints = {4, 9}) | ||
void move1(int distance) { | ||
Car car = new Car(distance); | ||
car.move(RandomUtil.getRandomDistance(new FixedNumberGenerator(distance))); | ||
assertEquals(distance + 1, car.getDistance()); | ||
} | ||
|
||
@DisplayName("자동차가 랜덤으로 들어온 값이 4 보다 작을 때 움직이지 않는다.") | ||
@ParameterizedTest | ||
@ValueSource(ints = {1, 2}) | ||
void move2(int distance) { | ||
Car car = new Car(distance); | ||
car.move(RandomUtil.getRandomDistance(new FixedNumberGenerator(distance))); | ||
assertEquals(distance, car.getDistance()); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
두개의 테스트 코드를 하나로 합쳐보자!
@CsvSource
를 잘 사용한다면 하나로 통합할 수 있어!
@DisplayName("랜덤으로 생성된 값이 4보다 작을경우 0을 리턴한다.") | ||
@ParameterizedTest | ||
@ValueSource(ints = {1, 3}) | ||
public void getRandomDistance1(int distance) { | ||
int actual = RandomUtil.getRandomDistance(new FixedNumberGenerator(distance)); | ||
assertEquals(0, actual); | ||
} | ||
|
||
@DisplayName("랜덤으로 생성된 값이 4 이상을 경우 1을 리턴한다.") | ||
@ParameterizedTest | ||
@ValueSource(ints = {4, 5}) | ||
public void getRandomDistance2(int distance) { | ||
int actual = RandomUtil.getRandomDistance(new FixedNumberGenerator(distance)); | ||
assertEquals(1, actual); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이것 또한 하나로 합칠수 있을것 같아!
private final String OPERATE_RESULT = "실행 결과"; | ||
private final String DISTANCE = "-"; | ||
private final String ENTER = "\n"; | ||
private final String BORDER = "라운드 종료!!"; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
매직넘버와 매직리터럴은 static
을 붙여주는게 좋아!
@@ -4,10 +4,10 @@ | |||
import java.util.List; | |||
|
|||
public class CarFactory { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
굿 좋습니다b 기존코드와의 변경사항이 적어서 좋네요
return racingResult | ||
.stream() | ||
.filter(car -> (car.getDistance() == maxDistance)) | ||
.map(car -> car.getName()) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
람다를 사용할 때 car::getName 와 같은 참조 사용방식도 있습니다! 바꾸라는게 아니라 그런 방식도 있다는 그런..ㅎㅎ
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
오 이렇게 또 하나 알아갑니다 ㅎㅎ 감사합니다!
|
||
public class RacingResult { | ||
private final List<Integer> racingResult; | ||
private final List<Car> racingResult; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
여기서 RacingResult는 Cars 에서 움직임이 끝난 Car 객체들의 리스트를 받아서 수행을 하는데요..!!
기현님 의도가 Cars는 정말 게임을 실행하는 일급 컬렉션, RacingResult는 Cars에서 실행이 끝난 객체를 확인하는 일급 컬렉션으로 이해했습니다. (그런면에서 new Car() 를 이용해서 객체를 복사하는 효과를 낸 의도도 좋습니다b)
이때 RacingResult도 List를 담고있는데요, 이때 Car 대신에 다른 객체를 두면 좋을 것 같아요.
왜냐하면 현재 Car 객체에는 move라는 메서드가 있으니까..! Car 대신 Car의 내용(name, distance)을 담고있는 VO 객체를 주면 좋을 것 같습니다.
만약, 누군가가 RacingResult 클래스를 수정한다고 할 때. 현재 상태라면 RacingResult에서 racingResult.get(0).move() 와 같이 접근해서, List 에 있는 Car의 위치를 조작하는 메서드를 만들 수 있기 때문입니다.
따라서 위에서 RacingResult를 생성할 때 VO 객체를 만들어서, 이 객체 안에는 move와 같이, 객체의 상태를 변경하는 메서드를 제공하지 않아 불변 객체로 만드는 방식을 생각할 수 있을 것 같습니다. 만약 그 객체 이름이 CarData가 된다면
List<CarData> racingResulut;
new CarData(car.name, car.distance);
class final CarData{
}
위 코드가 살짝의 키워드가 될 수 있겠네요.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
와 그렇네요. 좀 더 깊게 생각해야 될 거 같습니다! 감사합니다. 또 하나 배웁니다!
첫 번째 자동차 경주 게임입니다!