Skip to content

Apply feedback #9

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

Open
wants to merge 28 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
492b3aa
init: TestCase 코드 추가
jihunparkme Apr 25, 2022
4a2d86a
fix: rename practice package
jihunparkme Apr 25, 2022
ae5b92b
add: 빈 문자열 또는 null 값을 입력할 경우 0을 반환
jihunparkme Apr 25, 2022
5cc100e
add: 숫자 하나를 문자열로 입력할 경우 해당 숫자를 반환
jihunparkme Apr 25, 2022
75b4f9b
refactor: extract method
jihunparkme Apr 25, 2022
420c303
add: 숫자 두개를 컴마(,) 구분자로 입력할 경우 두 숫자의 합을 반환
jihunparkme Apr 25, 2022
9cd63d3
add: 구분자를 컴마(,) 이외에 콜론(:)을 사용 가능
jihunparkme Apr 25, 2022
e3d4cec
add: '//'와 '\n' 문자 사이에 커스텀 구분자를 지정 가능
jihunparkme Apr 25, 2022
da14f6b
add: 음수를 전달할 경우 RuntimeException 예외가 발생
jihunparkme Apr 25, 2022
e0387d0
refactor: reduce the size of method
jihunparkme Apr 26, 2022
95da594
add: Functional requirements
jihunparkme May 2, 2022
1ef1e03
add: 각 자동차에 이름을 부여할 수 있다.
jihunparkme May 2, 2022
e99a5b3
add: 자동차 이름은 5자를 초과할 수 없다.
jihunparkme May 2, 2022
fdfab61
add: 자동차 이름은 공백일 수 없다.
jihunparkme May 2, 2022
01d0496
add: 자동차 이름을 포장
jihunparkme May 2, 2022
5da4f60
add: 자동차의 처음 위치는 0
jihunparkme May 2, 2022
c2125f7
refactor: change the class name from CarName to Name
jihunparkme May 2, 2022
9928ba1
add: 자동차 위치 포장
jihunparkme May 2, 2022
0af4a78
add: 자동차는 자신의 상태를 출력
jihunparkme May 2, 2022
a586f1d
add: random 값이 4이상일 경우 전진
jihunparkme May 3, 2022
0bc3301
add: 자동차 이름은 쉼표(,)를 기준으로 구분
jihunparkme May 3, 2022
d0e8d08
add: Cars 를 일급 컬렉션으로
jihunparkme May 3, 2022
c28e9dd
add: Cars 생성자 수정
jihunparkme May 4, 2022
1f6b79a
add: 자동차 경주 게임을 완료한 후 누가 우승했는지를 리턴
jihunparkme May 4, 2022
4c2c300
add: 자동차 경주 게임 마무리
jihunparkme May 5, 2022
93bcb79
add: 자동차 경주 게임 마무리
jihunparkme May 5, 2022
8549247
refactor: 메시지 전달
jihunparkme May 5, 2022
9937de1
refactor:
jihunparkme May 5, 2022
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
82 changes: 65 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,26 +1,74 @@
## [NEXTSTEP 플레이그라운드의 미션 진행 과정](https://github.com/next-step/nextstep-docs/blob/master/playground/README.md)
## 기능 요구사항

---
## 학습 효과를 높이기 위해 추천하는 미션 진행 방법
각 자동차에 이름을 부여할 수 있다. 자동차 이름은 5자를 초과할 수 없다.
전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다.
자동차 이름은 쉼표(,)를 기준으로 구분한다.
전진하는 조건은 0에서 9 사이에서 random 값을 구한 후 random 값이 4이상일 경우이다.
자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. 우승자는 한명 이상일 수 있다.

---
1. 피드백 강의 전까지 미션 진행
> 피드백 강의 전까지 혼자 힘으로 미션 진행. 미션을 진행하면서 하나의 작업이 끝날 때 마다 add, commit
> 예를 들어 다음 숫자 야구 게임의 경우 0, 1, 2단계까지 구현을 완료한 후 push

![mission baseball](https://raw.githubusercontent.com/next-step/nextstep-docs/master/playground/images/mission_baseball.png)
## 기능 목록

---
2. 피드백 앞 단계까지 미션 구현을 완료한 후 피드백 강의를 학습한다.
- [x] 레이싱 게임 클래스
- [x] 자동차 이름은 쉼표(,)를 기준으로 구분
- [x] 자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. 우승자는 한명 이상일 수 있다.
- [x] 자동차 클래스
- [x] 각 자동차에 이름을 부여할 수 있다.
- [x] 자동차 이름은 5자를 초과할 수 없다.
- [x] 자동차 이름이 공백일 수 없다.
- [x] 자동차의 처음 위치는 0이다.
- [x] 자신의 이름:상태를 출력할 수 있다.
- [x] 0에서 9 사이에서 random 값을 구한 후 random 값이 4이상일 경우 전진할 수 있다.

---
3. Git 브랜치를 master 또는 main으로 변경한 후 피드백을 반영하기 위한 새로운 브랜치를 생성한 후 처음부터 다시 미션 구현을 도전한다.

```
git branch -a // 모든 로컬 브랜치 확인
git checkout master // 기본 브랜치가 master인 경우
git checkout main // 기본 브랜치가 main인 경우
## 프로그래밍 요구사항

- 자바 코드 컨벤션을 지키면서 프로그래밍한다.
- indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다. 2까지만 허용한다.
- else 예약어를 쓰지 않는다.
- 3항 연산자를 쓰지 않는다.
- 함수(또는 메소드)가 한 가지 일만 하도록 최대한 작게 만들어라.
- 모든 기능을 TDD로 구현해 단위 테스트가 존재해야 한다. 단, UI(System.out, System.in) 로직은 제외
- 핵심 로직을 구현하는 코드와 UI를 담당하는 로직을 구분한다.
- UI 로직을 InputView, ResultView와 같은 클래스를 추가해 분리한다.
- 모든 원시 값과 문자열을 포장한다.
- getter 값 비교가 아닌 객체 비교를 해보자.
- 일급 컬렉션을 쓴다.

## Sample

```text
경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분).
pobi,crong,honux
시도할 회수는 몇회인가요?
5

실행 결과
pobi : -
crong : -
honux : -

pobi : --
crong : -
honux : --

pobi : ---
crong : --
honux : ---

pobi : ----
crong : ---
honux : ----

pobi : -----
crong : ----
honux : -----

pobi : -----
crong : ----
honux : -----

git checkout -b 브랜치이름
ex) git checkout -b apply-feedback
```
pobi, honux가 최종 우승했습니다.
```
3 changes: 2 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,14 @@ apply plugin: 'eclipse'

group = 'camp.nextstep'
version = '1.0.0'
sourceCompatibility = '1.8'
sourceCompatibility = '11'

repositories {
mavenCentral()
}

dependencies {
implementation 'org.apache.commons:commons-lang3:3.12.0'
testImplementation "org.junit.jupiter:junit-jupiter:5.7.2"
testImplementation "org.assertj:assertj-core:3.19.0"
}
Expand Down
71 changes: 71 additions & 0 deletions src/main/java/calculator/StringAddCalculator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package calculator;

import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

public class StringAddCalculator {
public static int splitAndSum(String text) {

if (isNullOrEmpty(text)) {
return 0;
}

if (isSingleNumber(text)) {
return Integer.parseInt(text);
}

return getSum(text);
}

private static int getSum(String text) {
int sum = 0;

List<Integer> nums = getNumbers(text);
for (Integer num : nums) {
sum += num;
}

return sum;
}

private static List<Integer> getNumbers(String text) {
Matcher m = Pattern.compile("//(.)\n(.*)").matcher(text);
if (m.find()) {
return splitText(m.group(2));
}

return splitText(text);
}

private static List<Integer> splitText(String text) {
return Arrays.stream(text.split(",|;|:"))
.map(num -> {
return verifyNumber(num);
})
.collect(Collectors.toList());
}

private static int verifyNumber(String text) {
int num = Integer.parseInt(text);
if (num < 0) {
throw new RuntimeException("Negative numbers cannot be passed.");
}

return num;
}

private static boolean isSingleNumber(String text) {
return text.length() == 1;
}

private static boolean isNullOrEmpty(String text) {
if (text == null || text.isEmpty()) {
return true;
}

return false;
}
}
58 changes: 58 additions & 0 deletions src/main/java/racingcar/Car.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package racingcar;

import java.util.Objects;

public class Car {
private static final int FORWARD_NUM = 4;

private final Name name;
private Position position;

public Car(String name) {
this(name, 0);
}

public Car(String name, int position) {
this.name = new Name(name);
this.position = new Position(position);
}

public Name getName() {
return name;
}

public void forward(int randomNo) {
if (randomNo >= FORWARD_NUM) {
position.move();
}
}

public Position getMaxPosition(Position maxPosition) {
if (position.lessThan(maxPosition)) {
return maxPosition;
}
return position;
}

public boolean isWinner(Position maxPosition) {
return position.equals(maxPosition);
}

@Override
public String toString() {
return name.toString() + " : " + position.toString();
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Car car = (Car) o;
return Objects.equals(name, car.name) && Objects.equals(position, car.position);
}

@Override
public int hashCode() {
return Objects.hash(name, position);
}
}
74 changes: 74 additions & 0 deletions src/main/java/racingcar/Cars.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package racingcar;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Random;

public class Cars {
private List<Car> cars;
private static final int MAX_BOUND = 10;

public Cars(List<Car> cars) {
this.cars = cars;
}

public List<Car> getCars() {
return cars;
}

public void start() {
for (Car car : cars) {
car.forward(getRandomNumber());
}
}

private int getRandomNumber() {
return new Random().nextInt(MAX_BOUND);
}

public List<Car> findWinners() {
Position maxPosition = findMaxPosition();
List<Car> winner = new ArrayList<>();
for (Car car : cars) {
if (car.isWinner(maxPosition)) {
winner.add(car);
}
}

return winner;
}

private Position findMaxPosition() {
Position position = new Position();
for (Car car : cars) {
position = car.getMaxPosition(position);
}

return position;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Cars cars1 = (Cars) o;

return Objects.equals(cars, cars1.cars);
}

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

@Override
public String toString() {
StringBuilder sb = new StringBuilder();
for (Car car : cars) {
sb.append(car.toString()).append("\n");
}

return sb.toString();
}
}
14 changes: 14 additions & 0 deletions src/main/java/racingcar/Game.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package racingcar;

public class Game {
public static void main(String[] args) {
InputView inputView = new InputView();
ResultView resultView = new ResultView();

String carNames = inputView.inputCarNames();
int count = inputView.inputCount();
RacingGame racingGame = new RacingGame(carNames, count);

racingGame.start(resultView);
}
}
17 changes: 17 additions & 0 deletions src/main/java/racingcar/InputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package racingcar;

import java.util.Scanner;

public class InputView {
private Scanner scanner = new Scanner(System.in);

public String inputCarNames() {
System.out.println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분).");
return scanner.nextLine();
}

public int inputCount() {
System.out.println("시도할 회수는 몇회인가요?");
return Integer.parseInt(scanner.nextLine());
}
}
39 changes: 39 additions & 0 deletions src/main/java/racingcar/Name.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package racingcar;

import org.apache.commons.lang3.StringUtils;

import java.util.Objects;

public class Name {
private final String name;

public Name(String name) {
if (name.length() > 5) {
throw new IllegalArgumentException("자동차 이름은 5자를 초과할 수 없습니다.");
}

if (StringUtils.isEmpty(name)) {
throw new IllegalArgumentException("자동차 이름은 공백일 수 없습니다.");
}

this.name = name;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Name carName = (Name) o;
return Objects.equals(name, carName.name);
}

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

@Override
public String toString() {
return name;
}
}
Loading