Skip to content

Commit

Permalink
Refactoring: Lane State Pattern
Browse files Browse the repository at this point in the history
  • Loading branch information
lightorange0v0 committed Jun 1, 2023
1 parent 7a59b62 commit 04fa075
Show file tree
Hide file tree
Showing 12 changed files with 154 additions and 66 deletions.
2 changes: 1 addition & 1 deletion BowlerFile.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
class BowlerFile implements BowlerDatabase {

/** The location of the bowelr database */
private static String BOWLER_DAT = "/Users/yeonjoo/Desktop/pattern_team/src/BOWLERS.DAT";
private static String BOWLER_DAT = "/Users/yeonjoo/Desktop/pattern_team/BallingManagementSystem_refactoring/BOWLERS.DAT";

private BowlerFile() {}

Expand Down
2 changes: 1 addition & 1 deletion BowlerRegistrationManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public Bowler registerPatron(String nickName) {
try {
// only one patron / nick.... no dupes, no checks

patron = BowlerFile.getBowlerInfo(nickName);
patron = BowlerFile.getInstance().getBowlerInfo(nickName);

} catch (IOException e) {
System.err.println("Error..." + e);
Expand Down
21 changes: 21 additions & 0 deletions DecisionMakingState.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
public class DecisionMakingState implements LaneState {
private int result;

@Override
public void handle(Lane lane){
if (result == 1) { // yes, want to play again
lane.resetScores();
lane.resetBowlerIterator();
lane.setState(lane.gameInProgressState);
lane.handleState();
} else if (result == 2) { // no, dont want to play another game
lane.printEndGameReportAndNotifyMembers();
lane.setState(lane.noPartyAssignedState);
lane.handleState();
}
}

public void setResult(int result){
this.result = result;
}
}
9 changes: 9 additions & 0 deletions EndOfGameState.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
public class EndOfGameState implements LaneState {
@Override
public void handle(Lane lane){
int result = lane.promptEndGame();
((DecisionMakingState)lane.decisionMakingState).setResult(result);
lane.setState(lane.decisionMakingState);
lane.handleState();
}
}
12 changes: 12 additions & 0 deletions GameInProgressState.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
public class GameInProgressState implements LaneState {
@Override
public void handle(Lane lane){
if (lane.getBowlIterator().hasNext()) {
lane.prepareNextThrow();
lane.recordFinalScore();
lane.resetThrow();
} else {
lane.proceedToNextFrame();
}
}
}
111 changes: 47 additions & 64 deletions Lane.java
Original file line number Diff line number Diff line change
Expand Up @@ -134,9 +134,14 @@
import java.util.Vector;
import java.util.Iterator;
import java.util.HashMap;
import java.util.Date;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class Lane extends Thread implements PinsetterObserver {
final LaneState noPartyAssignedState,
partyAssignedState, gameInProgressState, decisionMakingState,
endOfGameState, pauseGameState;
private LaneState state;
private Party party;
private Pinsetter setter;
private HashMap scores;
Expand Down Expand Up @@ -174,6 +179,14 @@ public Lane() {
subscribers = new Vector();
shf = new ScoreHistoryFile();

this.noPartyAssignedState = new NoPartyAssignedState();
this.partyAssignedState = new PartyAssignedState();
this.gameInProgressState = new GameInProgressState();
this.decisionMakingState = new DecisionMakingState();
this.endOfGameState = new EndOfGameState();
this.pauseGameState = new PauseGameState();
state = noPartyAssignedState;

gameIsHalted = false;
partyAssigned = false;

Expand All @@ -192,45 +205,20 @@ public void run() {

// Long Method Refactoring
while (true) {
if(partyAssigned){ // we have a party on this lane,
// 동일한 적용인 점에서 분리
if(!gameFinished){ // so next bower can take a throw
handleGamePlay(); // 게임 시작을 핸들링하는 메소드
} else{
handleEndOfGame(); // 게임 종료를 핸들링하는 메소드
}
}

doSleep(10);
}
}

private void doSleep(int millis){ // 중복된 sleep()을 메소드로 변경
try{
sleep(millis);
} catch (Exception e) {}
}

private void handleGamePlay(){ // 게임 시작에 대한 메소드
gameDoSleep();

if (bowlerIterator.hasNext()) {
prepareNextThrow();
recordFinalScore();
resetThrow();
} else {
proceedToNextFrame();
handleState();
//doSleep(10);
}
}

private void gameDoSleep(){ // 게임 정지에 대한 sleep() 메소드
while(gameIsHalted){
doSleep(10);
}
}
public void setState(LaneState state) {
this.state = state;
}

public void handleState() {
state.handle(this);
}

private void prepareNextThrow(){ // 다음 볼이 던지도록 반복
public void prepareNextThrow(){ // 다음 볼이 던지도록 반복
currentThrower = (Bowler)bowlerIterator.next();
canThrowAgain = true;
tenthFrameStrike = false;
Expand All @@ -241,7 +229,7 @@ private void prepareNextThrow(){ // 다음 볼이 던지도록 반복
}
}

private void recordFinalScore(){ // 마지막 점수 저장
public void recordFinalScore(){ // 마지막 점수 저장
if (frameNumber == 9) {
finalScores[bowlIndex][gameNumber] = cumulScores[bowlIndex][9];
saveScore();
Expand All @@ -250,53 +238,41 @@ private void recordFinalScore(){ // 마지막 점수 저장

private void saveScore(){ // 현재 점수 저장
try{
Date date = new Date();
String dateString = "" + date.getHours() + ":" + date.getMinutes() + " " + date.getMonth() + "/" + date.getDay() + "/" + (date.getYear() + 1900);
shf.addScore(currentThrower.getNickName(), dateString, new Integer(cumulScores[bowlIndex][9]).toString());
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm MM/dd/yyyy");
LocalDateTime now = LocalDateTime.now();
String dateString = now.format(formatter);

shf.addScore(currentThrower.getNickName(), dateString, Integer.toString(cumulScores[bowlIndex][9]));
} catch (Exception e) {System.err.println("Exception in addScore. "+ e );}
}

private void resetThrow(){ // 다음 throw를 위해 모든 상태 초기화
public void resetThrow(){ // 다음 throw를 위해 모든 상태 초기화
setter.reset();
bowlIndex++;
}

private void proceedToNextFrame(){ // 다음 프레임을 위한 동작처리
public void proceedToNextFrame(){ // 다음 프레임을 위한 동작처리
frameNumber++;
resetBowlerIterator();
bowlIndex = 0;
if (frameNumber > 9) {
gameFinished = true;
gameNumber++;
setState(this.endOfGameState);
handleState();
}
}

private void handleEndOfGame(){ // 게임 종료에 대한 핸들링
int result = promptEndGame();
processEndGameResult(result);
// TODO: send record of scores to control desk
}


private int promptEndGame(){ // 게임 종료를 위한 응답 반영
public int promptEndGame(){ // 게임 종료를 위한 응답 반영
EndGamePrompt egp = new EndGamePrompt( ((Bowler) party.getMembers().get(0)).getNickName() + "'s Party" );
int result = egp.getResult();
egp.distroy();
egp = null;
System.out.println("result was: " + result);
return result;
}
private void processEndGameResult(int result){ // 재시작 혹은 체크 아웃 응답에 대한 분기
if (result == 1) { // yes, want to play again
resetScores();
resetBowlerIterator();

} else if (result == 2) {// no, dont want to play another game
printEndGameReportAndNotifyMembers();
}
}

private void printEndGameReportAndNotifyMembers(){ // 점수 보고서 생성 및 출력
public void printEndGameReportAndNotifyMembers(){ // 점수 보고서 생성 및 출력
Vector printVector;
EndGameReport egr = new EndGameReport( ((Bowler)party.getMembers().get(0)).getNickName() + "'s Party", party);
printVector = egr.waitForResult();
Expand Down Expand Up @@ -387,7 +363,7 @@ public void receivePinsetterEvent(PinsetterEvent pe) {
* @pre the party as been assigned
* @post the iterator points to the first bowler in the party
*/
private void resetBowlerIterator() {
public void resetBowlerIterator() {
bowlerIterator = (party.getMembers()).iterator();
}

Expand All @@ -398,7 +374,7 @@ private void resetBowlerIterator() {
* @pre the party has been assigned
* @post scoring system is initialized
*/
private void resetScores() {
public void resetScores() {
Iterator bowlIt = (party.getMembers()).iterator();

while ( bowlIt.hasNext() ) {
Expand All @@ -408,9 +384,7 @@ private void resetScores() {
}
scores.put( bowlIt.next(), toPut );
}




gameFinished = false;
frameNumber = 0;
}
Expand Down Expand Up @@ -603,6 +577,13 @@ public boolean isGameFinished() {
return gameFinished;
}

public boolean isGameHalted(){
return gameIsHalted;
}

public Iterator getBowlIterator(){
return bowlerIterator;
}
/** subscribe
*
* Method that will add a subscriber
Expand Down Expand Up @@ -657,6 +638,8 @@ public Pinsetter getPinsetter() {
*/
public void pauseGame() {
gameIsHalted = true;
setState(pauseGameState);
handleState();
publish(lanePublish());
}

Expand Down
3 changes: 3 additions & 0 deletions LaneState.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
public interface LaneState {
public void handle(Lane lane);
}
18 changes: 18 additions & 0 deletions NoPartyAssignedState.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
public class NoPartyAssignedState extends Thread implements LaneState {
@Override
public void handle(Lane lane){
if(lane.isPartyAssigned() == true){
lane.setState(lane.partyAssignedState);
lane.handleState();
}
else{
doSleep(10);
}
}

private void doSleep(int millis){ // 중복된 sleep()을 메소드로 변경
try{
sleep(millis);
} catch (Exception e) {}
}
}
15 changes: 15 additions & 0 deletions PartyAssignedState.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
public class PartyAssignedState implements LaneState {


@Override
public void handle(Lane lane){
if(lane.isGameFinished() == false){
lane.setState(lane.pauseGameState);
lane.handleState();
}
else{
lane.setState(lane.endOfGameState);
lane.handleState();
}
}
}
16 changes: 16 additions & 0 deletions PauseGameState.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
public class PauseGameState extends Thread implements LaneState {
@Override
public void handle(Lane lane){
while(lane.isGameHalted()){
doSleep(10);
}
lane.setState(lane.gameInProgressState);
lane.handleState();
}

private void doSleep(int millis){ // 중복된 sleep()을 메소드로 변경
try{
sleep(millis);
} catch (Exception e) {}
}
}
8 changes: 8 additions & 0 deletions SCOREHISTORY.DAT
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,11 @@ Tom 18:9 4/2/2023 134
Jim 18:9 4/2/2023 101
Jim 22:34 4/2/2023 161
Mike 22:34 4/2/2023 120
Lana 22:32 06/01/2023 119
Tom 22:32 06/01/2023 138
Tom 22:33 06/01/2023 128
TomH 22:33 06/01/2023 193
Tom 22:34 06/01/2023 149
Jim 22:34 06/01/2023 102
Tom 22:40 06/01/2023 99
TomH 22:40 06/01/2023 108
3 changes: 3 additions & 0 deletions ScoreCalculatorStrategy.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
public interface ScoreCalculatorStrategy {

}

0 comments on commit 04fa075

Please sign in to comment.