Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
6 changes: 5 additions & 1 deletion src/main/java/ladder/LadderGame.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package ladder;

import ladder.creator.LadderCreator;
import ladder.creator.LadderCreatorImpl;

public class LadderGame {

private final LadderCreator ladderCreator;

public LadderGame(LadderCreator ladderCreator) {
this.ladderCreator = ladderCreator;
}
Expand All @@ -15,4 +15,8 @@ public int run(Position position) {
ladderRunner.run(position);
return position.getValue();
}

public LadderCreator getLadderCreator() {
return ladderCreator;
}
}
16 changes: 16 additions & 0 deletions src/main/java/ladder/LadderGameFactory.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package ladder;

import ladder.creator.LadderAutoCreator;
import ladder.creator.LadderCreatorImpl;


public class LadderGameFactory {

public static LadderGame createLadderGame(GreaterThanOne row, GreaterThanOne numberOfPerson) {
return new LadderGame(new LadderCreatorImpl(row, numberOfPerson));
}

public static LadderGame createRandomLadderGame(GreaterThanOne row, GreaterThanOne numberOfPerson) {
return new LadderGame(new LadderAutoCreator(row, numberOfPerson));
}
}
19 changes: 19 additions & 0 deletions src/main/java/ladder/LadderPosition.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package ladder;

public class LadderPosition {
Position x;
Position y;

public LadderPosition(Position x, Position y) {
this.x = x;
this.y = y;
}

public Position getX() {
return x;
}

public Position getY() {
return y;
}
}
21 changes: 21 additions & 0 deletions src/main/java/ladder/LadderRunner.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,29 @@ public LadderRunner(Row[] rows) {

public int run(Position position) {
for (int i = 0; i < rows.length; i++) {
LadderPosition ladderPosition = new LadderPosition(Position.from(i), position);

System.out.println("Before");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Before와 After 로직을 enum으로 분리해 보시는게 어떨까요?

printLadder(ladderPosition);

rows[i].nextPosition(position);

System.out.println("After");
printLadder(ladderPosition);

}
return position.getValue();
}

private void printLadder(LadderPosition ladderPosition){
StringBuilder sb = new StringBuilder();
for(int i = 0; i < rows.length; i++){
if( i == ladderPosition.getX().getValue()){
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LadderPosition에서 getX로 값을 가져와서 비교하는건 객체 지향적이지 못하다는 생각이 듭니다!

sb.append(rows[i].convertPositionRowToString(ladderPosition.getY())).append("\n");
continue;
}
sb.append(rows[i].convertRowtoString()).append("\n");
}
System.out.println(sb);
}
}
19 changes: 19 additions & 0 deletions src/main/java/ladder/LadderSize.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package ladder;

public class LadderSize {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LadderSize 클래스가 사용되고 있지 않은 것 같은데 기분탓일까요..?

GreaterThanOne numberOfRow;
GreaterThanOne numberOfPerson;

public LadderSize(GreaterThanOne numberOfRow, GreaterThanOne numberOfPerson) {
this.numberOfRow = numberOfRow;
this.numberOfPerson = numberOfPerson;
}

public GreaterThanOne getNumberOfRow() {
return numberOfRow;
}

public GreaterThanOne getNumberOfPerson() {
return numberOfPerson;
}
}
6 changes: 6 additions & 0 deletions src/main/java/ladder/Node.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ public void move(Position position) {
}
}



public void setRightNode() {
direction = RIGHT;
}
Expand All @@ -48,4 +50,8 @@ private boolean isLeft() {
private boolean isNone() {
return direction == NONE;
}

public Direction getDirection() {
return direction;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

노드의 값을 외부로 노출시키지 않고 노드 내부에서 처리할 수 있도록 바꾸는게 좋을 것 같습니다!

}
}
2 changes: 1 addition & 1 deletion src/main/java/ladder/Position.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public boolean isBiggerThan(int position) {
return this.position > position;
}

private static void validatePosition(int position) {
public static void validatePosition(int position) {
if (!isPosition(position)) {
throw new IllegalArgumentException(INVALID_LADDER_POSITION.getMessage());
}
Expand Down
25 changes: 24 additions & 1 deletion src/main/java/ladder/Row.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,32 @@ public Row(GreaterThanOne numberOfPerson) {
}
}

public int getNodeLength(){
return nodes.length;
}
public StringBuilder convertRowtoString(){
StringBuilder sb = new StringBuilder();
for(int i = 0 ; i < nodes.length ; i++){
sb.append(nodes[i].getDirection().getValue()).append(" ");
}
return sb;
}

public StringBuilder convertPositionRowToString(Position y){
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

convertRowtoString() 와 convertPositionRowToString() 는 중복되는 부분이 있는 것 같습니다. 하나의 메서드를 사용하되, *을 append 하는 부분은 메서드로 따로 추출하여 사용하면 해당 코드를 사용하는 입장에서도 사용 방법에 대해 명확히 이해할 수 있을 것 같습니다.

StringBuilder sb = new StringBuilder();

for (int i = 0; i < nodes.length; i++) {
if(i == y.getValue()) {
sb.append(nodes[i].getDirection().getValue()).append("* ");
continue;
}
sb.append(nodes[i].getDirection().getValue()).append(" ");
}
return sb;
}

public void drawLine(Position startPosition) {
validateDrawLinePosition(startPosition);

setDirectionBetweenNextPosition(startPosition);
}

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

import ladder.GreaterThanOne;
import ladder.LadderPosition;
import ladder.Position;
import ladder.Row;

import java.util.HashSet;
import java.util.Random;
import java.util.Set;

public class LadderAutoCreator implements LadderCreator {
private Row[] rows;

public LadderAutoCreator(GreaterThanOne numberOfRow, GreaterThanOne numberOfPerson) {
rows = new Row[numberOfRow.getNumber()];
for (int i = 0; i < numberOfRow.getNumber(); i++) {
rows[i] = new Row(numberOfPerson);
}
}
public Row[] getRows() {return rows;}

public void drawLine(Position row, Position col){
Set<LadderPosition> lines = new HashSet<>();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Set 같은 컬렉션에 객체를 저장하여 활용하려면 LadderPosition 에서 equals, hashCode 메서드를 오버라이드해야 중복 검증을 제대로 할 수 있습니다.


int numberOfLines = (int)(rows.length * rows[0].getNodeLength() * 0.3) - 1;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LadderSize 클래스를 활용해서 해당 객체를 구성하면 코드를 직관적으로 만들 수 있지 않을까요?


while(lines.size() < numberOfLines){
row = getRandomRow();
col = getRandomCol();
LadderPosition ladderPosition = new LadderPosition(row, col);
if(!canDrawLine(row,col)){
continue;
}
lines.add(ladderPosition);

}

}

private Position getRandomCol() {
Random r = new Random();
Position col;
col = Position.from(r.nextInt(rows[0].getNodeLength() - 1));
return col;
}

private Position getRandomRow() {
Random r = new Random();
Position row;
row = Position.from(r.nextInt(rows.length - 1));
return row;
}

private boolean canDrawLine(Position row, Position col) {
try {
rows[row.getValue()].drawLine(col);
} catch (IllegalArgumentException e) {
return false;
}
return true;
}
}
19 changes: 3 additions & 16 deletions src/main/java/ladder/creator/LadderCreator.java
Original file line number Diff line number Diff line change
@@ -1,25 +1,12 @@
package ladder.creator;

import ladder.GreaterThanOne;
import ladder.Position;
import ladder.Row;

public class LadderCreator {
public interface LadderCreator {

private final Row[] rows;
void drawLine(Position row, Position col);

public LadderCreator(GreaterThanOne numberOfRow, GreaterThanOne numberOfPerson) {
rows = new Row[numberOfRow.getNumber()];
for (int i = 0; i < numberOfRow.getNumber(); i++) {
rows[i] = new Row(numberOfPerson);
}
}
Row[] getRows();

public void drawLine(Position row, Position col) {
rows[row.getValue()].drawLine(col);
}

public Row[] getRows() {
return rows;
}
}
24 changes: 24 additions & 0 deletions src/main/java/ladder/creator/LadderCreatorImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package ladder.creator;

import ladder.GreaterThanOne;
import ladder.Position;
import ladder.Row;

public class LadderCreatorImpl implements LadderCreator {
private Row[] rows;

public LadderCreatorImpl(GreaterThanOne numberOfRow, GreaterThanOne numberOfPerson) {
rows = new Row[numberOfRow.getNumber()];
for (int i = 0; i < numberOfRow.getNumber(); i++) {
rows[i] = new Row(numberOfPerson);
}
}

public void drawLine(Position row, Position col) {
rows[row.getValue()].drawLine(col);
}

public Row[] getRows() {
return rows;
}
}
20 changes: 10 additions & 10 deletions src/test/java/ladder/LadderGameTest.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package ladder;

import ladder.creator.LadderCreator;
import ladder.creator.LadderCreatorImpl;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.*;
Expand All @@ -14,18 +14,18 @@ class LadderGameTest {
GreaterThanOne numberOfPerson = GreaterThanOne.from(5);

//when
LadderCreator ladderCreator = new LadderCreator(numberOfRow, numberOfPerson);
LadderCreatorImpl ladderCreatorImpl = new LadderCreatorImpl(numberOfRow, numberOfPerson);

//then
assertThat(ladderCreator).isNotNull();
assertThat(ladderCreatorImpl).isNotNull();
}

@Test
void 사다리_사람_예외_처리_확인() {
//when
GreaterThanOne numberOfPerson = GreaterThanOne.from(3);
LadderCreator ladderCreator = new LadderCreator(GreaterThanOne.from(2), numberOfPerson);
LadderGame ladderGame = new LadderGame(ladderCreator);
LadderCreatorImpl ladderCreatorImpl = new LadderCreatorImpl(GreaterThanOne.from(2), numberOfPerson);
LadderGame ladderGame = new LadderGame(ladderCreatorImpl);

//given
Position position = Position.from(4);
Expand All @@ -40,12 +40,12 @@ class LadderGameTest {
//when
GreaterThanOne numberOfPerson = GreaterThanOne.from(4);
GreaterThanOne row = GreaterThanOne.from(3);
LadderCreator ladderCreator = new LadderCreator(row, numberOfPerson);
LadderGame ladderGame = new LadderGame(ladderCreator);
LadderCreatorImpl ladderCreatorImpl = new LadderCreatorImpl(row, numberOfPerson);
LadderGame ladderGame = new LadderGame(ladderCreatorImpl);

ladderCreator.drawLine(Position.from(0),Position.from(0));
ladderCreator.drawLine(Position.from(1),Position.from(1));
ladderCreator.drawLine(Position.from(2),Position.from(0));
ladderCreatorImpl.drawLine(Position.from(0),Position.from(0));
ladderCreatorImpl.drawLine(Position.from(1),Position.from(1));
ladderCreatorImpl.drawLine(Position.from(2),Position.from(0));

//given
Position position = Position.from(0);
Expand Down
48 changes: 48 additions & 0 deletions src/test/java/ladder/RandomLadderTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package ladder;

import ladder.creator.LadderAutoCreator;
import ladder.creator.LadderCreator;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThatThrownBy;

public class RandomLadderTest {
GreaterThanOne numberOfPerson;
GreaterThanOne row;

@BeforeEach
void setUp() {
numberOfPerson = GreaterThanOne.from(4);
row = GreaterThanOne.from(3);
}


@Test
void 사다리_자동_생성_결과_확인(){
//given

LadderGame ladderGame = LadderGameFactory.createRandomLadderGame(numberOfPerson,row);
LadderCreator ladderCreator = ladderGame.getLadderCreator();
ladderCreator.drawLine(Position.from(0),Position.from(0));


//when
ladderGame.run(Position.from(0));

}

@Test
void 사다리_일반_생성_결과_확인(){
//given

LadderGame ladderGame = LadderGameFactory.createLadderGame(numberOfPerson,row);
LadderCreator ladderCreator = ladderGame.getLadderCreator();
ladderCreator.drawLine(Position.from(0),Position.from(0));

//when
ladderGame.run(Position.from(0));
}

}