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
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.

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

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

4 changes: 3 additions & 1 deletion .idea/gradle.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.

14 changes: 7 additions & 7 deletions src/main/java/ladder/LadderGame.java
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
package ladder;

import ladder.creator.LadderCreator;
import ladder.creator.LadderCreatorIF;

public class LadderGame {

private final LadderCreator ladderCreator;
private final LadderCreatorIF ladderCreatorIF;

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

public int run(Position position) {
LadderRunner ladderRunner = new LadderRunner(ladderCreator.getRows());
ladderRunner.run(position);
return position.getValue();
LadderPosition ladderPosition = new LadderPosition(0, position.getValue());
LadderRunner ladderRunner = new LadderRunner(ladderCreatorIF.getRows());
return ladderRunner.run(ladderPosition);
}
}
14 changes: 14 additions & 0 deletions src/main/java/ladder/LadderGameFactory.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package ladder;

import ladder.creator.LadderCreator;
import ladder.creator.RandomLadderCreator;

public class LadderGameFactory {
public static LadderGame createLadderGame(LadderSize ladderSize) {
return new LadderGame(new LadderCreator(ladderSize));
}

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

public class LadderPosition {

private Position x;
private Position y;

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

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

public Position getX() {
return x;
}

public Position getY() {
return y;
}

public int getValueX() {
return x.getValue();
}

public int getValueY() {
return y.getValue();
}

public Boolean isNthRow(int n) {
return x.getValue() == n;
}

public Boolean isNthNode(int n) {
return y.getValue() == n;
}

public void goLeft() {
y.prev();
}

public void goRight() {
y.next();
}

public void goDown() {
x.next();
}
}
45 changes: 42 additions & 3 deletions src/main/java/ladder/LadderRunner.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,49 @@ public LadderRunner(Row[] rows) {
this.rows = rows;
}

public int run(Position position) {
public int run(LadderPosition ladderPosition) {
for (int i = 0; i < rows.length; i++) {
rows[i].nextPosition(position);
printLadder("Before", ladderPosition);
rows[i].nextPosition(ladderPosition);
printLadder("After", ladderPosition);
ladderPosition.goDown();
}
return position.getValue();
return ladderPosition.getValueY();
}
Comment on lines +11 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 클래스를 만들어 사용하면 하드코딩을 피하고, 구현코드나 테스트코드 등에서 안전하게 재사용할 수 있을 것 같아요.

rows[i].nextPosition() 함수에는 y 좌표만 Position 객체로 넘겨주면 내부 메서드가 더 깔끔해질 것 같아요.


private void printLadder(String title, LadderPosition ladderPosition) {
String printString = title
+ '\n'
+ getLadderString(ladderPosition);
System.out.println(printString);
}

private String getLadderString(LadderPosition ladderPosition) {
StringBuilder ladderStringBuilder = new StringBuilder();

for (int i = 0; i < rows.length; i++) {
ladderStringBuilder.append(getNthRowString(i, ladderPosition))
.append('\n');
}
return ladderStringBuilder.toString();
}

private String getNthRowString(int n, LadderPosition ladderPosition) {
String rowString = rows[n].getRowString();
if (ladderPosition.isNthRow(n)) {
rowString = insertAsterisk(rowString, ladderPosition);
}
return rowString;
}

private String insertAsterisk(String rowString, LadderPosition ladderPosition) {
String[] nodeStrings = rowString.split(" ");
StringBuilder stringBuilder = new StringBuilder();

for (int i = 0; i < nodeStrings.length; i++) {
stringBuilder.append(nodeStrings[i])
.append(ladderPosition.isNthNode(i) ? "* " : " ");
}
return stringBuilder.toString();
}
Comment on lines +28 to 55
Copy link

Choose a reason for hiding this comment

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

Runner 에서 Row, Node 의 변수 정보를 getter 로 가져와 그리기보다는,
StirngBuilder 인자를 넘겨주면서 Row 클래스 -> Node 클래스 레벨로 직접 들어가 내부 메서드를 통해 사다리와 별표를 그려주는 건 어떤가요?
조금 더 객체지향적인 코드가 될 수 있을 것 같아요!

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

public class LadderSize {
private GreaterThanOne numberOfRow;
private GreaterThanOne numberOfPerson;

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

public GreaterThanOne getNumberOfRow() {
return numberOfRow;
}

public GreaterThanOne getNumberOfPerson() {
return numberOfPerson;
}

public int getNumberOfRowValue() {
return numberOfRow.getNumber();
}

public int getNumberOfPersonValue() {
return numberOfPerson.getNumber();
}

public int getMaxLineCount() {
return (int)(numberOfRow.getNumber() * numberOfPerson.getNumber() * 0.3);
}
}
11 changes: 8 additions & 3 deletions src/main/java/ladder/Node.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,13 @@ public static Node from(Direction direction) {
return new Node(direction);
}

public void move(Position position) {
public void move(LadderPosition ladderPosition) {
if (isRight()) {
position.next();
ladderPosition.goRight();
return;
}
if (isLeft()) {
position.prev();
ladderPosition.goLeft();
return;
}
}
Expand Down Expand Up @@ -48,4 +48,9 @@ private boolean isLeft() {
private boolean isNone() {
return direction == NONE;
}

@Override
public String toString() {
return Integer.toString(direction.getValue());
}
}
22 changes: 19 additions & 3 deletions src/main/java/ladder/Row.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,24 @@ public void drawLine(Position startPosition) {
setDirectionBetweenNextPosition(startPosition);
}

public void nextPosition(Position position) {
validatePosition(position);
public void nextPosition(LadderPosition ladderPosition) {
validateLadderPosition(ladderPosition);

nodes[position.getValue()].move(position);
nodes[ladderPosition.getValueY()].move(ladderPosition);
}



private void setDirectionBetweenNextPosition(Position position) {
nodes[position.getValue()].setRightNode();
position.next();
nodes[position.getValue()].setLeftNode();
}

private void validateLadderPosition(LadderPosition ladderPosition) {
validatePosition(ladderPosition.getY());
}
Comment on lines +35 to +37
Copy link

Choose a reason for hiding this comment

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

위에 언급했듯이 인자로 Position 을 받으면 해당 메서드는 지워도 좋을 것 같습니다!


private void validatePosition(Position position) {
if (isInvalidPosition(position) ) {
throw new IllegalArgumentException(ExceptionMessage.INVALID_POSITION.getMessage());
Expand Down Expand Up @@ -58,4 +64,14 @@ private boolean isLineAtNextPosition(Position position) {
return lineAtPosition;
}

public String getRowString() {
StringBuilder rowStringBuilder = new StringBuilder();

for (Node node : nodes) {
rowStringBuilder.append(node.toString())
.append(" ");

}
return rowStringBuilder.toString();
}
}
24 changes: 15 additions & 9 deletions src/main/java/ladder/creator/LadderCreator.java
Original file line number Diff line number Diff line change
@@ -1,24 +1,30 @@
package ladder.creator;

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

public class LadderCreator {

public class LadderCreator implements LadderCreatorIF {
Copy link

Choose a reason for hiding this comment

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

LadderCreater 를 인터페이스로 만들었다면 그것을 구현하는 구현체의 특색에 맞게 클래스명을 지어주면 유지보수에 용이할 것 같아요!
(ex. RandomLadderCreater)


private final Row[] rows;

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

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

public void drawLine(Position row, Position col) {
@Override
public void drawLine(LadderPosition ladderPosition) {
Position row = ladderPosition.getX();
Position col = ladderPosition.getY();

rows[row.getValue()].drawLine(col);
}

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

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

public interface LadderCreatorIF {
Copy link

Choose a reason for hiding this comment

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

interface 클래스에 ~IF 를 붙이거나, 구현체에 ~Impl을 붙이는게 헝가리안 표기법이 남아있는 경우입니다.
헝가리안 표기법은 동어반복 이 되기 때문에 지양해야 하는 관습 중 하나입니다!
해당 인터페이스의 의미 자체 (LadderCreator)를 클래스명으로 사용하는 게 좋을 것 같습니다ㅎ

public abstract void drawLine(LadderPosition ladderPosition);

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

import ladder.LadderPosition;
import ladder.LadderSize;
import ladder.Row;

import java.util.HashSet;

public class RandomLadderCreator implements LadderCreatorIF{

private final LadderCreator ladderCreator;
private final LadderSize ladderSize;

public RandomLadderCreator(LadderSize ladderSize) {
ladderCreator = new LadderCreator(ladderSize);
this.ladderSize = ladderSize;
Comment on lines +14 to +16
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.

LadderCreator 를 생성해서 사용할거면 매개변수로 LadderCreator 를 받아도 좋을 것 같습니다!

initLadder();
}

private void initLadder() {
HashSet<LadderPosition> linePositionSet = new HashSet<>();
Copy link

Choose a reason for hiding this comment

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

참조변수인 객체는 quals, hashCode 메서드를 오버라이드해서 같은 객체인지 검증하는 기능이 필요해요.
(단순 값의 중복을 검증하는 것을 넘어 메모리 비교(해시값비교) 를 통해 객채의 중복을 검증하기 위해)

int maxLineCount = ladderSize.getMaxLineCount();
int maxRowNumber = ladderSize.getNumberOfRowValue();
int maxNodeNumber = ladderSize.getNumberOfPersonValue() - 1;

while (linePositionSet.size() < maxLineCount) {
int x = (int)(Math.random() * maxRowNumber);
int y = (int)(Math.random() * maxNodeNumber);
LadderPosition ladderPosition = new LadderPosition(x, y);
Comment on lines +22 to +29
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.

row, node, person, x, y 등 의미는 같은데 이름만 다른 변수가 코드의 직관성을 떨어뜨리는 것 같습니다!


try {
drawLine(ladderPosition);
linePositionSet.add(ladderPosition);
} catch (IllegalArgumentException ignored) {
}
}
}

@Override
public void drawLine(LadderPosition ladderPosition) {
ladderCreator.drawLine(ladderPosition);
}

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