From 044397e002643eb15300c29c1f6275824a0ef4f7 Mon Sep 17 00:00:00 2001 From: chxghee Date: Thu, 24 Apr 2025 16:29:13 +0900 Subject: [PATCH 01/14] =?UTF-8?q?Docs:=201=EB=8B=A8=EA=B3=84=20=EB=A6=AC?= =?UTF-8?q?=EB=93=9C=EB=AF=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 27 +++++++++++++++++++ src/main/java/Application.java | 4 +++ .../java/controller/LadderGameController.java | 4 +++ src/main/java/model/HorizontalLine.java | 16 +++++++++++ src/main/java/model/Ladder.java | 4 +++ src/main/java/model/LineGenerator.java | 4 +++ src/main/java/model/Link.java | 4 +++ src/main/java/model/LinkGenerator.java | 5 ++++ src/main/java/model/RandomLinkGenerator.java | 13 +++++++++ src/main/java/view/OutputView.java | 18 +++++++++++++ 10 files changed, 99 insertions(+) create mode 100644 README.md create mode 100644 src/main/java/Application.java create mode 100644 src/main/java/controller/LadderGameController.java create mode 100644 src/main/java/model/HorizontalLine.java create mode 100644 src/main/java/model/Ladder.java create mode 100644 src/main/java/model/LineGenerator.java create mode 100644 src/main/java/model/Link.java create mode 100644 src/main/java/model/LinkGenerator.java create mode 100644 src/main/java/model/RandomLinkGenerator.java create mode 100644 src/main/java/view/OutputView.java diff --git a/README.md b/README.md new file mode 100644 index 00000000..f9054343 --- /dev/null +++ b/README.md @@ -0,0 +1,27 @@ +# 사다리 타기 🪜 +> 네이버의 사다리 타기 게임과 같이 콘솔 환경에서 사다리 게임을 진행할 수 있는 프로그램 + +## 1단계 - 사다리 출력 + +### 📝 기능 요구사항 +✅ 사다리는 4x4 크기로 고정되고, 연결 여부는 랜덤으로 결정한다. + +✅ 사다리 타기가 정상적으로 동작하려면 라인이 겹치지 않도록 해야 한다. + +### 💻 구현 전략 + +1. 나의 `오른쪽` 사다리와 연결 여부를 나타내는 `Link enum클래스` + ➡️ `LINKED` / `UNLINKED` 두 가지 타입을 갖는다. + + +2. 사다리의 수평 구조물을 의미하는 `HorizontalLine 클래스` + ➡️ 필드로 Link 클래스의 리스트를 갖는다. + ➡️ 가로로 사다리를 건널 수 있을 지 없을 지를 Link 타입으로 알 수 있다. + + +3. 전체 사다리를 의미하는 `Ladder 클래스` + ➡️ 필드로 HorizontalLine 클래스의 리스트를 갖는다. + ➡️ 세로가 아닌 가로로 사다리의 정보를 갖는다. + + + diff --git a/src/main/java/Application.java b/src/main/java/Application.java new file mode 100644 index 00000000..0a08323d --- /dev/null +++ b/src/main/java/Application.java @@ -0,0 +1,4 @@ +package PACKAGE_NAME; + +public class Application { +} diff --git a/src/main/java/controller/LadderGameController.java b/src/main/java/controller/LadderGameController.java new file mode 100644 index 00000000..49393a7c --- /dev/null +++ b/src/main/java/controller/LadderGameController.java @@ -0,0 +1,4 @@ +package controller; + +public class LabberGameController { +} diff --git a/src/main/java/model/HorizontalLine.java b/src/main/java/model/HorizontalLine.java new file mode 100644 index 00000000..aca3b91b --- /dev/null +++ b/src/main/java/model/HorizontalLine.java @@ -0,0 +1,16 @@ +package model; + +import java.util.Collections; +import java.util.List; + +public class Line { + private final List points; + + public Line(List points) { + this.points = points; + } + + public List getPoints() { + return Collections.unmodifiableList(points); + } +} diff --git a/src/main/java/model/Ladder.java b/src/main/java/model/Ladder.java new file mode 100644 index 00000000..b72bcb91 --- /dev/null +++ b/src/main/java/model/Ladder.java @@ -0,0 +1,4 @@ +package model; + +public class Ladder { +} diff --git a/src/main/java/model/LineGenerator.java b/src/main/java/model/LineGenerator.java new file mode 100644 index 00000000..cf80367d --- /dev/null +++ b/src/main/java/model/LineGenerator.java @@ -0,0 +1,4 @@ +package model; + +public class LineGenerator { +} diff --git a/src/main/java/model/Link.java b/src/main/java/model/Link.java new file mode 100644 index 00000000..5ee8b86c --- /dev/null +++ b/src/main/java/model/Link.java @@ -0,0 +1,4 @@ +package model; + +public enum Link { +} diff --git a/src/main/java/model/LinkGenerator.java b/src/main/java/model/LinkGenerator.java new file mode 100644 index 00000000..411d0136 --- /dev/null +++ b/src/main/java/model/LinkGenerator.java @@ -0,0 +1,5 @@ +package model; + +public interface BooleanGenerator { + boolean generate(); +} diff --git a/src/main/java/model/RandomLinkGenerator.java b/src/main/java/model/RandomLinkGenerator.java new file mode 100644 index 00000000..1778f0b1 --- /dev/null +++ b/src/main/java/model/RandomLinkGenerator.java @@ -0,0 +1,13 @@ +package model; + +import java.util.concurrent.ThreadLocalRandom; + +public class LinkGenerator implements BooleanGenerator { + + private final ThreadLocalRandom random = ThreadLocalRandom.current(); + + @Override + public boolean generate() { + return random.nextBoolean(); + } +} diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java new file mode 100644 index 00000000..8107dda2 --- /dev/null +++ b/src/main/java/view/OutputView.java @@ -0,0 +1,18 @@ +package view; + +import model.HorizontalLine; +import model.Ladder; + +import java.util.Scanner; + +public class Output { + + private final Scanner scanner = new Scanner(System.out); + + + public static void printLadder(Ladder ladder) { + for (HorizontalLine line : ladder.getLines()) { + + } + } +} From 7aa8ae4db56832cdd20537a89112435cab8fb993 Mon Sep 17 00:00:00 2001 From: chxghee Date: Thu, 24 Apr 2025 16:30:33 +0900 Subject: [PATCH 02/14] =?UTF-8?q?Feat:=201=EB=8B=A8=EA=B3=84=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 구현 전략은 리드미에 적어 놓았습니다. --- src/main/java/Application.java | 7 ++++- .../java/controller/LadderGameController.java | 20 ++++++++++++- src/main/java/model/HorizontalLine.java | 4 +-- src/main/java/model/Ladder.java | 26 +++++++++++++++++ src/main/java/model/LineGenerator.java | 26 ++++++++++++++++- src/main/java/model/Link.java | 13 +++++++++ src/main/java/model/LinkGenerator.java | 4 +-- src/main/java/model/RandomLinkGenerator.java | 6 ++-- src/main/java/view/OutputView.java | 28 +++++++++++++++---- 9 files changed, 118 insertions(+), 16 deletions(-) diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 0a08323d..9915e61d 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -1,4 +1,9 @@ -package PACKAGE_NAME; +import controller.LadderGameController; +import model.RandomLinkGenerator; public class Application { + public static void main(String[] args) { + LadderGameController ladderGameController = new LadderGameController(new RandomLinkGenerator()); + ladderGameController.run(); + } } diff --git a/src/main/java/controller/LadderGameController.java b/src/main/java/controller/LadderGameController.java index 49393a7c..dd83ed0a 100644 --- a/src/main/java/controller/LadderGameController.java +++ b/src/main/java/controller/LadderGameController.java @@ -1,4 +1,22 @@ package controller; -public class LabberGameController { +import model.Ladder; +import model.LinkGenerator; +import view.OutputView; + +public class LadderGameController { + + private final LinkGenerator linkGenerator; + + public LadderGameController(LinkGenerator linkGenerator) { + this.linkGenerator = linkGenerator; + } + + public void run() { + int height = 4; + int width = 4; + + Ladder ladder = Ladder.of(height, width, linkGenerator); + OutputView.printLadder(ladder); + } } diff --git a/src/main/java/model/HorizontalLine.java b/src/main/java/model/HorizontalLine.java index aca3b91b..4bf2814f 100644 --- a/src/main/java/model/HorizontalLine.java +++ b/src/main/java/model/HorizontalLine.java @@ -3,10 +3,10 @@ import java.util.Collections; import java.util.List; -public class Line { +public class HorizontalLine { private final List points; - public Line(List points) { + public HorizontalLine(List points) { this.points = points; } diff --git a/src/main/java/model/Ladder.java b/src/main/java/model/Ladder.java index b72bcb91..81fd86b0 100644 --- a/src/main/java/model/Ladder.java +++ b/src/main/java/model/Ladder.java @@ -1,4 +1,30 @@ package model; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + public class Ladder { + private final List lines; + + private Ladder(List horizontalLines) { + this.lines = horizontalLines; + } + + public static Ladder of(int height, int width, LinkGenerator generator) { + return new Ladder(getHorizontalRandomLines(height, width, generator)); + } + + private static List getHorizontalRandomLines(int height, int width, LinkGenerator generator) { + List lines = new ArrayList<>(); + for (int i = 0; i < height; i++) { + HorizontalLine horizontalLine = LineGenerator.generateHorizontalLine(width, generator); + lines.add(horizontalLine); + } + return lines; + } + + public List getLines() { + return lines; + } } diff --git a/src/main/java/model/LineGenerator.java b/src/main/java/model/LineGenerator.java index cf80367d..34627524 100644 --- a/src/main/java/model/LineGenerator.java +++ b/src/main/java/model/LineGenerator.java @@ -1,4 +1,28 @@ package model; -public class LineGenerator { +import java.util.ArrayList; +import java.util.List; + +public class LineGenerator { // 가로 기준으로 연결 여부 라인을 생성 + + public static HorizontalLine generateHorizontalLine(int width, LinkGenerator generate) { + + Link prev = Link.UNLINKED; + List link = new ArrayList<>(); + + for (int i = 0; i < width - 1; i++) { + prev = addLink(prev, generate.generate(), link); + } + link.add(Link.UNLINKED); + return new HorizontalLine(link); + } + + private static Link addLink(Link prev, Link now, List link) { + if (prev.isLinked()) { + now = Link.UNLINKED; + } + link.add(now); + return now; + } + } diff --git a/src/main/java/model/Link.java b/src/main/java/model/Link.java index 5ee8b86c..2613743c 100644 --- a/src/main/java/model/Link.java +++ b/src/main/java/model/Link.java @@ -1,4 +1,17 @@ package model; public enum Link { + LINKED, + UNLINKED; + + public static Link from(boolean linked) { + if (linked) { + return LINKED; + } + return UNLINKED; + } + + public boolean isLinked() { + return this == LINKED; + } } diff --git a/src/main/java/model/LinkGenerator.java b/src/main/java/model/LinkGenerator.java index 411d0136..87c2e838 100644 --- a/src/main/java/model/LinkGenerator.java +++ b/src/main/java/model/LinkGenerator.java @@ -1,5 +1,5 @@ package model; -public interface BooleanGenerator { - boolean generate(); +public interface LinkGenerator { + Link generate(); } diff --git a/src/main/java/model/RandomLinkGenerator.java b/src/main/java/model/RandomLinkGenerator.java index 1778f0b1..db1d2b36 100644 --- a/src/main/java/model/RandomLinkGenerator.java +++ b/src/main/java/model/RandomLinkGenerator.java @@ -2,12 +2,12 @@ import java.util.concurrent.ThreadLocalRandom; -public class LinkGenerator implements BooleanGenerator { +public class RandomLinkGenerator implements LinkGenerator { private final ThreadLocalRandom random = ThreadLocalRandom.current(); @Override - public boolean generate() { - return random.nextBoolean(); + public Link generate() { + return Link.from(random.nextBoolean()); } } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 8107dda2..f7868096 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -2,17 +2,33 @@ import model.HorizontalLine; import model.Ladder; +import model.Link; -import java.util.Scanner; - -public class Output { - - private final Scanner scanner = new Scanner(System.out); - +public class OutputView { public static void printLadder(Ladder ladder) { for (HorizontalLine line : ladder.getLines()) { + printHorizontalLine(line); + } + System.out.println(); + } + private static void printHorizontalLine(HorizontalLine line) { + for (Link point : line.getPoints()) { + System.out.print("|"); + printCrossing(point); } + System.out.println(); } + + private static void printCrossing(Link point) { + if (point == Link.LINKED) { + System.out.print("-----"); + } + if (point == Link.UNLINKED) { + System.out.print(" "); + } + } + + } From a85bc276a1f90964398e49f9b00e866ab141657c Mon Sep 17 00:00:00 2001 From: chxghee Date: Thu, 24 Apr 2025 16:58:25 +0900 Subject: [PATCH 03/14] =?UTF-8?q?Docs:=202=EB=8B=A8=EA=B3=84=20=EB=A6=AC?= =?UTF-8?q?=EB=93=9C=EB=AF=B8=20=EC=9E=91=EC=84=B1=20=EC=9A=94=EA=B5=AC?= =?UTF-8?q?=EC=82=AC=ED=95=AD=EA=B3=BC=20=EA=B5=AC=ED=98=84=20=EC=A0=84?= =?UTF-8?q?=EB=9E=B5=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 15 +++++++++++++++ src/main/java/view/InputView.java | 4 ++++ 2 files changed, 19 insertions(+) create mode 100644 src/main/java/view/InputView.java diff --git a/README.md b/README.md index f9054343..8e488069 100644 --- a/README.md +++ b/README.md @@ -24,4 +24,19 @@ ➡️ 세로가 아닌 가로로 사다리의 정보를 갖는다. +
+ +--- +## 2단계 - 사다리 생성 + +### 📝 기능 요구사항 +✅ 사다리는 크기를 입력 받아 생성할 수 있다. + +### 💻 구현 전략 + +1. `InputView 클래스`를 통해 사다리 높이와 넓이를 입력받는다. + ➡️ 컨트롤러에서 `InputView 클래스`의 메서드를 호출해 높이와 넓이를 입력받는다. + + +2. `Ladder 클래스`의 `정적 팩토리 메서드 of`에 입력받은 크기 정보를 넘겨주어 사다리를 생성한다. diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java new file mode 100644 index 00000000..ae2791fb --- /dev/null +++ b/src/main/java/view/InputView.java @@ -0,0 +1,4 @@ +package view; + +public class InputView { +} From ede5b596ba867919393798c999de1b399f5083ad Mon Sep 17 00:00:00 2001 From: chxghee Date: Thu, 24 Apr 2025 16:59:54 +0900 Subject: [PATCH 04/14] =?UTF-8?q?Feat:=202=EB=8B=A8=EA=B3=84=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit InputView를 통해 크기를 입력받고, LadderGameController 에서 Ladder클래스의 팩토리 메서드를 통해 사다리를 생성한다. --- .../java/controller/LadderGameController.java | 17 +++++++++++++++-- src/main/java/view/InputView.java | 8 ++++++++ src/main/java/view/OutputView.java | 9 +++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/main/java/controller/LadderGameController.java b/src/main/java/controller/LadderGameController.java index dd83ed0a..6194674b 100644 --- a/src/main/java/controller/LadderGameController.java +++ b/src/main/java/controller/LadderGameController.java @@ -2,6 +2,7 @@ import model.Ladder; import model.LinkGenerator; +import view.InputView; import view.OutputView; public class LadderGameController { @@ -13,10 +14,22 @@ public LadderGameController(LinkGenerator linkGenerator) { } public void run() { - int height = 4; - int width = 4; + + int width = getWidth(); + int height = getHeight(); Ladder ladder = Ladder.of(height, width, linkGenerator); OutputView.printLadder(ladder); } + + private static int getHeight() { + OutputView.printHeightMessage(); + return InputView.getInt(); + } + + private static int getWidth() { + OutputView.printWidthMessage(); + return InputView.getInt(); + } + } diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index ae2791fb..dde7446e 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -1,4 +1,12 @@ package view; +import java.util.Scanner; + public class InputView { + + private static final Scanner scanner = new Scanner(System.in); + + public static int getInt() { + return scanner.nextInt(); + } } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index f7868096..a64ca052 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -6,6 +6,15 @@ public class OutputView { + public static void printWidthMessage() { + System.out.println("사다리의 넓이는 몇 개인가요?"); + } + + public static void printHeightMessage() { + System.out.println("사다리의 높이는 몇 개인가요?"); + } + + public static void printLadder(Ladder ladder) { for (HorizontalLine line : ladder.getLines()) { printHorizontalLine(line); From 5256e6e6a24bc78a4c18b950643216ef79daee50 Mon Sep 17 00:00:00 2001 From: chxghee Date: Fri, 25 Apr 2025 12:37:24 +0900 Subject: [PATCH 05/14] =?UTF-8?q?Docs:=203=EB=8B=A8=EA=B3=84=20=EB=A6=AC?= =?UTF-8?q?=EB=93=9C=EB=AF=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 19 +++++++++++++++++++ src/main/java/model/MoveCondition.java | 4 ++++ src/main/java/model/MovingDirection.java | 4 ++++ 3 files changed, 27 insertions(+) create mode 100644 src/main/java/model/MoveCondition.java create mode 100644 src/main/java/model/MovingDirection.java diff --git a/README.md b/README.md index 8e488069..ddcca55c 100644 --- a/README.md +++ b/README.md @@ -40,3 +40,22 @@ 2. `Ladder 클래스`의 `정적 팩토리 메서드 of`에 입력받은 크기 정보를 넘겨주어 사다리를 생성한다. + +--- + +## 3단계 - 사다리 타기 +### 📝 기능 요구사항 +✅ 사다리의 시작 지점과 도착 지점을 출력한다. + +### 💻 구현 전략 + + +3. `MovingDirection enum 클래스`를 통해 사다리의 이동 전략을 관리한다. + ➡️ Enum 클래스에서 함수형 인터페이스를 통해 이동 방향별(RIGHT / LEFT / STAY) 전략을 람다식으로 설정한다. + + +2. 사다리 게임 진행 + ➡️ Ladder 클래스의 `ride 메서드`를 통해 시작 위치를 전달하면 결과 위치를 반환한다. + ➡️ HorizontalLine 클래스의 `move 메서드`를 통해 현재 위치에서 움직일 수 있는지 판단하고 위치를 옮긴다. + + diff --git a/src/main/java/model/MoveCondition.java b/src/main/java/model/MoveCondition.java new file mode 100644 index 00000000..6ae7b3d0 --- /dev/null +++ b/src/main/java/model/MoveCondition.java @@ -0,0 +1,4 @@ +package model; + +public class MoveCondition { +} diff --git a/src/main/java/model/MovingDirection.java b/src/main/java/model/MovingDirection.java new file mode 100644 index 00000000..9d4e4f3c --- /dev/null +++ b/src/main/java/model/MovingDirection.java @@ -0,0 +1,4 @@ +package model; + +public class MoveDirection { +} From ff5923892cad670357b9c82895c45e45a0aa8609 Mon Sep 17 00:00:00 2001 From: chxghee Date: Fri, 25 Apr 2025 12:40:38 +0900 Subject: [PATCH 06/14] =?UTF-8?q?Feat:=203=EB=8B=A8=EA=B3=84=20=EC=82=AC?= =?UTF-8?q?=ED=83=80=EB=A6=AC=20=ED=83=80=EA=B8=B0=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MovingDirection enum 클래스를 통해 상황별 이동 전략을 캡슐화 한다. 사다리 타는 로직을 담은 메서드 구현 Ladder -> ride()메서드 HorizontalLine -> move() 메서드 --- .../java/controller/LadderGameController.java | 14 +++++++++++ src/main/java/model/HorizontalLine.java | 18 +++++++++++++++ src/main/java/model/Ladder.java | 9 +++++++- src/main/java/model/MoveCondition.java | 4 +++- src/main/java/model/MovingDirection.java | 23 ++++++++++++++++++- src/main/java/view/OutputView.java | 10 +++++++- 6 files changed, 74 insertions(+), 4 deletions(-) diff --git a/src/main/java/controller/LadderGameController.java b/src/main/java/controller/LadderGameController.java index 6194674b..6ff0f8ab 100644 --- a/src/main/java/controller/LadderGameController.java +++ b/src/main/java/controller/LadderGameController.java @@ -5,6 +5,9 @@ import view.InputView; import view.OutputView; +import java.util.HashMap; +import java.util.Map; + public class LadderGameController { private final LinkGenerator linkGenerator; @@ -19,7 +22,18 @@ public void run() { int height = getHeight(); Ladder ladder = Ladder.of(height, width, linkGenerator); + Map results = getLadderGameResult(width, ladder); + OutputView.printLadder(ladder); + OutputView.printResults(results); + } + + private static Map getLadderGameResult(int width, Ladder ladder) { + Map results = new HashMap<>(); + for (int i = 0; i < width; i++) { + results.put(i, ladder.ride(i)); + } + return results; } private static int getHeight() { diff --git a/src/main/java/model/HorizontalLine.java b/src/main/java/model/HorizontalLine.java index 4bf2814f..dd209768 100644 --- a/src/main/java/model/HorizontalLine.java +++ b/src/main/java/model/HorizontalLine.java @@ -1,15 +1,33 @@ package model; +import java.util.Arrays; import java.util.Collections; import java.util.List; public class HorizontalLine { + private final List points; public HorizontalLine(List points) { this.points = points; } + public int move(int position) { + return Arrays.stream(MovingDirection.values()) + .filter(movingDirection -> movingDirection.canMove(position, this)) + .findFirst() + .map(movingDirection -> movingDirection.move(position)) + .orElse(position); + } + + public int size() { + return points.size(); + } + + public Link getLink(int index) { + return points.get(index); + } + public List getPoints() { return Collections.unmodifiableList(points); } diff --git a/src/main/java/model/Ladder.java b/src/main/java/model/Ladder.java index 81fd86b0..2a34fb91 100644 --- a/src/main/java/model/Ladder.java +++ b/src/main/java/model/Ladder.java @@ -1,7 +1,6 @@ package model; import java.util.ArrayList; -import java.util.Collections; import java.util.List; public class Ladder { @@ -15,6 +14,14 @@ public static Ladder of(int height, int width, LinkGenerator generator) { return new Ladder(getHorizontalRandomLines(height, width, generator)); } + public int ride(int number) { + int position = number; + for (HorizontalLine line : lines) { + position = line.move(position); + } + return position; + } + private static List getHorizontalRandomLines(int height, int width, LinkGenerator generator) { List lines = new ArrayList<>(); for (int i = 0; i < height; i++) { diff --git a/src/main/java/model/MoveCondition.java b/src/main/java/model/MoveCondition.java index 6ae7b3d0..45b6d25c 100644 --- a/src/main/java/model/MoveCondition.java +++ b/src/main/java/model/MoveCondition.java @@ -1,4 +1,6 @@ package model; -public class MoveCondition { +@FunctionalInterface +public interface MoveCondition { + boolean canMove(int index, HorizontalLine line); } diff --git a/src/main/java/model/MovingDirection.java b/src/main/java/model/MovingDirection.java index 9d4e4f3c..1d77884a 100644 --- a/src/main/java/model/MovingDirection.java +++ b/src/main/java/model/MovingDirection.java @@ -1,4 +1,25 @@ package model; -public class MoveDirection { +public enum MovingDirection { + + RIGHT(1, (index, line) -> index < line.size() && line.getLink(index) == Link.LINKED), + LEFT(-1, (index, line) -> index > 0 && line.getLink(index-1) == Link.LINKED), + STAY(0, (index, line) -> true); + + + private final int direction; + private final MoveCondition condition; + + MovingDirection(int direction, MoveCondition condition) { + this.direction = direction; + this.condition = condition; + } + + public boolean canMove(int index, HorizontalLine line) { + return condition.canMove(index, line); + } + + public int move(int index) { + return index + direction; + } } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index a64ca052..b001bc9d 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -4,6 +4,8 @@ import model.Ladder; import model.Link; +import java.util.Map; + public class OutputView { public static void printWidthMessage() { @@ -14,14 +16,20 @@ public static void printHeightMessage() { System.out.println("사다리의 높이는 몇 개인가요?"); } - public static void printLadder(Ladder ladder) { + System.out.println("실행결과"); for (HorizontalLine line : ladder.getLines()) { printHorizontalLine(line); } System.out.println(); } + public static void printResults(Map results) { + for (Integer i : results.keySet()) { + System.out.println(i + " -> " + results.get(i)); + } + } + private static void printHorizontalLine(HorizontalLine line) { for (Link point : line.getPoints()) { System.out.print("|"); From ddf7e13d13ab0e5b1da43aed7e6fdedd16cf786e Mon Sep 17 00:00:00 2001 From: chxghee Date: Fri, 25 Apr 2025 12:47:13 +0900 Subject: [PATCH 07/14] =?UTF-8?q?Refator:=20move=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=84=B1=EB=8A=A5=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 매번 MovingDirectioin을 배열로 생성했던 이전 방식에서 필드로 저장하여 사용하는 방식으로 개선 --- src/main/java/model/HorizontalLine.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/model/HorizontalLine.java b/src/main/java/model/HorizontalLine.java index dd209768..2c7ffd87 100644 --- a/src/main/java/model/HorizontalLine.java +++ b/src/main/java/model/HorizontalLine.java @@ -1,19 +1,21 @@ package model; -import java.util.Arrays; import java.util.Collections; +import java.util.EnumSet; import java.util.List; public class HorizontalLine { private final List points; + private final EnumSet movingDirections; public HorizontalLine(List points) { this.points = points; + this.movingDirections = EnumSet.allOf(MovingDirection.class); } public int move(int position) { - return Arrays.stream(MovingDirection.values()) + return movingDirections.stream() .filter(movingDirection -> movingDirection.canMove(position, this)) .findFirst() .map(movingDirection -> movingDirection.move(position)) From 522bc1c0060ce97e526634cc7508e230fabbda10 Mon Sep 17 00:00:00 2001 From: chxghee Date: Fri, 25 Apr 2025 17:47:30 +0900 Subject: [PATCH 08/14] =?UTF-8?q?Docs:=204=EB=8B=A8=EA=B3=84=20=EB=A6=AC?= =?UTF-8?q?=EB=93=9C=EB=AF=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 38 ++++++++++++++++++++++- src/main/java/model/LadderGameResult.java | 4 +++ src/main/java/model/Prize.java | 4 +++ src/main/java/model/Prizes.java | 4 +++ src/main/java/model/User.java | 4 +++ src/main/java/model/Users.java | 4 +++ src/main/java/utils/Constants.java | 4 +++ src/main/java/utils/StringSplitter.java | 4 +++ src/main/java/view/InputValidator.java | 4 +++ 9 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 src/main/java/model/LadderGameResult.java create mode 100644 src/main/java/model/Prize.java create mode 100644 src/main/java/model/Prizes.java create mode 100644 src/main/java/model/User.java create mode 100644 src/main/java/model/Users.java create mode 100644 src/main/java/utils/Constants.java create mode 100644 src/main/java/utils/StringSplitter.java create mode 100644 src/main/java/view/InputValidator.java diff --git a/README.md b/README.md index ddcca55c..bd04af5b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ # 사다리 타기 🪜 > 네이버의 사다리 타기 게임과 같이 콘솔 환경에서 사다리 게임을 진행할 수 있는 프로그램 +--- + ## 1단계 - 사다리 출력 ### 📝 기능 요구사항 @@ -50,7 +52,7 @@ ### 💻 구현 전략 -3. `MovingDirection enum 클래스`를 통해 사다리의 이동 전략을 관리한다. +1. `MovingDirection enum 클래스`를 통해 사다리의 이동 전략을 관리한다. ➡️ Enum 클래스에서 함수형 인터페이스를 통해 이동 방향별(RIGHT / LEFT / STAY) 전략을 람다식으로 설정한다. @@ -58,4 +60,38 @@ ➡️ Ladder 클래스의 `ride 메서드`를 통해 시작 위치를 전달하면 결과 위치를 반환한다. ➡️ HorizontalLine 클래스의 `move 메서드`를 통해 현재 위치에서 움직일 수 있는지 판단하고 위치를 옮긴다. +
+ +--- + +## 4단계 - 게임 실행 +### 📝 기능 요구사항 +✅ 사다리 게임에 참여하는 사람에 이름을 최대 5글자까지 부여할 수 있다. 사다리를 출력할 때 사람 이름도 같이 출력한다. + +✅ 사람 이름은 쉼표(,)를 기준으로 구분한다. + +✅ 개인별 이름을 입력하면 개인별 결과를 출력하고, "all"을 입력하면 전체 참여자의 실행 결과를 출력한다. + +### 💻 구현 전략 + +1. 게임 참가자의 이름과 사다리 위치 정보를 갖는 `User 클래스`와 이러한 User 클래스를 리스트로 갖는 `Users 클래스`를 통해 게임에 참가하는 유저를 관리 + +2. 게임 결과의 이름과 사다리 위치 정보를 갖는 `Prize 클래스`와 이러한 Prize 클래스를 리스트로 갖는 `Prizes 클래스`를 통해 게임의 결과정보를 관리 + + +3. 입력 포맷에 대한 검사는 view단에서 빠르게 처리하고, 그 외 도메인과 관련이 깊은 입력의 유효성 검사는 각 도메인 클래스에서 처리한다. + ➡️ 이름,결과 입력 포멧 검사 - `InputValidator 클래스` + ➡️ 이름 중복, 길이, 유효한 이름인지 검사 - `Users 클래스` + ➡️ 실행 결과 입력 개수 검사 - `Prizes 클래스` + + +2. 사다리 게임의 결과 집계 + ➡️ `LadderGameResult 클래스` - 를 key-value로 하는 결과MAP을 생성한다. + + + + + + + diff --git a/src/main/java/model/LadderGameResult.java b/src/main/java/model/LadderGameResult.java new file mode 100644 index 00000000..ff764176 --- /dev/null +++ b/src/main/java/model/LadderGameResult.java @@ -0,0 +1,4 @@ +package model; + +public class LadderGameResult { +} diff --git a/src/main/java/model/Prize.java b/src/main/java/model/Prize.java new file mode 100644 index 00000000..45cca0f9 --- /dev/null +++ b/src/main/java/model/Prize.java @@ -0,0 +1,4 @@ +package model; + +public class Prize { +} diff --git a/src/main/java/model/Prizes.java b/src/main/java/model/Prizes.java new file mode 100644 index 00000000..74ca63b4 --- /dev/null +++ b/src/main/java/model/Prizes.java @@ -0,0 +1,4 @@ +package model; + +public class Prizes { +} diff --git a/src/main/java/model/User.java b/src/main/java/model/User.java new file mode 100644 index 00000000..0a49865d --- /dev/null +++ b/src/main/java/model/User.java @@ -0,0 +1,4 @@ +package model; + +public class User { +} diff --git a/src/main/java/model/Users.java b/src/main/java/model/Users.java new file mode 100644 index 00000000..1070eefb --- /dev/null +++ b/src/main/java/model/Users.java @@ -0,0 +1,4 @@ +package model; + +public class Users { +} diff --git a/src/main/java/utils/Constants.java b/src/main/java/utils/Constants.java new file mode 100644 index 00000000..c4bd7d80 --- /dev/null +++ b/src/main/java/utils/Constants.java @@ -0,0 +1,4 @@ +package utils; + +public class Constants { +} diff --git a/src/main/java/utils/StringSplitter.java b/src/main/java/utils/StringSplitter.java new file mode 100644 index 00000000..4616426f --- /dev/null +++ b/src/main/java/utils/StringSplitter.java @@ -0,0 +1,4 @@ +package utils; + +public class StringSplitter { +} diff --git a/src/main/java/view/InputValidator.java b/src/main/java/view/InputValidator.java new file mode 100644 index 00000000..a1e95679 --- /dev/null +++ b/src/main/java/view/InputValidator.java @@ -0,0 +1,4 @@ +package view; + +public class InputValidator { +} From ba64d6f681802f06f579d7823bcd62ac9b6bd041 Mon Sep 17 00:00:00 2001 From: chxghee Date: Fri, 25 Apr 2025 17:49:43 +0900 Subject: [PATCH 09/14] =?UTF-8?q?Feat:=204=EB=8B=A8=EA=B3=84=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20=EC=8B=A4=ED=96=89=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 유저의 정보를 관리하는 User 클래스 추가 게임 결과를 관리하는 Prize 클래스 추가 게임의 결과를 계산하고 생성하는 LadderGameResult 클래스 추가 --- .../java/controller/LadderGameController.java | 84 ++++++++++++++----- src/main/java/model/Ladder.java | 11 +-- src/main/java/model/LadderGameResult.java | 31 +++++++ src/main/java/model/Prize.java | 16 ++++ src/main/java/model/Prizes.java | 39 +++++++++ src/main/java/model/User.java | 37 ++++++++ src/main/java/model/Users.java | 41 +++++++++ src/main/java/utils/Constants.java | 2 + src/main/java/utils/StringSplitter.java | 7 ++ src/main/java/view/InputValidator.java | 8 ++ src/main/java/view/InputView.java | 10 ++- src/main/java/view/OutputView.java | 63 ++++++++++---- 12 files changed, 304 insertions(+), 45 deletions(-) diff --git a/src/main/java/controller/LadderGameController.java b/src/main/java/controller/LadderGameController.java index 6ff0f8ab..09e9cf3e 100644 --- a/src/main/java/controller/LadderGameController.java +++ b/src/main/java/controller/LadderGameController.java @@ -1,12 +1,15 @@ package controller; -import model.Ladder; -import model.LinkGenerator; +import model.*; +import utils.StringSplitter; +import view.InputValidator; import view.InputView; import view.OutputView; -import java.util.HashMap; -import java.util.Map; +import java.util.List; +import java.util.Optional; + +import static utils.Constants.FINAL_QUERY_KEYWORD; public class LadderGameController { @@ -17,33 +20,72 @@ public LadderGameController(LinkGenerator linkGenerator) { } public void run() { - - int width = getWidth(); + Users users = getUsers(); + Prizes prizes = getPrizes(users.size()); int height = getHeight(); - Ladder ladder = Ladder.of(height, width, linkGenerator); - Map results = getLadderGameResult(width, ladder); + Ladder ladder = Ladder.of(height, users.size(), linkGenerator); + OutputView.printLadder(ladder, users, prizes); - OutputView.printLadder(ladder); - OutputView.printResults(results); + LadderGameResult ladderGameResult = LadderGameResult.of(users, prizes, ladder); + handleUserResultQuery(ladderGameResult, users); } - private static Map getLadderGameResult(int width, Ladder ladder) { - Map results = new HashMap<>(); - for (int i = 0; i < width; i++) { - results.put(i, ladder.ride(i)); + private static void handleUserResultQuery(LadderGameResult ladderGameResult, Users users) { + + Optional findUser = getFindUsername(users); + + if (findUser.isEmpty()) { + OutputView.printAllResults(ladderGameResult); + return; } - return results; + + OutputView.printPrize(ladderGameResult.findByUser(findUser.get())); + handleUserResultQuery(ladderGameResult, users); } - private static int getHeight() { - OutputView.printHeightMessage(); - return InputView.getInt(); + private static Optional getFindUsername(Users users) { + OutputView.printQueryInputMessage(); + String findUsername = InputView.getString(); + if (findUsername.equals(FINAL_QUERY_KEYWORD)) { + return Optional.empty(); + } + try { + return Optional.of(users.findByUsername(findUsername)); + } catch (Exception e) { + OutputView.printErrorMessage(e.getMessage()); + return getFindUsername(users); + } } - private static int getWidth() { - OutputView.printWidthMessage(); - return InputView.getInt(); + private static Users getUsers() { + OutputView.printUsernameInputMessage(); + try { + return Users.from(readAndSplitInput()); + } catch (Exception e) { + OutputView.printErrorMessage(e.getMessage()); + return getUsers(); + } } + private static Prizes getPrizes(int participantCount) { + OutputView.printPrizeInputMessage(); + try { + return Prizes.of(readAndSplitInput(), participantCount); + } catch (Exception e) { + OutputView.printErrorMessage(e.getMessage()); + return getPrizes(participantCount); + } + } + + private static List readAndSplitInput() { + String inputString = InputView.getString(); + InputValidator.validateUsernamePattern(inputString); + return StringSplitter.splitByComma(inputString); + } + + private static int getHeight() { + OutputView.printHeightInputMessage(); + return InputView.getInt(); + } } diff --git a/src/main/java/model/Ladder.java b/src/main/java/model/Ladder.java index 2a34fb91..77018d0f 100644 --- a/src/main/java/model/Ladder.java +++ b/src/main/java/model/Ladder.java @@ -4,22 +4,23 @@ import java.util.List; public class Ladder { + private final List lines; private Ladder(List horizontalLines) { this.lines = horizontalLines; } - public static Ladder of(int height, int width, LinkGenerator generator) { - return new Ladder(getHorizontalRandomLines(height, width, generator)); + public static Ladder of(int height, int participantCount, LinkGenerator generator) { + return new Ladder(getHorizontalRandomLines(height, participantCount, generator)); } - public int ride(int number) { - int position = number; + public Prize ride(User user, Prizes prizes) { + int position = user.getPosition(); for (HorizontalLine line : lines) { position = line.move(position); } - return position; + return prizes.getPrizeAtPosition(position); } private static List getHorizontalRandomLines(int height, int width, LinkGenerator generator) { diff --git a/src/main/java/model/LadderGameResult.java b/src/main/java/model/LadderGameResult.java index ff764176..aac01081 100644 --- a/src/main/java/model/LadderGameResult.java +++ b/src/main/java/model/LadderGameResult.java @@ -1,4 +1,35 @@ package model; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; + public class LadderGameResult { + + private final Map gameResults; + + public LadderGameResult(Map gameResults) { + this.gameResults = gameResults; + } + + public static LadderGameResult of(Users users, Prizes prizes, Ladder ladder) { + return new LadderGameResult(calculateResult(users, prizes, ladder)); + } + + private static Map calculateResult(Users users, Prizes prizes, Ladder ladder) { + return users.getUsers().stream() + .collect(Collectors.toMap( + user -> user, + user -> ladder.ride(user, prizes) + )); + } + + public Prize findByUser(User user) { + return Optional.ofNullable(gameResults.get(user)) + .orElseThrow(() -> new IllegalArgumentException("결과를 조회하려는 유저가 존재하지 않습니다!")); + } + + public Map getGameResults() { + return gameResults; + } } diff --git a/src/main/java/model/Prize.java b/src/main/java/model/Prize.java index 45cca0f9..a90c0ecd 100644 --- a/src/main/java/model/Prize.java +++ b/src/main/java/model/Prize.java @@ -1,4 +1,20 @@ package model; public class Prize { + + private final String prizeName; + private final int position; + + public Prize(String prizeName, int position) { + this.prizeName = prizeName; + this.position = position; + } + + public String getPrizeName() { + return prizeName; + } + + public int getPosition() { + return position; + } } diff --git a/src/main/java/model/Prizes.java b/src/main/java/model/Prizes.java index 74ca63b4..cec3a354 100644 --- a/src/main/java/model/Prizes.java +++ b/src/main/java/model/Prizes.java @@ -1,4 +1,43 @@ package model; +import java.util.List; +import java.util.stream.IntStream; + public class Prizes { + + private final List prizes; + + private Prizes(List prizes) { + this.prizes = prizes; + } + + public static Prizes of(List prizeList, int participantCount) { + validatePrizeCount(prizeList, participantCount); + return new Prizes( + IntStream.range(0, prizeList.size()) + .mapToObj(position -> new Prize(prizeList.get(position), position)) + .toList() + ); + } + + private static void validatePrizeCount(List prizeList, int participantCount) { + if (prizeList.size() != participantCount) { + throw new IllegalArgumentException("참가자 인원만큼 실행결과를 입력해야 합니다!"); + } + } + + public int size() { + return prizes.size(); + } + + public Prize getPrizeAtPosition(int position) { + return prizes.stream() + .filter(prize -> prize.getPosition() == position) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("해당하는 위치의 결과가 존재하지 않습니다!")); + } + + public List getPrizes() { + return prizes; + } } diff --git a/src/main/java/model/User.java b/src/main/java/model/User.java index 0a49865d..69fbcca3 100644 --- a/src/main/java/model/User.java +++ b/src/main/java/model/User.java @@ -1,4 +1,41 @@ package model; +import static utils.Constants.FINAL_QUERY_KEYWORD; +import static utils.Constants.MAX_USERNAME_LENGTH; + public class User { + + private final String name; + private final int position; + + public User(String name, int position) { + validateUsername(name); + this.name = name; + this.position = position; + } + + private static void validateUsername(String name) { + validateUsernameLength(name); + validateUsernameKeyword(name); + } + + private static void validateUsernameLength(String name) { + if (name.length() > MAX_USERNAME_LENGTH) { + throw new IllegalArgumentException("유저 이름은 최대" + MAX_USERNAME_LENGTH + "자 입니다!"); + } + } + + private static void validateUsernameKeyword(String name) { + if (name.equals(FINAL_QUERY_KEYWORD)) { + throw new IllegalArgumentException("유저 이름으로 \"" + FINAL_QUERY_KEYWORD + "\"는 사용할 수 없습니다!"); + } + } + + public String getName() { + return name; + } + + public int getPosition() { + return position; + } } diff --git a/src/main/java/model/Users.java b/src/main/java/model/Users.java index 1070eefb..7892490d 100644 --- a/src/main/java/model/Users.java +++ b/src/main/java/model/Users.java @@ -1,4 +1,45 @@ package model; +import java.util.HashSet; +import java.util.List; +import java.util.stream.IntStream; + public class Users { + + private final List users; + + private Users(List users) { + this.users = users; + } + + public static Users from(List usernames) { + validateDuplicatedUser(usernames); + return new Users( + IntStream.range(0, usernames.size()) + .mapToObj(position -> new User(usernames.get(position), position)) + .toList() + ); + } + + private static void validateDuplicatedUser(List usernames) { + HashSet usernameMap = new HashSet<>(usernames); + if (usernames.size() != usernameMap.size()) { + throw new IllegalArgumentException("게임 참가자의 이름은 중복이 되면 안됩니다!"); + } + } + + public User findByUsername(String findUsername) { + return users.stream() + .filter(user -> user.getName().equals(findUsername)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("결과를 조회하려는 유저가 존재하지 않습니다!")); + } + + public int size() { + return users.size(); + } + + public List getUsers() { + return users; + } } diff --git a/src/main/java/utils/Constants.java b/src/main/java/utils/Constants.java index c4bd7d80..00cce579 100644 --- a/src/main/java/utils/Constants.java +++ b/src/main/java/utils/Constants.java @@ -1,4 +1,6 @@ package utils; public class Constants { + public static final int MAX_USERNAME_LENGTH = 5; + public static final String FINAL_QUERY_KEYWORD = "ALL"; } diff --git a/src/main/java/utils/StringSplitter.java b/src/main/java/utils/StringSplitter.java index 4616426f..16418310 100644 --- a/src/main/java/utils/StringSplitter.java +++ b/src/main/java/utils/StringSplitter.java @@ -1,4 +1,11 @@ package utils; +import java.util.Arrays; +import java.util.List; + public class StringSplitter { + + public static List splitByComma(String inputString) { + return Arrays.asList(inputString.split(",")); + } } diff --git a/src/main/java/view/InputValidator.java b/src/main/java/view/InputValidator.java index a1e95679..d609b7a1 100644 --- a/src/main/java/view/InputValidator.java +++ b/src/main/java/view/InputValidator.java @@ -1,4 +1,12 @@ package view; public class InputValidator { + + private static final String USERNAME_NAMES_PATTERN = "^([a-zA-Z가-힣0-9]+)(,[a-zA-Z가-힣0-9]+)*$"; + + public static void validateUsernamePattern(String inputUsernames) { + if (!inputUsernames.matches(USERNAME_NAMES_PATTERN)) { + throw new IllegalArgumentException("게임에 참여할 유저 이름은 쉼표로 구분 되어야 합니다!"); + } + } } diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index dde7446e..f57e629d 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -7,6 +7,14 @@ public class InputView { private static final Scanner scanner = new Scanner(System.in); public static int getInt() { - return scanner.nextInt(); + int inputInt = scanner.nextInt(); + System.out.println(); + return inputInt; + } + + public static String getString() { + String inputString = scanner.next(); + System.out.println(); + return inputString; } } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index b001bc9d..a13d678b 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -1,40 +1,67 @@ package view; -import model.HorizontalLine; -import model.Ladder; -import model.Link; +import model.*; -import java.util.Map; +import java.util.List; +import java.util.function.Function; public class OutputView { - public static void printWidthMessage() { - System.out.println("사다리의 넓이는 몇 개인가요?"); + public static void printUsernameInputMessage() { + System.out.println("참여할 사람 이름을 입력하세요. (이름은 쉼표(,)로 구분하세요)"); } - public static void printHeightMessage() { - System.out.println("사다리의 높이는 몇 개인가요?"); + public static void printHeightInputMessage() { + System.out.println("최대 사다리 높이는 몇 개인가요?"); } - public static void printLadder(Ladder ladder) { + public static void printPrizeInputMessage() { + System.out.println("실행 결과를 입력하세요. (결과는 쉼표(,)로 구분하세요)"); + } + + public static void printQueryInputMessage() { + System.out.println("결과를 보고 싶은 사람은?"); + } + + public static void printPrize(Prize prize) { System.out.println("실행결과"); - for (HorizontalLine line : ladder.getLines()) { - printHorizontalLine(line); - } + System.out.println(prize.getPrizeName()); System.out.println(); } - public static void printResults(Map results) { - for (Integer i : results.keySet()) { - System.out.println(i + " -> " + results.get(i)); - } + public static void printErrorMessage(String errorMessage) { + System.out.println(errorMessage); + System.out.println(); + } + + public static void printLadder(Ladder ladder, Users users, Prizes prizes) { + System.out.println("사다리 결과"); + printAligned(users.getUsers(), User::getName); + ladder.getLines().forEach(OutputView::printHorizontalLine); + printAligned(prizes.getPrizes(), Prize::getPrizeName); + System.out.println(); + } + + public static void printAllResults(LadderGameResult ladderGameResult) { + System.out.println("실행결과"); + ladderGameResult.getGameResults().forEach((user, prize) -> + System.out.println(user.getName() + ": " + prize.getPrizeName()) + ); + System.out.println(); + } + + private static void printAligned(List items, Function mapper) { + items.forEach(item -> + System.out.printf("%-6s", mapper.apply(item))); + System.out.println(); } private static void printHorizontalLine(HorizontalLine line) { - for (Link point : line.getPoints()) { + System.out.print(" "); + line.getPoints().forEach(point -> { System.out.print("|"); printCrossing(point); - } + }); System.out.println(); } From 5aca5d67ef013ef7954ed7490eca4f22a24cf091 Mon Sep 17 00:00:00 2001 From: chxghee Date: Fri, 25 Apr 2025 18:13:14 +0900 Subject: [PATCH 10/14] =?UTF-8?q?Refactor:=20Ladder=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=ED=95=A8=EC=88=98=ED=98=95=20=EC=8A=A4=ED=83=80?= =?UTF-8?q?=EC=9D=BC=EB=A1=9C=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기존 명령형으로 작성했던 getRandomLines()메서드 선언형으로 변경하여 불변성 유지 (stream API) 그 외 getter 불변객체 반환하도록 변경 --- src/main/java/model/Ladder.java | 22 ++++++++++------------ src/main/java/model/LadderGameResult.java | 3 ++- src/main/java/model/Prizes.java | 3 ++- src/main/java/model/Users.java | 3 ++- 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/main/java/model/Ladder.java b/src/main/java/model/Ladder.java index 77018d0f..002b34b6 100644 --- a/src/main/java/model/Ladder.java +++ b/src/main/java/model/Ladder.java @@ -1,7 +1,8 @@ package model; -import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import java.util.stream.IntStream; public class Ladder { @@ -12,7 +13,13 @@ private Ladder(List horizontalLines) { } public static Ladder of(int height, int participantCount, LinkGenerator generator) { - return new Ladder(getHorizontalRandomLines(height, participantCount, generator)); + return new Ladder(getRandomLines(height, participantCount, generator)); + } + + private static List getRandomLines(int height, int participantCount, LinkGenerator generator) { + return IntStream.range(0, height) + .mapToObj(position -> LineGenerator.generateHorizontalLine(participantCount, generator)) + .toList(); } public Prize ride(User user, Prizes prizes) { @@ -23,16 +30,7 @@ public Prize ride(User user, Prizes prizes) { return prizes.getPrizeAtPosition(position); } - private static List getHorizontalRandomLines(int height, int width, LinkGenerator generator) { - List lines = new ArrayList<>(); - for (int i = 0; i < height; i++) { - HorizontalLine horizontalLine = LineGenerator.generateHorizontalLine(width, generator); - lines.add(horizontalLine); - } - return lines; - } - public List getLines() { - return lines; + return Collections.unmodifiableList(lines); } } diff --git a/src/main/java/model/LadderGameResult.java b/src/main/java/model/LadderGameResult.java index aac01081..abeb37ba 100644 --- a/src/main/java/model/LadderGameResult.java +++ b/src/main/java/model/LadderGameResult.java @@ -1,5 +1,6 @@ package model; +import java.util.Collections; import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; @@ -30,6 +31,6 @@ public Prize findByUser(User user) { } public Map getGameResults() { - return gameResults; + return Collections.unmodifiableMap(gameResults); } } diff --git a/src/main/java/model/Prizes.java b/src/main/java/model/Prizes.java index cec3a354..59122e07 100644 --- a/src/main/java/model/Prizes.java +++ b/src/main/java/model/Prizes.java @@ -1,5 +1,6 @@ package model; +import java.util.Collections; import java.util.List; import java.util.stream.IntStream; @@ -38,6 +39,6 @@ public Prize getPrizeAtPosition(int position) { } public List getPrizes() { - return prizes; + return Collections.unmodifiableList(prizes); } } diff --git a/src/main/java/model/Users.java b/src/main/java/model/Users.java index 7892490d..3fa44904 100644 --- a/src/main/java/model/Users.java +++ b/src/main/java/model/Users.java @@ -1,5 +1,6 @@ package model; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.stream.IntStream; @@ -40,6 +41,6 @@ public int size() { } public List getUsers() { - return users; + return Collections.unmodifiableList(users); } } From 32d7b66691495439f7452d4c5b66b71bbb00d975 Mon Sep 17 00:00:00 2001 From: chxghee Date: Fri, 25 Apr 2025 23:16:41 +0900 Subject: [PATCH 11/14] =?UTF-8?q?Fix:=20=EC=97=90=EB=9F=AC=20=EB=A9=94?= =?UTF-8?q?=EC=84=B8=EC=A7=80=20=EB=B0=8F=20=ED=95=A8=EC=88=98=EB=AA=85,?= =?UTF-8?q?=20=EC=9D=B8=EC=9E=90=EB=AA=85,=20=EA=B3=B5=EB=B0=B1=20=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/LadderGameController.java | 2 +- src/main/java/model/LineGenerator.java | 8 +++----- src/main/java/model/User.java | 2 +- src/main/java/model/Users.java | 2 +- src/main/java/utils/Constants.java | 2 +- src/main/java/view/InputValidator.java | 6 +++--- src/main/java/view/OutputView.java | 4 +--- src/test/java/model/HorizontalLineTest.java | 4 ++++ src/test/java/model/LadderGameResultTest.java | 4 ++++ src/test/java/model/LadderTest.java | 4 ++++ src/test/java/model/LineGeneratorTest.java | 4 ++++ src/test/java/model/LinkTest.java | 4 ++++ src/test/java/model/LinkedGenerator.java | 4 ++++ src/test/java/model/MovingDirectionTest.java | 4 ++++ src/test/java/model/PrizesTest.java | 4 ++++ src/test/java/model/UnLinkedGenerator.java | 4 ++++ src/test/java/model/UserTest.java | 4 ++++ src/test/java/model/UsersTest.java | 4 ++++ src/test/java/utils/StringSplitterTest.java | 4 ++++ src/test/java/view/InputValidatorTest.java | 4 ++++ 20 files changed, 63 insertions(+), 15 deletions(-) create mode 100644 src/test/java/model/HorizontalLineTest.java create mode 100644 src/test/java/model/LadderGameResultTest.java create mode 100644 src/test/java/model/LadderTest.java create mode 100644 src/test/java/model/LineGeneratorTest.java create mode 100644 src/test/java/model/LinkTest.java create mode 100644 src/test/java/model/LinkedGenerator.java create mode 100644 src/test/java/model/MovingDirectionTest.java create mode 100644 src/test/java/model/PrizesTest.java create mode 100644 src/test/java/model/UnLinkedGenerator.java create mode 100644 src/test/java/model/UserTest.java create mode 100644 src/test/java/model/UsersTest.java create mode 100644 src/test/java/utils/StringSplitterTest.java create mode 100644 src/test/java/view/InputValidatorTest.java diff --git a/src/main/java/controller/LadderGameController.java b/src/main/java/controller/LadderGameController.java index 09e9cf3e..373fb702 100644 --- a/src/main/java/controller/LadderGameController.java +++ b/src/main/java/controller/LadderGameController.java @@ -80,7 +80,7 @@ private static Prizes getPrizes(int participantCount) { private static List readAndSplitInput() { String inputString = InputView.getString(); - InputValidator.validateUsernamePattern(inputString); + InputValidator.validateInputStringPattern(inputString); return StringSplitter.splitByComma(inputString); } diff --git a/src/main/java/model/LineGenerator.java b/src/main/java/model/LineGenerator.java index 34627524..3bdcacda 100644 --- a/src/main/java/model/LineGenerator.java +++ b/src/main/java/model/LineGenerator.java @@ -3,15 +3,14 @@ import java.util.ArrayList; import java.util.List; -public class LineGenerator { // 가로 기준으로 연결 여부 라인을 생성 - - public static HorizontalLine generateHorizontalLine(int width, LinkGenerator generate) { +public class LineGenerator { + public static HorizontalLine generateHorizontalLine(int width, LinkGenerator generator) { Link prev = Link.UNLINKED; List link = new ArrayList<>(); for (int i = 0; i < width - 1; i++) { - prev = addLink(prev, generate.generate(), link); + prev = addLink(prev, generator.generate(), link); } link.add(Link.UNLINKED); return new HorizontalLine(link); @@ -24,5 +23,4 @@ private static Link addLink(Link prev, Link now, List link) { link.add(now); return now; } - } diff --git a/src/main/java/model/User.java b/src/main/java/model/User.java index 69fbcca3..fb573870 100644 --- a/src/main/java/model/User.java +++ b/src/main/java/model/User.java @@ -21,7 +21,7 @@ private static void validateUsername(String name) { private static void validateUsernameLength(String name) { if (name.length() > MAX_USERNAME_LENGTH) { - throw new IllegalArgumentException("유저 이름은 최대" + MAX_USERNAME_LENGTH + "자 입니다!"); + throw new IllegalArgumentException("유저 이름은 최대 " + MAX_USERNAME_LENGTH + "자 입니다!"); } } diff --git a/src/main/java/model/Users.java b/src/main/java/model/Users.java index 3fa44904..00251e19 100644 --- a/src/main/java/model/Users.java +++ b/src/main/java/model/Users.java @@ -33,7 +33,7 @@ public User findByUsername(String findUsername) { return users.stream() .filter(user -> user.getName().equals(findUsername)) .findFirst() - .orElseThrow(() -> new IllegalArgumentException("결과를 조회하려는 유저가 존재하지 않습니다!")); + .orElseThrow(() -> new IllegalArgumentException("해당 유저가 존재하지 않습니다!")); } public int size() { diff --git a/src/main/java/utils/Constants.java b/src/main/java/utils/Constants.java index 00cce579..b717da4a 100644 --- a/src/main/java/utils/Constants.java +++ b/src/main/java/utils/Constants.java @@ -2,5 +2,5 @@ public class Constants { public static final int MAX_USERNAME_LENGTH = 5; - public static final String FINAL_QUERY_KEYWORD = "ALL"; + public static final String FINAL_QUERY_KEYWORD = "all"; } diff --git a/src/main/java/view/InputValidator.java b/src/main/java/view/InputValidator.java index d609b7a1..dc9f68c2 100644 --- a/src/main/java/view/InputValidator.java +++ b/src/main/java/view/InputValidator.java @@ -4,9 +4,9 @@ public class InputValidator { private static final String USERNAME_NAMES_PATTERN = "^([a-zA-Z가-힣0-9]+)(,[a-zA-Z가-힣0-9]+)*$"; - public static void validateUsernamePattern(String inputUsernames) { - if (!inputUsernames.matches(USERNAME_NAMES_PATTERN)) { - throw new IllegalArgumentException("게임에 참여할 유저 이름은 쉼표로 구분 되어야 합니다!"); + public static void validateInputStringPattern(String input) { + if (!input.matches(USERNAME_NAMES_PATTERN)) { + throw new IllegalArgumentException("입력은 쉼표로 구분 되어야 합니다!"); } } } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index a13d678b..c7c5d619 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -45,7 +45,7 @@ public static void printLadder(Ladder ladder, Users users, Prizes prizes) { public static void printAllResults(LadderGameResult ladderGameResult) { System.out.println("실행결과"); ladderGameResult.getGameResults().forEach((user, prize) -> - System.out.println(user.getName() + ": " + prize.getPrizeName()) + System.out.println(user.getName() + " : " + prize.getPrizeName()) ); System.out.println(); } @@ -73,6 +73,4 @@ private static void printCrossing(Link point) { System.out.print(" "); } } - - } diff --git a/src/test/java/model/HorizontalLineTest.java b/src/test/java/model/HorizontalLineTest.java new file mode 100644 index 00000000..f3818bd5 --- /dev/null +++ b/src/test/java/model/HorizontalLineTest.java @@ -0,0 +1,4 @@ +import static org.junit.jupiter.api.Assertions.*; +class HorizontalLineTest { + +} diff --git a/src/test/java/model/LadderGameResultTest.java b/src/test/java/model/LadderGameResultTest.java new file mode 100644 index 00000000..29d7a8c7 --- /dev/null +++ b/src/test/java/model/LadderGameResultTest.java @@ -0,0 +1,4 @@ +import static org.junit.jupiter.api.Assertions.*; +class LadderGameResultTest { + +} diff --git a/src/test/java/model/LadderTest.java b/src/test/java/model/LadderTest.java new file mode 100644 index 00000000..d398645a --- /dev/null +++ b/src/test/java/model/LadderTest.java @@ -0,0 +1,4 @@ +import static org.junit.jupiter.api.Assertions.*; +class LadderTest { + +} diff --git a/src/test/java/model/LineGeneratorTest.java b/src/test/java/model/LineGeneratorTest.java new file mode 100644 index 00000000..b3cc6f70 --- /dev/null +++ b/src/test/java/model/LineGeneratorTest.java @@ -0,0 +1,4 @@ +import static org.junit.jupiter.api.Assertions.*; +class LineGeneratorTest { + +} diff --git a/src/test/java/model/LinkTest.java b/src/test/java/model/LinkTest.java new file mode 100644 index 00000000..c4eb671f --- /dev/null +++ b/src/test/java/model/LinkTest.java @@ -0,0 +1,4 @@ +import static org.junit.jupiter.api.Assertions.*; +class LinkTest { + +} diff --git a/src/test/java/model/LinkedGenerator.java b/src/test/java/model/LinkedGenerator.java new file mode 100644 index 00000000..e868c2bb --- /dev/null +++ b/src/test/java/model/LinkedGenerator.java @@ -0,0 +1,4 @@ +package model; + +public class LinkedGenerator { +} diff --git a/src/test/java/model/MovingDirectionTest.java b/src/test/java/model/MovingDirectionTest.java new file mode 100644 index 00000000..d90d7c1e --- /dev/null +++ b/src/test/java/model/MovingDirectionTest.java @@ -0,0 +1,4 @@ +import static org.junit.jupiter.api.Assertions.*; +class MovingDirectionTest { + +} diff --git a/src/test/java/model/PrizesTest.java b/src/test/java/model/PrizesTest.java new file mode 100644 index 00000000..71482404 --- /dev/null +++ b/src/test/java/model/PrizesTest.java @@ -0,0 +1,4 @@ +import static org.junit.jupiter.api.Assertions.*; +class PrizesTest { + +} diff --git a/src/test/java/model/UnLinkedGenerator.java b/src/test/java/model/UnLinkedGenerator.java new file mode 100644 index 00000000..5fd72d63 --- /dev/null +++ b/src/test/java/model/UnLinkedGenerator.java @@ -0,0 +1,4 @@ +package model; + +public class UnLinkGenerator { +} diff --git a/src/test/java/model/UserTest.java b/src/test/java/model/UserTest.java new file mode 100644 index 00000000..64b5c677 --- /dev/null +++ b/src/test/java/model/UserTest.java @@ -0,0 +1,4 @@ +import static org.junit.jupiter.api.Assertions.*; +class UserTest { + +} diff --git a/src/test/java/model/UsersTest.java b/src/test/java/model/UsersTest.java new file mode 100644 index 00000000..0f0649e9 --- /dev/null +++ b/src/test/java/model/UsersTest.java @@ -0,0 +1,4 @@ +import static org.junit.jupiter.api.Assertions.*; +class UsersTest { + +} diff --git a/src/test/java/utils/StringSplitterTest.java b/src/test/java/utils/StringSplitterTest.java new file mode 100644 index 00000000..83549807 --- /dev/null +++ b/src/test/java/utils/StringSplitterTest.java @@ -0,0 +1,4 @@ +import static org.junit.jupiter.api.Assertions.*; +class StringSplitterTest { + +} diff --git a/src/test/java/view/InputValidatorTest.java b/src/test/java/view/InputValidatorTest.java new file mode 100644 index 00000000..7e7ed31d --- /dev/null +++ b/src/test/java/view/InputValidatorTest.java @@ -0,0 +1,4 @@ +import static org.junit.jupiter.api.Assertions.*; +class InputValidatorTest { + +} From 02e6f39e4a02ea7ddec0d2d9757bdacb6a99c694 Mon Sep 17 00:00:00 2001 From: chxghee Date: Fri, 25 Apr 2025 23:17:14 +0900 Subject: [PATCH 12/14] =?UTF-8?q?Test:=20=EB=AA=A8=EB=93=A0=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/model/HorizontalLineTest.java | 33 ++++++++++++- src/test/java/model/LadderGameResultTest.java | 46 ++++++++++++++++++- src/test/java/model/LadderTest.java | 38 ++++++++++++++- src/test/java/model/LineGeneratorTest.java | 41 ++++++++++++++++- src/test/java/model/LinkTest.java | 32 ++++++++++++- src/test/java/model/LinkedGenerator.java | 6 ++- src/test/java/model/MovingDirectionTest.java | 32 ++++++++++++- src/test/java/model/PrizesTest.java | 29 +++++++++++- src/test/java/model/UnLinkedGenerator.java | 6 ++- src/test/java/model/UserTest.java | 16 ++++++- src/test/java/model/UsersTest.java | 34 +++++++++++++- src/test/java/utils/StringSplitterTest.java | 17 ++++++- src/test/java/view/InputValidatorTest.java | 16 ++++++- 13 files changed, 322 insertions(+), 24 deletions(-) diff --git a/src/test/java/model/HorizontalLineTest.java b/src/test/java/model/HorizontalLineTest.java index f3818bd5..a400eb13 100644 --- a/src/test/java/model/HorizontalLineTest.java +++ b/src/test/java/model/HorizontalLineTest.java @@ -1,4 +1,33 @@ -import static org.junit.jupiter.api.Assertions.*; +package model; + +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.*; + class HorizontalLineTest { - + + private final HorizontalLine horizontalLine = new HorizontalLine(List.of(Link.UNLINKED, Link.LINKED, Link.UNLINKED)); + + @Test + public void 오른쪽_사다리와_연결되면_오른쪽으로_움직여야_한다() { + int position = 1; + int afterMove = horizontalLine.move(position); + assertThat(afterMove).isEqualTo(position + 1); + } + + @Test + public void 왼쪽_사다리와_연결되면_왼쪽으로_움직여야_한다() { + int position = 2; + int afterMove = horizontalLine.move(position); + assertThat(afterMove).isEqualTo(position - 1); + } + + @Test + public void 사다리가_연결되지_않으면_제자리를_유지해햐_한다() { + int position = 0; + int afterMove = horizontalLine.move(position); + assertThat(afterMove).isEqualTo(position); + } } diff --git a/src/test/java/model/LadderGameResultTest.java b/src/test/java/model/LadderGameResultTest.java index 29d7a8c7..151983f7 100644 --- a/src/test/java/model/LadderGameResultTest.java +++ b/src/test/java/model/LadderGameResultTest.java @@ -1,4 +1,46 @@ -import static org.junit.jupiter.api.Assertions.*; +package model; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; +import java.util.stream.IntStream; + +import static org.assertj.core.api.Assertions.*; + class LadderGameResultTest { - + + private Users users; + private Prizes prizes; + private Ladder ladder; + + @BeforeEach + void setUp() { + int height = 10; + users = Users.from(List.of("짱구", "철수", "유리", "맹구", "훈이")); + prizes = Prizes.of(List.of("1등", "꽝","꽝","꽝","꽝"), users.size()); + ladder = Ladder.of(height, users.size(), new UnLinkedGenerator()); + } + + @Test + public void 사다리가_연결되지_않는다면_입력한_순서대로_당첨됨다() { + LadderGameResult result = LadderGameResult.of(users, prizes, ladder); + + Map gameResults = result.getGameResults(); + + IntStream.range(0, gameResults.size()).forEach(i -> + assertThat(result.findByUser(users.getUsers().get(i))).isEqualTo(prizes.getPrizeAtPosition(i)) + ); + } + + @Test + public void 결과조회시_유저가_존재하지_않으면_예외가_발생해야_한다() { + LadderGameResult result = LadderGameResult.of(users, prizes, ladder); + User user = new User("수지", 5); + + assertThatThrownBy(() -> result.findByUser(user)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("결과를 조회하려는 유저가 존재하지 않습니다!"); + } } diff --git a/src/test/java/model/LadderTest.java b/src/test/java/model/LadderTest.java index d398645a..c4d136dd 100644 --- a/src/test/java/model/LadderTest.java +++ b/src/test/java/model/LadderTest.java @@ -1,4 +1,38 @@ -import static org.junit.jupiter.api.Assertions.*; +package model; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.*; + + class LadderTest { - + + private final int height = 10; + private final int participantCount = 5; + private User user; + private Prizes prizes; + + @BeforeEach + void setUp() { + user = new User("이창희", 0); + prizes = Prizes.of(List.of("1등", "꽝","꽝","꽝","꽝"), participantCount); + } + + @Test + public void 주어진_높이만큼_사다리가_생성되어야_한다() { + Ladder ladder = Ladder.of(height, participantCount, new LinkedGenerator()); + int ladderHeight = ladder.getLines().size(); + assertThat(ladderHeight).isEqualTo(height); + } + + @Test + public void 사다라가_연결되어_있지_않다면_사다리를_탔을_때_유저와_같은_위치의_prize가_반환되어야_한다() { + Ladder ladder = Ladder.of(height, participantCount, new UnLinkedGenerator()); + Prize result = ladder.ride(user, prizes); + Prize expectPrize = prizes.getPrizeAtPosition(user.getPosition()); + assertThat(result).isEqualTo(expectPrize); + } } diff --git a/src/test/java/model/LineGeneratorTest.java b/src/test/java/model/LineGeneratorTest.java index b3cc6f70..a113f387 100644 --- a/src/test/java/model/LineGeneratorTest.java +++ b/src/test/java/model/LineGeneratorTest.java @@ -1,4 +1,41 @@ -import static org.junit.jupiter.api.Assertions.*; +package model; + +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.*; + class LineGeneratorTest { - + + private final int width = 5; + + @Test + public void LinkGenerator가_항상_UNLINKED를_반환할_때_생성되는_모든_가로라인은_UNLINKED여야_한다() { + LinkGenerator unlinkedGenerator = new UnLinkedGenerator(); + HorizontalLine generatedLine = LineGenerator.generateHorizontalLine(width, unlinkedGenerator); + generatedLine.getPoints().forEach(point -> + assertThat(point).isEqualTo(Link.UNLINKED) + ); + } + + @Test + public void LinkGenerator가_항상_LINKED를_반환해도_가로라인이_두_번_연속_LINKED이면_안_된다() { + LinkGenerator linkedGenerator = new LinkedGenerator(); + HorizontalLine generatedLine = LineGenerator.generateHorizontalLine(width, linkedGenerator); + + List links = generatedLine.getPoints(); + for (int i = 0; i < links.size() - 1; i++) { + Link current = links.get(i); + Link next = links.get(i + 1); + assertThat(current.isLinked() && next.isLinked()).isFalse(); + } + } + + @Test + public void 생성되는_가로_링크의_개수는_사다리의_넓이와_같아야한다() { + LinkGenerator unlinkedGenerator = new UnLinkedGenerator(); + HorizontalLine generatedLine = LineGenerator.generateHorizontalLine(width, unlinkedGenerator); + assertThat(generatedLine.size()).isEqualTo(width); + } } diff --git a/src/test/java/model/LinkTest.java b/src/test/java/model/LinkTest.java index c4eb671f..81f537ae 100644 --- a/src/test/java/model/LinkTest.java +++ b/src/test/java/model/LinkTest.java @@ -1,4 +1,32 @@ -import static org.junit.jupiter.api.Assertions.*; +package model; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.*; + class LinkTest { - + + @Test + public void 연결상태가_false이면__UNLINKED가_생성_되어야_한다() { + Link link = Link.from(false); + assertThat(link).isEqualTo(Link.UNLINKED); + } + + @Test + public void 연결상태가_true이면_LINKED가_생성_되어야_한다() { + Link link = Link.from(true); + assertThat(link).isEqualTo(Link.LINKED); + } + + @Test + public void 현재_연결상태라면_true가_반환되어야_한다() { + Link link = Link.from(true); + assertThat(link.isLinked()).isTrue(); + } + + @Test + public void 현재_연결상태가_아니라면_false가_반환되어야_한다() { + Link link = Link.from(false); + assertThat(link.isLinked()).isFalse(); + } } diff --git a/src/test/java/model/LinkedGenerator.java b/src/test/java/model/LinkedGenerator.java index e868c2bb..1115b6cc 100644 --- a/src/test/java/model/LinkedGenerator.java +++ b/src/test/java/model/LinkedGenerator.java @@ -1,4 +1,8 @@ package model; -public class LinkedGenerator { +public class LinkedGenerator implements LinkGenerator { + @Override + public Link generate() { + return Link.from(true); + } } diff --git a/src/test/java/model/MovingDirectionTest.java b/src/test/java/model/MovingDirectionTest.java index d90d7c1e..4399577d 100644 --- a/src/test/java/model/MovingDirectionTest.java +++ b/src/test/java/model/MovingDirectionTest.java @@ -1,4 +1,32 @@ -import static org.junit.jupiter.api.Assertions.*; +package model; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.*; + class MovingDirectionTest { - + + @Test + public void 오른쪽_이동_전략() { + HorizontalLine line = LineGenerator.generateHorizontalLine(5, new LinkedGenerator()); + int position = 0; + + boolean canMove = MovingDirection.RIGHT.canMove(position, line); + int resultPosition = MovingDirection.RIGHT.move(position); + + assertThat(canMove).isTrue(); + assertThat(resultPosition).isEqualTo(position + 1); + } + + @Test + public void 왼쪽_이동_전략() { + HorizontalLine line = LineGenerator.generateHorizontalLine(5, new LinkedGenerator()); + int position = 1; + + boolean canMove = MovingDirection.LEFT.canMove(position, line); + int resultPosition = MovingDirection.LEFT.move(position); + + assertThat(canMove).isTrue(); + assertThat(resultPosition).isEqualTo(position - 1); + } } diff --git a/src/test/java/model/PrizesTest.java b/src/test/java/model/PrizesTest.java index 71482404..23305c33 100644 --- a/src/test/java/model/PrizesTest.java +++ b/src/test/java/model/PrizesTest.java @@ -1,4 +1,29 @@ -import static org.junit.jupiter.api.Assertions.*; +package model; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.*; + class PrizesTest { - + + private List prizeList = List.of("1등", "꽝","꽝","꽝","꽝"); + private final int participantCount = 5; + + @Test + public void 참가자_인원보다_Prize가_적으면_예외가_발생해야_한다() { + assertThatThrownBy(() -> Prizes.of(prizeList, participantCount - 1)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("참가자 인원만큼 실행결과를 입력해야 합니다!"); + } + + @Test + public void 찾으려는_위치에_Prize가_존재하지_않으면_예외가_발생해야_한다() { + Prizes prizes = Prizes.of(prizeList, participantCount); + assertThatThrownBy(() -> prizes.getPrizeAtPosition(90)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("해당하는 위치의 결과가 존재하지 않습니다!"); + } } diff --git a/src/test/java/model/UnLinkedGenerator.java b/src/test/java/model/UnLinkedGenerator.java index 5fd72d63..1f9cfd3e 100644 --- a/src/test/java/model/UnLinkedGenerator.java +++ b/src/test/java/model/UnLinkedGenerator.java @@ -1,4 +1,8 @@ package model; -public class UnLinkGenerator { +public class UnLinkedGenerator implements LinkGenerator{ + @Override + public Link generate() { + return Link.from(false); + } } diff --git a/src/test/java/model/UserTest.java b/src/test/java/model/UserTest.java index 64b5c677..ba50aabe 100644 --- a/src/test/java/model/UserTest.java +++ b/src/test/java/model/UserTest.java @@ -1,4 +1,16 @@ -import static org.junit.jupiter.api.Assertions.*; +package model; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.*; + class UserTest { - + + @Test + public void 유저의_이름이_5자_초과이면_예외가_발생해야_한다() { + String username = "사다리게임장인"; + assertThatThrownBy(() -> new User(username, 0)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("유저 이름은 최대 5자 입니다!"); + } } diff --git a/src/test/java/model/UsersTest.java b/src/test/java/model/UsersTest.java index 0f0649e9..cced06a4 100644 --- a/src/test/java/model/UsersTest.java +++ b/src/test/java/model/UsersTest.java @@ -1,4 +1,34 @@ -import static org.junit.jupiter.api.Assertions.*; +package model; + +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.*; + class UsersTest { - + + @Test + public void 참가자의_이름이_중복되면_예외가_발생해야_한다() { + List usernames = List.of("짱구","철수","유리","맹구","짱구"); + assertThatThrownBy(() -> Users.from(usernames)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("게임 참가자의 이름은 중복이 되면 안됩니다!"); + } + + @Test + public void 참가자_이름_수_만큼_User가_생성되어야_한다() { + List usernames = List.of("짱구","철수","유리","맹구","훈이"); + Users users = Users.from(usernames); + assertThat(users.size()).isEqualTo(5); + } + + @Test + public void 찾으려는_유저의_이름이_리스트에_존재하지_않으면_예외가_발생해야_한다() throws Exception { + List usernames = List.of("짱구","철수","유리","맹구","훈이"); + Users users = Users.from(usernames); + assertThatThrownBy(() -> users.findByUsername("수지")) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("해당 유저가 존재하지 않습니다!"); + } } diff --git a/src/test/java/utils/StringSplitterTest.java b/src/test/java/utils/StringSplitterTest.java index 83549807..6d5ccc58 100644 --- a/src/test/java/utils/StringSplitterTest.java +++ b/src/test/java/utils/StringSplitterTest.java @@ -1,4 +1,17 @@ -import static org.junit.jupiter.api.Assertions.*; +package utils; + +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.*; + class StringSplitterTest { - + + @Test + public void 문자열을_쉼표로_구분하여_리스트로_반환되어야_한다() { + String inputString = "짱구, 철수,유리,맹구,훈이"; + List strings = StringSplitter.splitByComma(inputString); + assertThat(strings).hasSize(5); + } } diff --git a/src/test/java/view/InputValidatorTest.java b/src/test/java/view/InputValidatorTest.java index 7e7ed31d..5298b021 100644 --- a/src/test/java/view/InputValidatorTest.java +++ b/src/test/java/view/InputValidatorTest.java @@ -1,4 +1,16 @@ -import static org.junit.jupiter.api.Assertions.*; +package view; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.*; + class InputValidatorTest { - + + @Test + public void 입력_문자열의_구분자가_쉼표가_아니면_예외가_발생해야_한다() { + String inputString = "짱구&철수&유리&맹구&훈이"; + assertThatThrownBy(() -> InputValidator.validateInputStringPattern(inputString)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("입력은 쉼표로 구분 되어야 합니다!"); + } } From 935313a1bcb55f986be765251f8c6444bc529b61 Mon Sep 17 00:00:00 2001 From: chxghee Date: Wed, 7 May 2025 12:33:23 +0900 Subject: [PATCH 13/14] =?UTF-8?q?Refactor:=20=EB=A6=AC=EB=B7=B0=20?= =?UTF-8?q?=EB=B0=98=EC=98=81=20+=20model=20=ED=8C=A8=ED=82=A4=EC=A7=80=20?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=EC=84=B8=EB=B6=84=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit model 내부의 패키지를 ladder, user prize로 세분화 생성자 private로 변경 테스트 코드 for loop -> Stream API 변경 --- src/main/java/Application.java | 2 +- .../java/controller/LadderGameController.java | 5 +++++ src/main/java/model/LadderGameResult.java | 8 +++++++- src/main/java/model/MoveCondition.java | 2 ++ src/main/java/model/MovingDirection.java | 3 +++ src/main/java/model/{ => Prize}/Prize.java | 2 +- src/main/java/model/{ => Prize}/Prizes.java | 2 +- .../java/model/{ => ladder}/HorizontalLine.java | 4 +++- src/main/java/model/{ => ladder}/Ladder.java | 6 +++++- .../java/model/{ => ladder}/LineGenerator.java | 2 +- src/main/java/model/{ => ladder}/Link.java | 2 +- .../java/model/{ => ladder}/LinkGenerator.java | 2 +- .../model/{ => ladder}/RandomLinkGenerator.java | 2 +- src/main/java/model/{ => user}/User.java | 2 +- src/main/java/model/{ => user}/Users.java | 2 +- src/main/java/view/OutputView.java | 7 +++++++ src/test/java/model/HorizontalLineTest.java | 2 ++ src/test/java/model/LadderGameResultTest.java | 5 +++++ src/test/java/model/LadderTest.java | 4 ++++ src/test/java/model/LineGeneratorTest.java | 15 ++++++++++----- src/test/java/model/LinkTest.java | 1 + src/test/java/model/LinkedGenerator.java | 3 +++ src/test/java/model/MovingDirectionTest.java | 2 ++ src/test/java/model/PrizesTest.java | 2 +- src/test/java/model/UnLinkedGenerator.java | 5 ++++- src/test/java/model/UserTest.java | 1 + src/test/java/model/UsersTest.java | 1 + 27 files changed, 75 insertions(+), 19 deletions(-) rename src/main/java/model/{ => Prize}/Prize.java (94%) rename src/main/java/model/{ => Prize}/Prizes.java (98%) rename src/main/java/model/{ => ladder}/HorizontalLine.java (94%) rename src/main/java/model/{ => ladder}/Ladder.java (91%) rename src/main/java/model/{ => ladder}/LineGenerator.java (96%) rename src/main/java/model/{ => ladder}/Link.java (92%) rename src/main/java/model/{ => ladder}/LinkGenerator.java (72%) rename src/main/java/model/{ => ladder}/RandomLinkGenerator.java (92%) rename src/main/java/model/{ => user}/User.java (98%) rename src/main/java/model/{ => user}/Users.java (98%) diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 9915e61d..604124c7 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -1,5 +1,5 @@ import controller.LadderGameController; -import model.RandomLinkGenerator; +import model.ladder.RandomLinkGenerator; public class Application { public static void main(String[] args) { diff --git a/src/main/java/controller/LadderGameController.java b/src/main/java/controller/LadderGameController.java index 373fb702..9e50cba2 100644 --- a/src/main/java/controller/LadderGameController.java +++ b/src/main/java/controller/LadderGameController.java @@ -1,6 +1,11 @@ package controller; import model.*; +import model.Prize.Prizes; +import model.ladder.Ladder; +import model.ladder.LinkGenerator; +import model.user.User; +import model.user.Users; import utils.StringSplitter; import view.InputValidator; import view.InputView; diff --git a/src/main/java/model/LadderGameResult.java b/src/main/java/model/LadderGameResult.java index abeb37ba..3cb1bd59 100644 --- a/src/main/java/model/LadderGameResult.java +++ b/src/main/java/model/LadderGameResult.java @@ -1,5 +1,11 @@ package model; +import model.Prize.Prize; +import model.Prize.Prizes; +import model.ladder.Ladder; +import model.user.User; +import model.user.Users; + import java.util.Collections; import java.util.Map; import java.util.Optional; @@ -9,7 +15,7 @@ public class LadderGameResult { private final Map gameResults; - public LadderGameResult(Map gameResults) { + private LadderGameResult(Map gameResults) { this.gameResults = gameResults; } diff --git a/src/main/java/model/MoveCondition.java b/src/main/java/model/MoveCondition.java index 45b6d25c..5b95f00c 100644 --- a/src/main/java/model/MoveCondition.java +++ b/src/main/java/model/MoveCondition.java @@ -1,5 +1,7 @@ package model; +import model.ladder.HorizontalLine; + @FunctionalInterface public interface MoveCondition { boolean canMove(int index, HorizontalLine line); diff --git a/src/main/java/model/MovingDirection.java b/src/main/java/model/MovingDirection.java index 1d77884a..fbd67a2d 100644 --- a/src/main/java/model/MovingDirection.java +++ b/src/main/java/model/MovingDirection.java @@ -1,5 +1,8 @@ package model; +import model.ladder.HorizontalLine; +import model.ladder.Link; + public enum MovingDirection { RIGHT(1, (index, line) -> index < line.size() && line.getLink(index) == Link.LINKED), diff --git a/src/main/java/model/Prize.java b/src/main/java/model/Prize/Prize.java similarity index 94% rename from src/main/java/model/Prize.java rename to src/main/java/model/Prize/Prize.java index a90c0ecd..09832693 100644 --- a/src/main/java/model/Prize.java +++ b/src/main/java/model/Prize/Prize.java @@ -1,4 +1,4 @@ -package model; +package model.Prize; public class Prize { diff --git a/src/main/java/model/Prizes.java b/src/main/java/model/Prize/Prizes.java similarity index 98% rename from src/main/java/model/Prizes.java rename to src/main/java/model/Prize/Prizes.java index 59122e07..8f91e1eb 100644 --- a/src/main/java/model/Prizes.java +++ b/src/main/java/model/Prize/Prizes.java @@ -1,4 +1,4 @@ -package model; +package model.Prize; import java.util.Collections; import java.util.List; diff --git a/src/main/java/model/HorizontalLine.java b/src/main/java/model/ladder/HorizontalLine.java similarity index 94% rename from src/main/java/model/HorizontalLine.java rename to src/main/java/model/ladder/HorizontalLine.java index 2c7ffd87..15fef8fc 100644 --- a/src/main/java/model/HorizontalLine.java +++ b/src/main/java/model/ladder/HorizontalLine.java @@ -1,4 +1,6 @@ -package model; +package model.ladder; + +import model.MovingDirection; import java.util.Collections; import java.util.EnumSet; diff --git a/src/main/java/model/Ladder.java b/src/main/java/model/ladder/Ladder.java similarity index 91% rename from src/main/java/model/Ladder.java rename to src/main/java/model/ladder/Ladder.java index 002b34b6..9826f6b2 100644 --- a/src/main/java/model/Ladder.java +++ b/src/main/java/model/ladder/Ladder.java @@ -1,4 +1,8 @@ -package model; +package model.ladder; + +import model.Prize.Prize; +import model.Prize.Prizes; +import model.user.User; import java.util.Collections; import java.util.List; diff --git a/src/main/java/model/LineGenerator.java b/src/main/java/model/ladder/LineGenerator.java similarity index 96% rename from src/main/java/model/LineGenerator.java rename to src/main/java/model/ladder/LineGenerator.java index 3bdcacda..bdc3a8ac 100644 --- a/src/main/java/model/LineGenerator.java +++ b/src/main/java/model/ladder/LineGenerator.java @@ -1,4 +1,4 @@ -package model; +package model.ladder; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/model/Link.java b/src/main/java/model/ladder/Link.java similarity index 92% rename from src/main/java/model/Link.java rename to src/main/java/model/ladder/Link.java index 2613743c..269f2e2e 100644 --- a/src/main/java/model/Link.java +++ b/src/main/java/model/ladder/Link.java @@ -1,4 +1,4 @@ -package model; +package model.ladder; public enum Link { LINKED, diff --git a/src/main/java/model/LinkGenerator.java b/src/main/java/model/ladder/LinkGenerator.java similarity index 72% rename from src/main/java/model/LinkGenerator.java rename to src/main/java/model/ladder/LinkGenerator.java index 87c2e838..5c3d4d4c 100644 --- a/src/main/java/model/LinkGenerator.java +++ b/src/main/java/model/ladder/LinkGenerator.java @@ -1,4 +1,4 @@ -package model; +package model.ladder; public interface LinkGenerator { Link generate(); diff --git a/src/main/java/model/RandomLinkGenerator.java b/src/main/java/model/ladder/RandomLinkGenerator.java similarity index 92% rename from src/main/java/model/RandomLinkGenerator.java rename to src/main/java/model/ladder/RandomLinkGenerator.java index db1d2b36..142dfdcd 100644 --- a/src/main/java/model/RandomLinkGenerator.java +++ b/src/main/java/model/ladder/RandomLinkGenerator.java @@ -1,4 +1,4 @@ -package model; +package model.ladder; import java.util.concurrent.ThreadLocalRandom; diff --git a/src/main/java/model/User.java b/src/main/java/model/user/User.java similarity index 98% rename from src/main/java/model/User.java rename to src/main/java/model/user/User.java index fb573870..068ba438 100644 --- a/src/main/java/model/User.java +++ b/src/main/java/model/user/User.java @@ -1,4 +1,4 @@ -package model; +package model.user; import static utils.Constants.FINAL_QUERY_KEYWORD; import static utils.Constants.MAX_USERNAME_LENGTH; diff --git a/src/main/java/model/Users.java b/src/main/java/model/user/Users.java similarity index 98% rename from src/main/java/model/Users.java rename to src/main/java/model/user/Users.java index 00251e19..fc5e7a40 100644 --- a/src/main/java/model/Users.java +++ b/src/main/java/model/user/Users.java @@ -1,4 +1,4 @@ -package model; +package model.user; import java.util.Collections; import java.util.HashSet; diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index c7c5d619..3d181a22 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -1,6 +1,13 @@ package view; import model.*; +import model.Prize.Prize; +import model.Prize.Prizes; +import model.ladder.HorizontalLine; +import model.ladder.Ladder; +import model.ladder.Link; +import model.user.User; +import model.user.Users; import java.util.List; import java.util.function.Function; diff --git a/src/test/java/model/HorizontalLineTest.java b/src/test/java/model/HorizontalLineTest.java index a400eb13..b12806eb 100644 --- a/src/test/java/model/HorizontalLineTest.java +++ b/src/test/java/model/HorizontalLineTest.java @@ -1,5 +1,7 @@ package model; +import model.ladder.HorizontalLine; +import model.ladder.Link; import org.junit.jupiter.api.Test; import java.util.List; diff --git a/src/test/java/model/LadderGameResultTest.java b/src/test/java/model/LadderGameResultTest.java index 151983f7..54a136de 100644 --- a/src/test/java/model/LadderGameResultTest.java +++ b/src/test/java/model/LadderGameResultTest.java @@ -1,5 +1,10 @@ package model; +import model.Prize.Prize; +import model.Prize.Prizes; +import model.ladder.Ladder; +import model.user.User; +import model.user.Users; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/src/test/java/model/LadderTest.java b/src/test/java/model/LadderTest.java index c4d136dd..0ee81eb1 100644 --- a/src/test/java/model/LadderTest.java +++ b/src/test/java/model/LadderTest.java @@ -1,5 +1,9 @@ package model; +import model.Prize.Prize; +import model.Prize.Prizes; +import model.ladder.Ladder; +import model.user.User; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/src/test/java/model/LineGeneratorTest.java b/src/test/java/model/LineGeneratorTest.java index a113f387..84d78d1e 100644 --- a/src/test/java/model/LineGeneratorTest.java +++ b/src/test/java/model/LineGeneratorTest.java @@ -1,8 +1,13 @@ package model; +import model.ladder.HorizontalLine; +import model.ladder.LineGenerator; +import model.ladder.Link; +import model.ladder.LinkGenerator; import org.junit.jupiter.api.Test; import java.util.List; +import java.util.stream.IntStream; import static org.assertj.core.api.Assertions.*; @@ -25,11 +30,11 @@ class LineGeneratorTest { HorizontalLine generatedLine = LineGenerator.generateHorizontalLine(width, linkedGenerator); List links = generatedLine.getPoints(); - for (int i = 0; i < links.size() - 1; i++) { - Link current = links.get(i); - Link next = links.get(i + 1); - assertThat(current.isLinked() && next.isLinked()).isFalse(); - } + boolean result = IntStream.range(0, links.size() - 1) + .anyMatch(i -> links.get(i).isLinked() && links.get(i + 1).isLinked()); + + + assertThat(result).isFalse(); } @Test diff --git a/src/test/java/model/LinkTest.java b/src/test/java/model/LinkTest.java index 81f537ae..b2217b5d 100644 --- a/src/test/java/model/LinkTest.java +++ b/src/test/java/model/LinkTest.java @@ -1,5 +1,6 @@ package model; +import model.ladder.Link; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.*; diff --git a/src/test/java/model/LinkedGenerator.java b/src/test/java/model/LinkedGenerator.java index 1115b6cc..6c0eb037 100644 --- a/src/test/java/model/LinkedGenerator.java +++ b/src/test/java/model/LinkedGenerator.java @@ -1,5 +1,8 @@ package model; +import model.ladder.Link; +import model.ladder.LinkGenerator; + public class LinkedGenerator implements LinkGenerator { @Override public Link generate() { diff --git a/src/test/java/model/MovingDirectionTest.java b/src/test/java/model/MovingDirectionTest.java index 4399577d..896ec02d 100644 --- a/src/test/java/model/MovingDirectionTest.java +++ b/src/test/java/model/MovingDirectionTest.java @@ -1,5 +1,7 @@ package model; +import model.ladder.HorizontalLine; +import model.ladder.LineGenerator; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.*; diff --git a/src/test/java/model/PrizesTest.java b/src/test/java/model/PrizesTest.java index 23305c33..d0b0fbc4 100644 --- a/src/test/java/model/PrizesTest.java +++ b/src/test/java/model/PrizesTest.java @@ -1,6 +1,6 @@ package model; -import org.assertj.core.api.Assertions; +import model.Prize.Prizes; import org.junit.jupiter.api.Test; import java.util.List; diff --git a/src/test/java/model/UnLinkedGenerator.java b/src/test/java/model/UnLinkedGenerator.java index 1f9cfd3e..1c89b793 100644 --- a/src/test/java/model/UnLinkedGenerator.java +++ b/src/test/java/model/UnLinkedGenerator.java @@ -1,6 +1,9 @@ package model; -public class UnLinkedGenerator implements LinkGenerator{ +import model.ladder.Link; +import model.ladder.LinkGenerator; + +public class UnLinkedGenerator implements LinkGenerator { @Override public Link generate() { return Link.from(false); diff --git a/src/test/java/model/UserTest.java b/src/test/java/model/UserTest.java index ba50aabe..117424bf 100644 --- a/src/test/java/model/UserTest.java +++ b/src/test/java/model/UserTest.java @@ -1,5 +1,6 @@ package model; +import model.user.User; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.*; diff --git a/src/test/java/model/UsersTest.java b/src/test/java/model/UsersTest.java index cced06a4..e51eac01 100644 --- a/src/test/java/model/UsersTest.java +++ b/src/test/java/model/UsersTest.java @@ -1,5 +1,6 @@ package model; +import model.user.Users; import org.junit.jupiter.api.Test; import java.util.List; From 2a8ede35b614344043c3293f4c4b61c502578e46 Mon Sep 17 00:00:00 2001 From: chxghee Date: Wed, 7 May 2025 12:41:24 +0900 Subject: [PATCH 14/14] =?UTF-8?q?Refactor:=20=EC=88=A8=EC=9D=80=20?= =?UTF-8?q?=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=A0=9C=EA=B1=B0=20View=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EC=9D=98=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20static=20->=20Non=20static=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=ED=95=98=EC=97=AC=20=EC=BB=A8=ED=8A=B8?= =?UTF-8?q?=EB=A1=A4=EB=9F=AC=EC=97=90=EC=84=9C=20=ED=95=84=EB=93=9C?= =?UTF-8?q?=EB=A1=9C=20=EC=84=A0=EC=96=B8=ED=95=98=EC=97=AC=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=ED=95=98=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/controller/LadderGameController.java | 45 ++++++++++--------- src/main/java/view/InputValidator.java | 2 +- src/main/java/view/InputView.java | 4 +- src/main/java/view/OutputView.java | 16 +++---- 4 files changed, 35 insertions(+), 32 deletions(-) diff --git a/src/main/java/controller/LadderGameController.java b/src/main/java/controller/LadderGameController.java index 9e50cba2..cef2758d 100644 --- a/src/main/java/controller/LadderGameController.java +++ b/src/main/java/controller/LadderGameController.java @@ -19,7 +19,10 @@ public class LadderGameController { private final LinkGenerator linkGenerator; - + private final InputValidator inputValidator = new InputValidator(); + private final InputView inputView = new InputView(); + private final OutputView outputView = new OutputView(); + public LadderGameController(LinkGenerator linkGenerator) { this.linkGenerator = linkGenerator; } @@ -30,67 +33,67 @@ public void run() { int height = getHeight(); Ladder ladder = Ladder.of(height, users.size(), linkGenerator); - OutputView.printLadder(ladder, users, prizes); + outputView.printLadder(ladder, users, prizes); LadderGameResult ladderGameResult = LadderGameResult.of(users, prizes, ladder); handleUserResultQuery(ladderGameResult, users); } - private static void handleUserResultQuery(LadderGameResult ladderGameResult, Users users) { + private void handleUserResultQuery(LadderGameResult ladderGameResult, Users users) { Optional findUser = getFindUsername(users); if (findUser.isEmpty()) { - OutputView.printAllResults(ladderGameResult); + outputView.printAllResults(ladderGameResult); return; } - OutputView.printPrize(ladderGameResult.findByUser(findUser.get())); + outputView.printPrize(ladderGameResult.findByUser(findUser.get())); handleUserResultQuery(ladderGameResult, users); } - private static Optional getFindUsername(Users users) { - OutputView.printQueryInputMessage(); - String findUsername = InputView.getString(); + private Optional getFindUsername(Users users) { + outputView.printQueryInputMessage(); + String findUsername = inputView.getString(); if (findUsername.equals(FINAL_QUERY_KEYWORD)) { return Optional.empty(); } try { return Optional.of(users.findByUsername(findUsername)); } catch (Exception e) { - OutputView.printErrorMessage(e.getMessage()); + outputView.printErrorMessage(e.getMessage()); return getFindUsername(users); } } - private static Users getUsers() { - OutputView.printUsernameInputMessage(); + private Users getUsers() { + outputView.printUsernameInputMessage(); try { return Users.from(readAndSplitInput()); } catch (Exception e) { - OutputView.printErrorMessage(e.getMessage()); + outputView.printErrorMessage(e.getMessage()); return getUsers(); } } - private static Prizes getPrizes(int participantCount) { - OutputView.printPrizeInputMessage(); + private Prizes getPrizes(int participantCount) { + outputView.printPrizeInputMessage(); try { return Prizes.of(readAndSplitInput(), participantCount); } catch (Exception e) { - OutputView.printErrorMessage(e.getMessage()); + outputView.printErrorMessage(e.getMessage()); return getPrizes(participantCount); } } - private static List readAndSplitInput() { - String inputString = InputView.getString(); - InputValidator.validateInputStringPattern(inputString); + private List readAndSplitInput() { + String inputString = inputView.getString(); + inputValidator.validateInputStringPattern(inputString); return StringSplitter.splitByComma(inputString); } - private static int getHeight() { - OutputView.printHeightInputMessage(); - return InputView.getInt(); + private int getHeight() { + outputView.printHeightInputMessage(); + return inputView.getInt(); } } diff --git a/src/main/java/view/InputValidator.java b/src/main/java/view/InputValidator.java index dc9f68c2..a9b2c4be 100644 --- a/src/main/java/view/InputValidator.java +++ b/src/main/java/view/InputValidator.java @@ -4,7 +4,7 @@ public class InputValidator { private static final String USERNAME_NAMES_PATTERN = "^([a-zA-Z가-힣0-9]+)(,[a-zA-Z가-힣0-9]+)*$"; - public static void validateInputStringPattern(String input) { + public void validateInputStringPattern(String input) { if (!input.matches(USERNAME_NAMES_PATTERN)) { throw new IllegalArgumentException("입력은 쉼표로 구분 되어야 합니다!"); } diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index f57e629d..51ea21b1 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -6,13 +6,13 @@ public class InputView { private static final Scanner scanner = new Scanner(System.in); - public static int getInt() { + public int getInt() { int inputInt = scanner.nextInt(); System.out.println(); return inputInt; } - public static String getString() { + public String getString() { String inputString = scanner.next(); System.out.println(); return inputString; diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 3d181a22..22ee7ff1 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -14,34 +14,34 @@ public class OutputView { - public static void printUsernameInputMessage() { + public void printUsernameInputMessage() { System.out.println("참여할 사람 이름을 입력하세요. (이름은 쉼표(,)로 구분하세요)"); } - public static void printHeightInputMessage() { + public void printHeightInputMessage() { System.out.println("최대 사다리 높이는 몇 개인가요?"); } - public static void printPrizeInputMessage() { + public void printPrizeInputMessage() { System.out.println("실행 결과를 입력하세요. (결과는 쉼표(,)로 구분하세요)"); } - public static void printQueryInputMessage() { + public void printQueryInputMessage() { System.out.println("결과를 보고 싶은 사람은?"); } - public static void printPrize(Prize prize) { + public void printPrize(Prize prize) { System.out.println("실행결과"); System.out.println(prize.getPrizeName()); System.out.println(); } - public static void printErrorMessage(String errorMessage) { + public void printErrorMessage(String errorMessage) { System.out.println(errorMessage); System.out.println(); } - public static void printLadder(Ladder ladder, Users users, Prizes prizes) { + public void printLadder(Ladder ladder, Users users, Prizes prizes) { System.out.println("사다리 결과"); printAligned(users.getUsers(), User::getName); ladder.getLines().forEach(OutputView::printHorizontalLine); @@ -49,7 +49,7 @@ public static void printLadder(Ladder ladder, Users users, Prizes prizes) { System.out.println(); } - public static void printAllResults(LadderGameResult ladderGameResult) { + public void printAllResults(LadderGameResult ladderGameResult) { System.out.println("실행결과"); ladderGameResult.getGameResults().forEach((user, prize) -> System.out.println(user.getName() + " : " + prize.getPrizeName())