Skip to content
Open
Show file tree
Hide file tree
Changes from 2 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
1 change: 1 addition & 0 deletions .idea/.name

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/encodings.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion .idea/gradle.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 13 additions & 0 deletions .idea/material_theme_project_new.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

124 changes: 124 additions & 0 deletions .idea/uiDesigner.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 2 additions & 3 deletions src/main/java/ladder/LadderGame.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,9 @@
import ladder.creator.LadderCreator;

public class LadderGame {

private final LadderCreator ladderCreator;

public LadderGame(LadderCreator ladderCreator) {
LadderGame(LadderCreator ladderCreator) {
this.ladderCreator = ladderCreator;
}

Expand All @@ -15,4 +14,4 @@ public int run(Position position) {
ladderRunner.run(position);
return position.getValue();
}
}
}
15 changes: 15 additions & 0 deletions src/main/java/ladder/LadderGameFactory.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package ladder;

import ladder.creator.*;

public class LadderGameFactory {
public static LadderGame createBasicLadderGame(GreaterThanOne numberOfRow, GreaterThanOne numberOfPerson) {
Copy link

Choose a reason for hiding this comment

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

GreaterThanOne 인자 두개를 받는 메서드나 클래스가 많은데,
두 인자를 변수로 갖는 사다리 사이즈에 대한 객체가 있으면 관리가 더욱 용이할 것 같아요

LadderCreator creator = new BasicLadderCreator(numberOfRow, numberOfPerson);
return new LadderGame(creator);
}

public static LadderGame createRandomLadderGame(GreaterThanOne numberOfRow, GreaterThanOne numberOfPerson) {
LadderCreator creator = new AutoLadderCreator(numberOfRow, numberOfPerson);
return new LadderGame(creator);
}
}
40 changes: 40 additions & 0 deletions src/main/java/ladder/LadderPrinter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package ladder;

public class LadderPrinter {
private final Row[] rows;
private StringBuilder sb;
Copy link

@JGoo99 JGoo99 Sep 30, 2024

Choose a reason for hiding this comment

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

sb 변수는 printLadder 메서드 내에서만 사용하고 있는 것 같은데, 해당 메서드 내에서도 setLength(0) 를 통해 초기화하고 있네요!
클래스의 멤버 변수로 선언하지 않아도 괜찮을 것 같아요!


public LadderPrinter(Row[] rows) {
this.rows = rows;
this.sb = new StringBuilder();
}

public void printLadder(Position position, int currentRow, boolean isAfter) {
sb.setLength(0); // StringBuilder 초기화
for (int i = 0; i < rows.length; i++) {
sb.append(addPositionMarker(rows[i].rowToString(), position, i == currentRow));
sb.append("\n");
}

System.out.println(isAfter ? "After" : "Before");
System.out.print(sb.toString());
System.out.println();
}

private String addPositionMarker(String rowString, Position position, boolean isCurrentRow) {
String[] parts = rowString.split(" ");
StringBuilder rowSb = new StringBuilder();

for (int i = 0; i < parts.length; i++) {
if (i == position.getValue() && isCurrentRow) {
rowSb.append(parts[i].equals("-1") ? "-1*" : parts[i] + "*");
} else {
rowSb.append(parts[i]);
}
if (i < parts.length - 1) {
rowSb.append(" ");
}
}
return rowSb.toString();
}
Copy link

Choose a reason for hiding this comment

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

LadderPrinter 에서 node 의 정보를 확인하고 그리기보다는
StringBuilder 를 인자로 넘겨주고, 직접 Row -> Node 레벨로 들어가 해당 클래스 내에서 사다리 방향이나 현재 위치를 그려주면 훨씬 객체지향적인 코드가 될 것 같아요.
그렇게 되면 자연스럽게 "-1" 과 같은 하드코딩을 피하고 Direction 객체를 재사용할 수 있을 것 같네요!

}
9 changes: 8 additions & 1 deletion src/main/java/ladder/LadderRunner.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,22 @@
public class LadderRunner {

private final Row[] rows;
private final LadderPrinter printer;

public LadderRunner(Row[] rows) {
this.rows = rows;
this.printer = new LadderPrinter(rows);
}

public int run(Position position) {
System.out.println("사다리 게임 시작");

for (int i = 0; i < rows.length; i++) {
printer.printLadder(position, i, false); //Before 출력
rows[i].nextPosition(position);
printer.printLadder(position, i, true); //After 출력
Comment on lines +17 to +19
Copy link

Choose a reason for hiding this comment

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

주석처리보다는 Before, After 상수를 갖는 enum 클래스를 만들어보는건 어떤가요??

}

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

public int getIntDirection() {
if(direction == RIGHT) {
return 1;
}
if(direction == LEFT) {
return -1;
}
return 0;
}

public void setRightNode() {
direction = RIGHT;
}
Expand Down
13 changes: 13 additions & 0 deletions src/main/java/ladder/Row.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,22 @@

public class Row {
private final Node[] nodes;
private final GreaterThanOne number;

public String rowToString() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < number.getNumber(); i++) {
sb.append(nodes[i].getIntDirection());
sb.append(" ");
}

return sb.toString();
}

public Row(GreaterThanOne numberOfPerson) {
nodes = new Node[numberOfPerson.getNumber()];
number = numberOfPerson;

for (int i = 0; i < numberOfPerson.getNumber(); i++) {
nodes[i] = Node.from(NONE);
}
Expand Down
43 changes: 43 additions & 0 deletions src/main/java/ladder/creator/AutoLadderCreator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package ladder.creator;

import ladder.GreaterThanOne;
import ladder.Position;
import ladder.Row;
import java.util.Random;

public class AutoLadderCreator implements LadderCreator {
private final BasicLadderCreator basicCreator; //조합 사용을 위한 private class
private int count;
Copy link

@JGoo99 JGoo99 Sep 30, 2024

Choose a reason for hiding this comment

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

해당 변수명 자체로도 어떤 역할을 하는지 알 수 있도록 네이밍하면 더욱 유지보수에 용이합니다!
지금은 count 의 변수가 직관성이 살짝 떨어지는 감이 있는데, 클래스의 멤버 변수로 선언하지 말고 createLadder 메서드 내에서 직관적인 변수명으로 초기화 해주시면 좋을 것 같아요!

private final Random random = new Random();
Copy link

@JGoo99 JGoo99 Sep 30, 2024

Choose a reason for hiding this comment

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

random 변수도 createLadder 메서드 내에서만 사용하고, 클래스 바깥에서 알 필요가 없으므로 클래스 멤버 변수로 선언하지 않아도 좋을 것 같아요.

private final GreaterThanOne numberOfRow;
private final GreaterThanOne numberOfPerson;
Copy link

Choose a reason for hiding this comment

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

위에 언급했듯이 두개의 객체를 묶는 사다리 사이즈 정보 객체를 생성하면 좋을 것 같아요


public AutoLadderCreator(GreaterThanOne numberOfRow, GreaterThanOne numberOfPerson) {
this.basicCreator = new BasicLadderCreator(numberOfRow, numberOfPerson);
this.count = (int) (numberOfRow.getNumber() * numberOfPerson.getNumber() * 0.3 + 1);
this.numberOfRow = numberOfRow;
this.numberOfPerson = numberOfPerson;
createLadder();
}

private void createLadder() {
while (count > 0) {
try {
int x = random.nextInt(numberOfRow.getNumber());
int y = random.nextInt(numberOfPerson.getNumber() - 1);
drawLine(Position.from(x), Position.from(y));
Comment on lines +27 to +29
Copy link

Choose a reason for hiding this comment

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

랜덤 포지션의 상한값은 잘 지정해주었지만 음수값이 발생할 수 있네요.
random.nextInt 의 범위값을 양수로 지정해주면 Position.from 에서 음수 예외가 발생할 상황을 없애서 시간을 단축하고, 더욱 안전한 코드가 됩니당.

count--;
} catch (IllegalArgumentException e) {}
}
}

@Override
public void drawLine(Position row, Position col) {
basicCreator.drawLine(row, col);
}

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

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

public class BasicLadderCreator implements LadderCreator {
private final Row[] rows;

public BasicLadderCreator(GreaterThanOne numberOfRow, GreaterThanOne numberOfPerson) {
rows = new Row[numberOfRow.getNumber()];
Copy link

Choose a reason for hiding this comment

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

배열에 들어가는 수는 항상 유효성 검증에 유의해주세요!

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

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

@Override
public Row[] getRows() {
return rows;
}
}
Loading