Skip to content

Commit

Permalink
step#3 - goodbye bowling...! 최고의 공부였습니다 있는 조건에서 문제 해결하기(하나의 문제를 해결하려고…
Browse files Browse the repository at this point in the history
… 새로운 것부터 만들려고 하지말자를 배웠습니다)
  • Loading branch information
imjinbro committed Apr 21, 2018
1 parent 75b69ee commit 969ac95
Show file tree
Hide file tree
Showing 13 changed files with 102 additions and 298 deletions.
10 changes: 1 addition & 9 deletions src/main/java/domain/frame/Frame.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,12 @@
import domain.frame.result.FrameResult;
import domain.frame.result.Score;

import static domain.frame.result.Board.isLimit;

public interface Frame {
int CANNOT_CALC_SCORE_STATE = -1;

static Frame of(int frameNum) {
if (frameNum == Board.LIMIT) {
return new LastFrame(frameNum);
return new LastFrame();
}
return new NormalFrame(frameNum);
}
Expand All @@ -24,17 +22,11 @@ static Frame of(int frameNum) {

boolean isFinish();

boolean isDiff(Frame frame);

Board getBoard();

void addFrameResult(Board board);

FrameResult getResult();

int getRemainingPin();

Score addRemainingPin(Score beforeFrameScore);

Score AddAdditionalRemainingPin(Score unFinishedScore);
}
2 changes: 1 addition & 1 deletion src/main/java/domain/frame/Frames.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public void roll(int num) throws IllegalArgumentException {
}

private void checkFrameAdd(Frame resultFrame) {
if (getCurrentFrame().isDiff(resultFrame)) {
if (getCurrentFrame() != resultFrame) {
frames.add(resultFrame);
}
}
Expand Down
81 changes: 45 additions & 36 deletions src/main/java/domain/frame/LastFrame.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,38 +2,51 @@

import domain.frame.pin.Pin;
import domain.frame.result.Board;
import domain.frame.result.CannotCalcException;
import domain.frame.result.FrameResult;
import domain.frame.result.Score;
import domain.frame.result.ScoreMessage;
import domain.frame.status.FrameStatus;
import domain.frame.status.Ready;

import java.util.ArrayList;
import java.util.LinkedList;

import static domain.frame.result.ScoreMessage.getMessage;
import static java.util.stream.Collectors.joining;

public class LastFrame implements Frame {
private final int frameNum;
// 사실상 BonusStatus 중복이었음
private ArrayList<FrameStatus> states = new ArrayList<>();
private LinkedList<FrameStatus> states = new LinkedList<>();

public LastFrame(int frameNum) {
this.frameNum = frameNum;
public LastFrame() {
states.add(new Ready());
}

@Override
public Frame roll(int num) throws IllegalArgumentException {
FrameStatus status = getRecentlyStatus();
status = status.roll(new Pin(num));
if (status.isFinish()) {
states.add(status);
return this;
FrameStatus resultStatus = getRecentlyStatus().roll(new Pin(num));
replaceRecentlyStatus(resultStatus);
if (getRecentlyScore().hasBonusCount()) {
addReadyStatus(num);
}
states.add(0, status);
return this;
}

public FrameStatus getRecentlyStatus() {
return states.get(states.size() - 1);
private void replaceRecentlyStatus(FrameStatus status) {
states.set(states.indexOf(getRecentlyStatus()), status);
}

private void addReadyStatus(int num) { // pin num과 status로 충분히 평가 가능한거 같은데 Pin.isMax가 있으니
if (states.size() > 2 || (states.size() == 2 && !Pin.isMax(num))) {
return;
}
states.add(new Ready());
}

private FrameStatus getRecentlyStatus() {
return states.getLast();
}

private Score getRecentlyScore() {
return states.getLast().getScore();
}

@Override
Expand All @@ -43,25 +56,17 @@ public boolean isLast() {

@Override
public boolean isFinish() {
FrameStatus recentlyStatus = getRecentlyStatus();
return recentlyStatus.isFinish();
}

@Override
public boolean isDiff(Frame frame) {
return this == frame;
return getRecentlyStatus().isFinish();
}

@Override
public int getFrameNum() {
return frameNum;
return 10;
}

/************ 여기부터 다시 구현 **************/

@Override
public Board getBoard() {
throw new UnsupportedOperationException(); // 다음 넥스트 프레임이 없음
throw new UnsupportedOperationException(); // 다음 프레임이 없으니깐
}

@Override
Expand All @@ -72,22 +77,26 @@ public void addFrameResult(Board board) {

@Override
public FrameResult getResult() {
return null;
if (!isFinish()) {
return new FrameResult(getResultMessage(), Frame.CANNOT_CALC_SCORE_STATE);
}
return new FrameResult(getResultMessage(), getScore());
}

@Override
public int getRemainingPin() {
Score score = getRecentlyStatus().getScore();
return score.get();
private String getResultMessage() {
return states.stream().filter(status -> !status.getResultMessage().equals("")).map(FrameStatus::getResultMessage).collect(joining(getMessage(ScoreMessage.MODIFIER)));
}

@Override
public Score addRemainingPin(Score beforeFrameScore) {
return null;
private int getScore() {
return states.stream().mapToInt(frameStatus -> frameStatus.getScore().get()).sum();
}

@Override
public Score AddAdditionalRemainingPin(Score unFinishedScore) {
throw new CannotCalcException();
public Score addRemainingPin(Score beforeFrameScore) {
Score score = beforeFrameScore;
for (FrameStatus status : states) {
score = status.addBonusScore(beforeFrameScore);
}
return score;
}
}
38 changes: 7 additions & 31 deletions src/main/java/domain/frame/NormalFrame.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import domain.frame.pin.Pin;
import domain.frame.result.Board;
import domain.frame.result.CannotCalcException;
import domain.frame.result.FrameResult;
import domain.frame.result.Score;
import domain.frame.status.FrameStatus;
Expand Down Expand Up @@ -38,11 +37,6 @@ public boolean isFinish() {
return status.isFinish();
}

@Override
public boolean isDiff(Frame frame) {
return this == frame;
}

@Override
public int getFrameNum() {
return frameNum;
Expand All @@ -67,47 +61,29 @@ public void addFrameResult(Board board) {
@Override
public FrameResult getResult() {
if (!isFinish()) {
return new FrameResult(getScoreMessage(), CANNOT_CALC_SCORE_STATE);
return new FrameResult(status.getResultMessage(), CANNOT_CALC_SCORE_STATE);
}
return new FrameResult(getScoreMessage(), getScore());
}

private String getScoreMessage() {
return status.getResultMessage();
return new FrameResult(status.getResultMessage(), getScore());
}

private int getScore() {
try {
return getRemainingPin();
} catch (CannotCalcException e) {
return CANNOT_CALC_SCORE_STATE;
}
}

@Override
public int getRemainingPin() throws CannotCalcException {
Score score = status.getScore();
if (!score.hasBonusCount()) {
return score.get();
}
score = nextFrame.addRemainingPin(score);
if (score.hasBonusCount()) {
return Frame.CANNOT_CALC_SCORE_STATE;
}
return score.get();
}

@Override
public Score addRemainingPin(Score beforeFrameScore) {
Score totalScore = status.addBonusScore(beforeFrameScore);
if (totalScore.hasBonusCount()) {
return nextFrame.AddAdditionalRemainingPin(totalScore);
if (nextFrame != null && totalScore.hasBonusCount()) {
return nextFrame.addRemainingPin(totalScore);
}
return totalScore;
}

@Override
public Score AddAdditionalRemainingPin(Score unFinishedScore) throws CannotCalcException {
if (nextFrame == null) {
throw new CannotCalcException();
}
return nextFrame.addRemainingPin(unFinishedScore);
}
}
4 changes: 4 additions & 0 deletions src/main/java/domain/frame/pin/Pin.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@ public Pin(int num) {
this.num = num;
}

public static boolean isMax(int num) {
return num == MAX;
}

public boolean isMax() {
return this.num == MAX;
}
Expand Down
13 changes: 0 additions & 13 deletions src/main/java/domain/frame/result/CannotCalcException.java

This file was deleted.

9 changes: 5 additions & 4 deletions src/main/java/domain/frame/result/Score.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ public class Score {
private int score;
private int leftNum;

public Score(int score) {
this(score, 0);
}

public Score(int score, int leftNum) {
this.score = score;
this.leftNum = leftNum;
Expand All @@ -23,10 +27,7 @@ public boolean hasBonusCount() {
return leftNum != 0;
}

public int get() throws CannotCalcException {
if (hasBonusCount()) {
throw new CannotCalcException();
}
public int get() {
return score;
}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
package domain.frame.status;

import domain.frame.Frame;
import domain.frame.pin.Pin;
import domain.frame.result.Score;

import static domain.frame.result.ScoreMessage.convertMessage;

public class Ing implements FrameStatus {
public class FirstBowl implements FrameStatus {
private Pin pin;

public Ing(Pin newPin) {
public FirstBowl(Pin newPin) {
pin = newPin;
}

Expand Down Expand Up @@ -37,7 +36,7 @@ public boolean isFinish() {

@Override
public Score getScore() {
return null;
return new Score(pin.getNum());
}

@Override
Expand Down
1 change: 0 additions & 1 deletion src/main/java/domain/frame/status/Miss.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package domain.frame.status;

import domain.frame.Frame;
import domain.frame.pin.Pin;
import domain.frame.result.Score;
import domain.frame.result.ScoreMessage;
Expand Down
10 changes: 4 additions & 6 deletions src/main/java/domain/frame/status/Ready.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package domain.frame.status;

import domain.frame.Frame;
import domain.frame.pin.Pin;
import domain.frame.result.CannotCalcException;
import domain.frame.result.Score;

public class Ready implements FrameStatus {
Expand All @@ -12,7 +10,7 @@ public FrameStatus roll(Pin newPin) throws IllegalArgumentException {
if (newPin.isMax()) {
return new Strike(newPin);
}
return new Ing(newPin);
return new FirstBowl(newPin);
}

@Override
Expand All @@ -27,11 +25,11 @@ public boolean isFinish() {

@Override
public Score getScore() {
return null;
return new Score(0, 0);
}

@Override
public Score addBonusScore(Score otherFrameScore) throws CannotCalcException {
throw new CannotCalcException();
public Score addBonusScore(Score otherFrameScore) {
return otherFrameScore;
}
}
5 changes: 1 addition & 4 deletions src/main/java/domain/frame/status/Spare.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package domain.frame.status;

import domain.frame.Frame;
import domain.frame.pin.Pin;
import domain.frame.result.Score;
import domain.frame.result.ScoreMessage;
Expand All @@ -11,12 +10,10 @@
public class Spare implements FrameStatus {
private Pin pin1;
private Pin pin2;
private int leftNum;

public Spare(Pin pin, Pin newPin) {
pin1 = pin;
pin2 = newPin;
leftNum = 1;
}

@Override
Expand All @@ -36,7 +33,7 @@ public boolean isFinish() {

@Override
public Score getScore() {
return new Score(pin1.getTotal(pin2), leftNum);
return new Score(pin1.getTotal(pin2), 1);
}

@Override
Expand Down

0 comments on commit 969ac95

Please sign in to comment.