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

3주차 - Step4 사다리(리팩토링) 리뷰요청 드립니다..! #221

Merged
merged 31 commits into from
Jul 14, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
6e9f9e1
[step4] refactor : 매직넘버를 상수로 치환
Integerous Jul 8, 2019
36b16d6
[step4] refactor : 데이터를 가진 객체에 메세지 던지도록 수정
Integerous Jul 8, 2019
67d2cab
[step4] refactor : 인터페이스에 상수 선언 대신 상수 유틸리티 클래스 사용
Integerous Jul 8, 2019
517b95b
[step4] refactor : 필요없어진 NameFormatter 인터페이스와 구현체 제거
Integerous Jul 8, 2019
9f986da
[step4] refactor : 의미 모호한 메서드명 수정
Integerous Jul 8, 2019
3f1cd73
[step4] feat : Players와 Prizes를 가진 GameInfo 클래스 생성
Integerous Jul 8, 2019
7007291
[step4] refactor : 상품수와 플레이어수 유효성 체크를 GameInfo에서 처리
Integerous Jul 8, 2019
4b480c7
[step4] refactor : OutputView로 넘기는 인자들(Players, Prizes)을 GameInfo로 변경
Integerous Jul 8, 2019
b2ca7a0
[step4] refactor : GameResult로 넘기는 인자들(Players, Prizes)을 GameInfo로 변경
Integerous Jul 8, 2019
523ab5d
[step4] refactor : 필요없어진 NameConstants(상수 유틸리티 클래스) 제거
Integerous Jul 8, 2019
4e73f72
[step4] refactor : 데이터를 꺼내지 않고 isMovableToLeft() 메서드로 Position 객체에 메세…
Integerous Jul 8, 2019
7095da7
[step4] docs : Bar 객체가 방향 갖도록 하는 것에 대한 질문 추가
Integerous Jul 8, 2019
6eecba5
[step4] feat : GameInfo와 Ladder를 가진 LadderGame 클래스 생성
Integerous Jul 9, 2019
ec65edf
[step4] refactor : OutputView에서 LadderGame 사용
Integerous Jul 9, 2019
f022beb
[step4] refactor : LadderGame에서 GameResult 생성하도록 개선
Integerous Jul 9, 2019
e01a085
[step4] refactor : Bar가 2개의 방향을 가지도록 수정
Integerous Jul 9, 2019
0710847
[step4] refactor : if문 조건을 부정에서 긍정으로 변경
Jul 12, 2019
e816327
[step4] feat : Point 인스턴스의 생성조건에 따라 연결 방향을 표현하는 Enum 추가
Jul 12, 2019
dd61845
[step4] feat : Point 객체 생성
Jul 12, 2019
af8fcc9
[step4] refactor : Line 생성 로직을 bars에서 points로 변경
Jul 12, 2019
bf0128d
[step4] refactor : 중복 제거 (방향 선택 로직)
Jul 12, 2019
e95d7f1
[step4] refactor : Point 이동 로직을 Direction에 위임, Bar 객체 삭제
Jul 12, 2019
9c8d496
[step4] refactor : Point에서 다음 index 생성을 Position에서 하도록 변경
Jul 12, 2019
5991053
[step4] refactor : 남아있던 Bar 네이밍들 제거
Jul 12, 2019
a9a41cc
[step4] fix : Direction이 무조건 PASS로 결정되는 문제 해결
Integerous Jul 13, 2019
d13b90a
[step4] refactor : Ladder가 Players에 의존하지 않도록 수정
Integerous Jul 13, 2019
67490e5
[step4] test : 테스트 추가 및 변경
Integerous Jul 13, 2019
19296be
[step4] refactor : 가로라인 중복 불가 명시
Integerous Jul 13, 2019
0de28b6
[step4] refactor : 가로라인 중복 체크 로직 제거
Integerous Jul 14, 2019
fa0bee8
[step4] refactor : 의미 없는 공백 제거
Integerous Jul 14, 2019
075030b
[step4] refactor : 네이밍 변경 (PointGenerator -> PointIndicator)
Integerous Jul 14, 2019
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
19 changes: 10 additions & 9 deletions src/main/java/ladder/Application.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,24 @@
import ladder.view.InputView;
import ladder.view.OutputView;

import java.util.HashMap;
import java.util.Map;

public class Application {
private static final String ALL_RESULTS = "all";

public static void main(String[] args) {
Players players = Players.of(InputView.askPlayers());
Prizes prizes = Prizes.from(InputView.askPrizes(), players.numberOfPlayers());
Prizes prizes = Prizes.from(InputView.askPrizes());
Height height = Height.from(InputView.askHeight());

Ladder ladder = Ladder.from(players, height);
OutputView.drawLadder(players, ladder, prizes);
GameInfo gameInfo = GameInfo.of(players, prizes);
Ladder ladder = Ladder.from(players.numberOfPlayers(), height);

GameResult gameResult = GameResult.of(players, ladder, prizes);
String wantedPlayer = InputView.askWhichResultWant();
LadderGame ladderGame = LadderGame.of(gameInfo, ladder);
GameResult gameResult = ladderGame.playGame();

if ("all".equals(wantedPlayer)) {
OutputView.printGame(ladderGame);

String wantedPlayer = InputView.askWhichResultWant();
if (ALL_RESULTS.equals(wantedPlayer)) {
OutputView.printAllResult(gameResult);
return;
}
Expand Down
18 changes: 0 additions & 18 deletions src/main/java/ladder/domain/Bar.java

This file was deleted.

7 changes: 0 additions & 7 deletions src/main/java/ladder/domain/BarGenerator.java

This file was deleted.

30 changes: 30 additions & 0 deletions src/main/java/ladder/domain/Direction.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package ladder.domain;

public enum Direction {

LEFT(true, false),
RIGHT(false, true),
PASS(false, false);

private boolean left;
private boolean right;

Direction(boolean left, boolean right) {
this.left = left;
this.right = right;
}

public boolean isRight() {
return right;
}

public Position move(Position position) {
if (left && !right) {
return position.moveToLeft();
}
if (!left && right) {
return position.moveToRight();
}
return position;
}
}
44 changes: 44 additions & 0 deletions src/main/java/ladder/domain/GameInfo.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package ladder.domain;

public class GameInfo {
static final String ALERT_INVALID_NUMBER_OF_PRIZES = "상품의 수는 참여자 수와 같아야 합니다.";

private final Players players;
private final Prizes prizes;

private GameInfo(Players players, Prizes prizes) {
validationPrizes(players, prizes);
this.players = players;
this.prizes = prizes;
}

public static GameInfo of(Players players, Prizes prizes) {
return new GameInfo(players, prizes);
}

private void validationPrizes(Players players, Prizes prizes) {
if (players.numberOfPlayers() != prizes.numberOfPrizes()) {
throw new IllegalArgumentException(ALERT_INVALID_NUMBER_OF_PRIZES);
}
}

Player findPlayerByIndex(int index) {
return players.findPlayerByIndex(index);
}

Prize findPrizeByPosition(Position finalPosition) {
return prizes.findPrizeByPosition(finalPosition);
}

int numberOfPlayers() {
return players.numberOfPlayers();
}

public Players getPlayers() {
return players;
}

public Prizes getPrizes() {
return prizes;
}
}
18 changes: 2 additions & 16 deletions src/main/java/ladder/domain/GameResult.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,22 +13,8 @@ private GameResult(Map<Player, Prize> resultMap) {
this.resultMap = new HashMap<>(resultMap);
}

public static GameResult of(Players players, Ladder ladder, Prizes prizes) {
return new GameResult(playGame(players, ladder, prizes));
}

private static Map<Player, Prize> playGame(Players players, Ladder ladder, Prizes prizes) {
Map<Player, Prize> resultMap = new HashMap<>();
int numberOfPlayers = players.numberOfPlayers();

for (int i = 0; i < numberOfPlayers; i++) {
Player player = players.getPlayers().get(i);
Position finalPosition = ladder.goThroughLinesFrom(Position.from(i));
Prize prize = prizes.getPrizes().get(finalPosition.getPosition());

resultMap.put(player, prize);
}
return resultMap;
public static GameResult from(Map<Player, Prize> resultMap) {
return new GameResult(resultMap);
}

public String findResult(String wantedPlayer) {
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/ladder/domain/Ladder.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@ private Ladder(List<Line> lines) {
this.lines = new ArrayList<>(lines);
}

public static Ladder from(Players players, Height height) {
public static Ladder from(int numberOfPlayers, Height height) {
return new Ladder(IntStream
.range(0, height.getHeight())
.mapToObj((integer) -> Line.from(players.numberOfPlayers()))
.mapToObj((integer) -> Line.from(numberOfPlayers))
.collect(Collectors.toList()));
}

Expand Down
45 changes: 45 additions & 0 deletions src/main/java/ladder/domain/LadderGame.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package ladder.domain;

import java.util.HashMap;
import java.util.Map;

public class LadderGame {

private final GameInfo gameInfo;
private final Ladder ladder;

private LadderGame(GameInfo gameInfo, Ladder ladder) {
this.gameInfo = gameInfo;
this.ladder = ladder;
}

public static LadderGame of(GameInfo gameInfo, Ladder ladder) {
return new LadderGame(gameInfo, ladder);
}

public GameResult playGame() {
Map<Player, Prize> resultMap = new HashMap<>();
int numberOfPlayers = gameInfo.numberOfPlayers();

for (int index = 0; index < numberOfPlayers; index++) {
Player player = gameInfo.findPlayerByIndex(index);
Position finalPosition = ladder.goThroughLinesFrom(Position.from(index));
Prize prize = gameInfo.findPrizeByPosition(finalPosition);

resultMap.put(player, prize);
}
return GameResult.from(resultMap);
}

public Players getPlayers() {
return gameInfo.getPlayers();
}

public Prizes getPrizes() {
return gameInfo.getPrizes();
}

public Ladder getLadder() {
return ladder;
}
}
27 changes: 10 additions & 17 deletions src/main/java/ladder/domain/Line.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,29 +6,22 @@

public class Line {

private List<Bar> bars;
private List<Point> points;

Line(List<Bar> bars) {
this.bars = new ArrayList<>(bars);
Line(List<Point> points) {
this.points = new ArrayList<>(points);
}

public static Line from(int numberOfPlayers) {
LineMaker lineMaker = new LineMaker();
return new Line(lineMaker.generateBars(numberOfPlayers));
}

public List<Bar> getBars() {
return Collections.unmodifiableList(bars);
return new Line(lineMaker.generatePoints(numberOfPlayers));
}

Position travel(Position position) {
if (bars.get(position.getPosition()).isExist()) { //사용자의 현재 위치와 bar의 위치가 같으면 사용자의 현재위치가 1만큼 증가
return position.moveToRight();
}
if (position.getPosition() > 0 && bars.get(position.getLeftPosition()).isExist()) { //사용자의 현재 위치보다 bar의 위치가 1만큼 작으면 사용자의 현재위치는 1만큼 감소
return position.moveToLeft();
}
return position;
} //TODO: 이 로직을 Bar 객체로 위임하고 싶은데, Bar 2개를 사용해서 위치를 갱신하는 방식이라 이 곳에서 처리하는 상태
return points.get(position.getPosition()).move(position);
}

}
public List<Point> getPoints() {
return Collections.unmodifiableList(points);
}
}
54 changes: 32 additions & 22 deletions src/main/java/ladder/domain/LineMaker.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,40 +4,50 @@
import java.util.List;

class LineMaker {
private static final int NUMBER_OF_FIRST_AND_LAST_BAR = 2;
private static final int NUMBER_OF_FIRST_AND_LAST_POINT = 2;

private List<Bar> randomBars;
private RandomBarGenerator barGenerator = new RandomBarGenerator();
private List<Point> randomPoints;
private RandomPointGenerator pointGenerator = new RandomPointGenerator();

List<Bar> generateBars(int numberOfPlayers) {
this.randomBars = new ArrayList<>();
generateFirstBar();
generateMiddleBars(numberOfPlayers);
generateLastBar();
return randomBars;
List<Point> generatePoints(int numberOfPlayers) {
this.randomPoints = new ArrayList<>();
generateFirstPoint();
generateMiddlePoints(numberOfPlayers);
generateLastPoint();
return randomPoints;
}

private void generateFirstBar() {
randomBars.add(Bar.from(barGenerator.generateBar()));
private void generateFirstPoint() {
randomPoints.add(Point.makeFirstPoint(chooseDirection()));
}

private void generateMiddleBars(int numberOfPlayers) {
int spaceForMiddleBars = numberOfPlayers - NUMBER_OF_FIRST_AND_LAST_BAR;
for (int i = 0; i < spaceForMiddleBars; i++) {
Bar previousBar = randomBars.get(i);
addNextBar(previousBar);
private void generateMiddlePoints(int numberOfPlayers) {
int spaceForMiddlePoints = numberOfPlayers - NUMBER_OF_FIRST_AND_LAST_POINT;
for (int i = 0; i < spaceForMiddlePoints; i++) {
Point previousPoint = randomPoints.get(i);
addNextPoint(previousPoint);
}
}

private void addNextBar(Bar previousBar) {
if (previousBar.isExist()) {
generateLastBar();
private void addNextPoint(Point previousPoint) {
if (previousPoint.isDirectionRight()) {
randomPoints.add(previousPoint.makeNextPoint(Direction.LEFT));
return;
}
randomBars.add(Bar.from(barGenerator.generateBar()));
randomPoints.add(previousPoint.makeNextPoint(chooseDirection()));
}

private void generateLastBar() {
randomBars.add(Bar.from(Boolean.FALSE));
private void generateLastPoint() {
int currentlyLastIndex = randomPoints.size() - 1;
Point secondToLastPoint = randomPoints.get(currentlyLastIndex);
randomPoints.add(secondToLastPoint.makeLastPoint());
}

private Direction chooseDirection() {
Direction direction = Direction.PASS;
if (pointGenerator.generatePoint()) {
direction = Direction.RIGHT;
}
return direction;
}
}
4 changes: 4 additions & 0 deletions src/main/java/ladder/domain/Players.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,10 @@ public int numberOfPlayers() {
return players.size();
}

Player findPlayerByIndex(int index) {
return players.get(index);
}

public List<Player> getPlayers() {
return Collections.unmodifiableList(players);
}
Expand Down
Loading