From 78048a5b17e2214b7b95679fcd605301bbdd8f7d Mon Sep 17 00:00:00 2001 From: DK Date: Mon, 9 Oct 2023 01:35:57 +0900 Subject: [PATCH 1/8] for PullRequest --- src/main/java/calculator/Dot.java | 49 ++++++++++++++++++++++++++++++ src/main/java/calculator/Line.java | 35 +++++++++++++++++++++ src/test/java/DotTest.java | 45 +++++++++++++++++++++++++++ src/test/java/LineTest.java | 40 ++++++++++++++++++++++++ 4 files changed, 169 insertions(+) create mode 100644 src/main/java/calculator/Dot.java create mode 100644 src/main/java/calculator/Line.java create mode 100644 src/test/java/DotTest.java create mode 100644 src/test/java/LineTest.java diff --git a/src/main/java/calculator/Dot.java b/src/main/java/calculator/Dot.java new file mode 100644 index 00000000..d5de48fe --- /dev/null +++ b/src/main/java/calculator/Dot.java @@ -0,0 +1,49 @@ +package calculator; + +import java.util.Objects; + +public class Dot { + private final int x; + private final int y; + private static final String INVALID_INPUT_FORMAT = "Invalid input format"; + private static final String REGEX_FOR_STRING_INPUT = "[()]"; + private static final int MAX_LOCATION_FOR_DOT = 24; + public Dot(int x, int y) { + validateLocations(x, y); + this.x = x; + this.y = y; + } + + public Dot(String input) { + String[] parts = input.replaceAll(REGEX_FOR_STRING_INPUT, "").split(","); + if (parts.length != 2) { + throw new IllegalArgumentException(INVALID_INPUT_FORMAT); + } + int x = Integer.parseInt(parts[0].trim()); + int y = Integer.parseInt(parts[1].trim()); + validateLocations(x, y); + this.x = x; + this.y = y; + } + + private void validateLocations(int x, int y) { + if (x > MAX_LOCATION_FOR_DOT || y > MAX_LOCATION_FOR_DOT) throw new IllegalArgumentException(); + } + + public double getDistanceBetween(Dot secondDot) { + return Math.sqrt(Math.pow((secondDot.x - this.x), 2) + Math.pow((secondDot.y - this.y), 2)); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Dot dot = (Dot) o; + return x == dot.x && y == dot.y; + } + + @Override + public int hashCode() { + return Objects.hash(x, y); + } +} diff --git a/src/main/java/calculator/Line.java b/src/main/java/calculator/Line.java new file mode 100644 index 00000000..b5cb2267 --- /dev/null +++ b/src/main/java/calculator/Line.java @@ -0,0 +1,35 @@ +package calculator; + +public class Line { + private final Dot firstDot; + private final Dot secondDot; + private static final String SPLIT_EXPRESSION = "-"; + public Line(String input) { + validateInput(input); + String[] split = input.split(SPLIT_EXPRESSION); + try{ + this.firstDot = new Dot(split[0]); + this.secondDot = new Dot(split[1]); + } catch (Exception e){ + throw new IllegalArgumentException(); + } + } + + private void validateInput(String input) { + if (!input.contains(SPLIT_EXPRESSION)){ + throw new IllegalArgumentException(); + } + } + + public Dot getFirstDot() { + return firstDot; + } + + public Dot getSecondDot() { + return secondDot; + } + + public double getDotsDistance(){ + return this.firstDot.getDistanceBetween(secondDot); + } +} diff --git a/src/test/java/DotTest.java b/src/test/java/DotTest.java new file mode 100644 index 00000000..c1c2f2e2 --- /dev/null +++ b/src/test/java/DotTest.java @@ -0,0 +1,45 @@ +import calculator.Dot; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.*; + +class DotTest { + //- 사용자가 점에 대한 좌표 정보를 입력하는 메뉴를 구성한다. + //- 좌표 정보는 괄호"(", ")"로 둘러쌓여 있으며 쉼표(,)로 x값과 y값을 구분한다. + //- X, Y좌표 모두 최대 24까지만 입력할 수 있다. + + //- 정상적인 좌표값을 입력한 경우, 해당 좌표에 특수문자를 표시한다. + //- 좌표값을 두 개 입력한 경우, 두 점을 있는 직선으로 가정한다. 좌표값과 좌표값 사이는 '-' 문자로 구분한다. + //- 직선인 경우는 두 점 사이 거리를 계산해서 출력한다. + + @Test + void dotInit_test() { + Dot dot = new Dot(1, 1); + assertThat(dot).isEqualTo(new Dot(1, 1)); + } + + @Test + void dot_validation_test() { //- 입력 범위를 초과할 경우 에러 문구를 출력하고 다시 입력을 받는다. 중요! + assertThatThrownBy(() -> new Dot(25, 25)).isInstanceOf(IllegalArgumentException.class); + } + + @Test + void string_input_test() { + String input = "(1,1)"; + Dot dot = new Dot(input); + assertThat(dot).isEqualTo(new Dot(1,1)); + } + + @Test + void validate_input_test() { + String input = "(25,25)"; + assertThatThrownBy(() -> new Dot(input)).isInstanceOf(IllegalArgumentException.class); + } + + @Test + void get_dot_distance() { + Dot dot = new Dot(10,10); + Dot secondDot = new Dot(14,15); + assertThat(dot.getDistanceBetween(secondDot)).isEqualTo(6.4, offset(0.1)); + } +} diff --git a/src/test/java/LineTest.java b/src/test/java/LineTest.java new file mode 100644 index 00000000..281ade21 --- /dev/null +++ b/src/test/java/LineTest.java @@ -0,0 +1,40 @@ +import calculator.Dot; +import calculator.Line; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.*; + +class LineTest { + //- 사용자가 점에 대한 좌표 정보를 입력하는 메뉴를 구성한다. + //- 좌표 정보는 괄호"(", ")"로 둘러쌓여 있으며 쉼표(,)로 x값과 y값을 구분한다. + //- X, Y좌표 모두 최대 24까지만 입력할 수 있다. + + //- 정상적인 좌표값을 입력한 경우, 해당 좌표에 특수문자를 표시한다. + //- 좌표값을 두 개 입력한 경우, 두 점을 있는 직선으로 가정한다. 좌표값과 좌표값 사이는 '-' 문자로 구분한다. + //- 직선인 경우는 두 점 사이 거리를 계산해서 출력한다. + @Test + void lineInput_test() { + String input = "(1,1)-(5,5)"; + Line line = new Line(input); + + assertThat(line.getFirstDot()).isEqualTo(new Dot(1, 1)); + assertThat(line.getSecondDot()).isEqualTo(new Dot(5, 5)); + } + + @Test + void invalid_lineInput_test() { + String input = "(1,1)1(5,5)"; + String input2 = "(1,1)"; + String input3 = "(25,25)-(25,25)"; + assertThatThrownBy(() -> new Line(input)).isInstanceOf(IllegalArgumentException.class); + assertThatThrownBy(() -> new Line(input2)).isInstanceOf(IllegalArgumentException.class); + assertThatThrownBy(() -> new Line(input3)).isInstanceOf(IllegalArgumentException.class); + } + + @Test + void lineDistance_test() { + String input = "(1,1)-(5,5)"; + Line line = new Line(input); + assertThat(line.getDotsDistance()).isEqualTo(5.65, offset(0.01)); + } +} From fa301aa9a5bfeaf2692b915fd16edfea624270ab Mon Sep 17 00:00:00 2001 From: DK Date: Mon, 9 Oct 2023 13:33:38 +0900 Subject: [PATCH 2/8] =?UTF-8?q?feat=20:=20=EB=91=90=EB=B2=88=EC=A7=B8=20?= =?UTF-8?q?=EA=B3=BC=EC=A0=9C=20-=20Square=20=EC=99=84=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/calculator/Dot.java | 7 +++ src/main/java/calculator/Dots.java | 93 ++++++++++++++++++++++++++++ src/main/java/calculator/Line.java | 34 +++------- src/main/java/calculator/Square.java | 16 +++++ src/main/java/view/InputView.java | 4 ++ src/test/java/DotTest.java | 14 +++++ src/test/java/DotsTest.java | 46 ++++++++++++++ src/test/java/LineTest.java | 31 +++++----- src/test/java/SquareTest.java | 19 ++++++ 9 files changed, 224 insertions(+), 40 deletions(-) create mode 100644 src/main/java/calculator/Dots.java create mode 100644 src/main/java/calculator/Square.java create mode 100644 src/main/java/view/InputView.java create mode 100644 src/test/java/DotsTest.java create mode 100644 src/test/java/SquareTest.java diff --git a/src/main/java/calculator/Dot.java b/src/main/java/calculator/Dot.java index d5de48fe..db7505f7 100644 --- a/src/main/java/calculator/Dot.java +++ b/src/main/java/calculator/Dot.java @@ -33,6 +33,13 @@ private void validateLocations(int x, int y) { public double getDistanceBetween(Dot secondDot) { return Math.sqrt(Math.pow((secondDot.x - this.x), 2) + Math.pow((secondDot.y - this.y), 2)); } + public boolean isXParallel(Dot dot) { + return this.y == dot.y; + } + + public boolean isYParallel(Dot dot) { + return this.x == dot.x; + } @Override public boolean equals(Object o) { diff --git a/src/main/java/calculator/Dots.java b/src/main/java/calculator/Dots.java new file mode 100644 index 00000000..c5342690 --- /dev/null +++ b/src/main/java/calculator/Dots.java @@ -0,0 +1,93 @@ +package calculator; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class Dots { + private final List dots; + + /** + * CONSTANTS + */ + private static final String SPLIT_EXPRESSION = "-"; + private static final String IS_NOT_LINE = "선이 아니다."; + private static final String IS_NOT_SQUARE = "사각형이 아니다."; + public Dots(String input) { + validateInput(input); + this.dots = Arrays.stream(input.split("-")).map(Dot::new).collect(Collectors.toList()); + } + + /** + * validations & common methods + */ + private void validateInput(String input) { + if (!input.contains(SPLIT_EXPRESSION)){ + throw new IllegalArgumentException(); + } + } + + public int size() { + return this.dots.size(); + } + + /** + * line methods + */ + public boolean isLine() { + return this.dots.size() == 2; + } + + public boolean isXParallelLine(){ + if (!isLine()) { + throw new IllegalArgumentException(IS_NOT_LINE); + } + return dots.get(0).isXParallel(dots.get(1)); + } + + public boolean isYParallelLine(){ + if (!isLine()) { + throw new IllegalArgumentException(IS_NOT_LINE); + } + return dots.get(0).isYParallel(dots.get(1)); + } + + public double getDistanceBetween(){ + if (!this.isLine()) { + throw new IllegalArgumentException(IS_NOT_LINE); + } + return this.dots.get(0).getDistanceBetween(dots.get(1)); + } + + /** + * square methods + */ + public boolean isSquare() { + if (this.dots.size() != 4) { + return false; + } + return isAllParallel(); + } + + public boolean isAllParallel() { + return IntStream.range(0, 4).allMatch(i -> { + Dot dot1 = dots.get(i); + Dot dot2 = dots.get((i + 1) % 4); // 다음 점 + return dot1.isXParallel(dot2) || dot1.isYParallel(dot2); + }); + } + + public int getSquareArea(){ + if (!isSquare()) { + throw new IllegalArgumentException(IS_NOT_SQUARE); + } + + List collect = IntStream.range(0, 4) + .mapToObj(i -> dots.get(i).getDistanceBetween(dots.get((i + 1) % 4))) + .distinct().collect(Collectors.toList()); + + if (collect.size() == 1) return (int) Math.pow(collect.get(0), 2); + return (int) (collect.get(0) * collect.get(1)); + } +} \ No newline at end of file diff --git a/src/main/java/calculator/Line.java b/src/main/java/calculator/Line.java index b5cb2267..44d8e359 100644 --- a/src/main/java/calculator/Line.java +++ b/src/main/java/calculator/Line.java @@ -1,35 +1,21 @@ package calculator; public class Line { - private final Dot firstDot; - private final Dot secondDot; - private static final String SPLIT_EXPRESSION = "-"; - public Line(String input) { - validateInput(input); - String[] split = input.split(SPLIT_EXPRESSION); - try{ - this.firstDot = new Dot(split[0]); - this.secondDot = new Dot(split[1]); - } catch (Exception e){ - throw new IllegalArgumentException(); - } - } + private final Dots dots; - private void validateInput(String input) { - if (!input.contains(SPLIT_EXPRESSION)){ - throw new IllegalArgumentException(); - } + public Line(Dots dots) { + this.dots = dots; } - public Dot getFirstDot() { - return firstDot; + public double getDotsDistance(){ + return this.dots.getDistanceBetween(); } - public Dot getSecondDot() { - return secondDot; + public boolean isXParallel() { + return this.dots.isXParallelLine(); } - public double getDotsDistance(){ - return this.firstDot.getDistanceBetween(secondDot); + public boolean isYParallel(){ + return this.dots.isYParallelLine(); } -} +} \ No newline at end of file diff --git a/src/main/java/calculator/Square.java b/src/main/java/calculator/Square.java new file mode 100644 index 00000000..6b9ba93d --- /dev/null +++ b/src/main/java/calculator/Square.java @@ -0,0 +1,16 @@ +package calculator; + +public class Square { + private final Dots dots; + + public Square(Dots dots) { + if (!dots.isSquare()){ + throw new IllegalArgumentException(); + } + this.dots = dots; + } + + public int getArea() { + return this.dots.getSquareArea(); + } +} 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 { +} diff --git a/src/test/java/DotTest.java b/src/test/java/DotTest.java index c1c2f2e2..c88c3e9f 100644 --- a/src/test/java/DotTest.java +++ b/src/test/java/DotTest.java @@ -42,4 +42,18 @@ void get_dot_distance() { Dot secondDot = new Dot(14,15); assertThat(dot.getDistanceBetween(secondDot)).isEqualTo(6.4, offset(0.1)); } + + @Test + void is_x_parallel() { + Dot dot = new Dot(10, 10); + Dot dot2 = new Dot(15, 10); + assertThat(dot.isXParallel(dot2)).isTrue(); + } + + @Test + void is_y_parallel() { + Dot dot = new Dot(10, 10); + Dot dot2 = new Dot(10, 15); + assertThat(dot.isYParallel(dot2)).isTrue(); + } } diff --git a/src/test/java/DotsTest.java b/src/test/java/DotsTest.java new file mode 100644 index 00000000..dc67596c --- /dev/null +++ b/src/test/java/DotsTest.java @@ -0,0 +1,46 @@ +import calculator.Dots; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class DotsTest { + @Test + void dots_init_test() { + String input = "(10,10)-(22,10)-(22,18)-(10,18)"; + Dots dots = new Dots(input); + assertThat(dots.size()).isEqualTo(4); + } + + @Test + void is_line() { + String input = "(10,10)-(22,10)"; + Dots dots = new Dots(input); + assertThat(dots.isLine()).isTrue(); + } + + @Test + void invalid_lineInput_test() { + String input = "(1,1)1(5,5)"; + String input2 = "(1,1)"; + String input3 = "(25,25)-(25,25)"; + + assertThatThrownBy(() -> new Dots(input)).isInstanceOf(IllegalArgumentException.class); + assertThatThrownBy(() -> new Dots(input2)).isInstanceOf(IllegalArgumentException.class); + assertThatThrownBy(() -> new Dots(input3)).isInstanceOf(IllegalArgumentException.class); + } + + @Test + void is_square() { + String input = "(10,10)-(22,10)-(22,18)-(10,18)"; + Dots dots = new Dots(input); + assertThat(dots.isSquare()).isTrue(); + } + + @Test + void is_not_square() { + String input = "(10,11)-(22,10)-(22,18)-(10,18)"; + Dots dots = new Dots(input); + assertThat(dots.isSquare()).isFalse(); + } +} diff --git a/src/test/java/LineTest.java b/src/test/java/LineTest.java index 281ade21..887ea81e 100644 --- a/src/test/java/LineTest.java +++ b/src/test/java/LineTest.java @@ -1,4 +1,5 @@ import calculator.Dot; +import calculator.Dots; import calculator.Line; import org.junit.jupiter.api.Test; @@ -12,29 +13,27 @@ class LineTest { //- 정상적인 좌표값을 입력한 경우, 해당 좌표에 특수문자를 표시한다. //- 좌표값을 두 개 입력한 경우, 두 점을 있는 직선으로 가정한다. 좌표값과 좌표값 사이는 '-' 문자로 구분한다. //- 직선인 경우는 두 점 사이 거리를 계산해서 출력한다. + + // getter 매소드를 두는 것이 좋지 않다고 판단됨. lineGetFirstDot() 과 같은 형태는 쓰지 않기로 - + @Test - void lineInput_test() { + void lineDistance_test() { String input = "(1,1)-(5,5)"; - Line line = new Line(input); - - assertThat(line.getFirstDot()).isEqualTo(new Dot(1, 1)); - assertThat(line.getSecondDot()).isEqualTo(new Dot(5, 5)); + Line line = new Line(new Dots(input)); + assertThat(line.getDotsDistance()).isEqualTo(5.65, offset(0.01)); } @Test - void invalid_lineInput_test() { - String input = "(1,1)1(5,5)"; - String input2 = "(1,1)"; - String input3 = "(25,25)-(25,25)"; - assertThatThrownBy(() -> new Line(input)).isInstanceOf(IllegalArgumentException.class); - assertThatThrownBy(() -> new Line(input2)).isInstanceOf(IllegalArgumentException.class); - assertThatThrownBy(() -> new Line(input3)).isInstanceOf(IllegalArgumentException.class); + void is_line_x_parallel() { + String input = "(1,1)-(5,1)"; // y 값이 같다. + Line line = new Line(new Dots(input)); + assertThat(line.isXParallel()).isTrue(); } @Test - void lineDistance_test() { - String input = "(1,1)-(5,5)"; - Line line = new Line(input); - assertThat(line.getDotsDistance()).isEqualTo(5.65, offset(0.01)); + void is_line_y_parallel() { + String input = "(1,1)-(1,5)"; // x 값이 같다. + Line line = new Line(new Dots(input)); + assertThat(line.isYParallel()).isTrue(); } } diff --git a/src/test/java/SquareTest.java b/src/test/java/SquareTest.java new file mode 100644 index 00000000..c021497a --- /dev/null +++ b/src/test/java/SquareTest.java @@ -0,0 +1,19 @@ +import calculator.Dots; +import calculator.Square; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class SquareTest { + //- 좌표값을 두 개 입력한 경우, 두 점을 있는 직선으로 가정한다. 좌표값과 좌표값 사이는 '-' 문자로 구분한다. + //- 좌표값을 네 개 입력한 경우, 네 점을 연결하는 사각형으로 가정한다. + // - 네 점이 뒤틀어진 사다리꼴이나 마름모는 제외하고 직사각형만 허용하도록 검사한다. + // - 사각형인 경우 사각형의 넓이를 계산해서 출력한다 + @Test + void square_area_test() { + String input = "(10,10)-(22,10)-(22,18)-(10,18)"; + Dots dots = new Dots(input); + Square square = new Square(dots); + assertThat(square.getArea()).isEqualTo(12 * 8); + } +} From 659d0d3ef7b3590ce17efe39803e526a907a2dca Mon Sep 17 00:00:00 2001 From: DK Date: Wed, 11 Oct 2023 13:20:19 +0900 Subject: [PATCH 3/8] =?UTF-8?q?=EB=AA=A8=EB=93=A0=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=99=84=EC=84=B1.=20=EB=AC=B4=EC=A1=B0=EA=B1=B4=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81=20=ED=95=B4=EC=95=BC=20=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EB=B2=84=EC=A0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/calculator/Dots.java | 48 ++++++++++++++++++++++++++ src/main/java/calculator/Line.java | 4 +++ src/main/java/calculator/Triangle.java | 5 +++ src/test/java/DotsTest.java | 21 +++++++++++ src/test/java/TriangleTest.java | 28 +++++++++++++++ 5 files changed, 106 insertions(+) create mode 100644 src/main/java/calculator/Triangle.java create mode 100644 src/test/java/TriangleTest.java diff --git a/src/main/java/calculator/Dots.java b/src/main/java/calculator/Dots.java index c5342690..971bdd85 100644 --- a/src/main/java/calculator/Dots.java +++ b/src/main/java/calculator/Dots.java @@ -1,5 +1,6 @@ package calculator; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @@ -19,6 +20,17 @@ public Dots(String input) { this.dots = Arrays.stream(input.split("-")).map(Dot::new).collect(Collectors.toList()); } + private Dots(Dot first, Dot second){ +// this.dots = List.of(first, second); + this.dots = new ArrayList<>(); + dots.add(first); + dots.add(second); + } + + public static Dots asLine(Dot first, Dot second){ + return new Dots(first, second); + } + /** * validations & common methods */ @@ -90,4 +102,40 @@ public int getSquareArea(){ if (collect.size() == 1) return (int) Math.pow(collect.get(0), 2); return (int) (collect.get(0) * collect.get(1)); } + + /** + * triangle + */ + public boolean isTriangle() { + return this.dots.size() == 3; + } + + public double getLinesLength(){ + double lineLength = 0; + for (int i = 0; i < this.dots.size(); i++) { + Dot first = dots.get(i); + Dot second = dots.get((i + 1) % dots.size()); + Line line = new Line(first, second); + lineLength += line.getDotsDistance(); + } + return lineLength; + } + + //헤론의 공식 + //s = (a + b + c) / 2 + //Area = √(s * (s - a) * (s - b) * (s - c)) + public double getTriangleArea(){ + List lineLengths = new ArrayList<>(); + for (int i = 0; i < this.dots.size(); i++) { + Dot first = dots.get(i); + Dot second = dots.get((i + 1) % dots.size()); + Line line = new Line(first, second); + lineLengths.add(line.getDotsDistance()); + } + double area = getLinesLength() / 2; + for (Double lineLength : lineLengths) { + area *= (getLinesLength() / 2) - lineLength; + } + return Math.sqrt(area); + } } \ No newline at end of file diff --git a/src/main/java/calculator/Line.java b/src/main/java/calculator/Line.java index 44d8e359..af0fc7d2 100644 --- a/src/main/java/calculator/Line.java +++ b/src/main/java/calculator/Line.java @@ -7,6 +7,10 @@ public Line(Dots dots) { this.dots = dots; } + public Line(Dot first, Dot second){ + this.dots = Dots.asLine(first, second); + } + public double getDotsDistance(){ return this.dots.getDistanceBetween(); } diff --git a/src/main/java/calculator/Triangle.java b/src/main/java/calculator/Triangle.java new file mode 100644 index 00000000..f202db9e --- /dev/null +++ b/src/main/java/calculator/Triangle.java @@ -0,0 +1,5 @@ +package calculator; + +public class Triangle { + +} diff --git a/src/test/java/DotsTest.java b/src/test/java/DotsTest.java index dc67596c..048ceace 100644 --- a/src/test/java/DotsTest.java +++ b/src/test/java/DotsTest.java @@ -43,4 +43,25 @@ void is_not_square() { Dots dots = new Dots(input); assertThat(dots.isSquare()).isFalse(); } + + @Test + void is_triangle() { + String input = "(10,11)-(22,10)-(22,18)"; + Dots dots = new Dots(input); + assertThat(dots.isTriangle()).isTrue(); + } + + @Test + void is_not_triangle() { + String input = "(10,11)-(22,10)"; + Dots dots = new Dots(input); + assertThat(dots.isTriangle()).isFalse(); + } + + @Test + void triangle_area() { + String input = "(10,11)-(22,10)-(22,18)"; + Dots dots = new Dots(input); + + } } diff --git a/src/test/java/TriangleTest.java b/src/test/java/TriangleTest.java new file mode 100644 index 00000000..f4503d37 --- /dev/null +++ b/src/test/java/TriangleTest.java @@ -0,0 +1,28 @@ +import calculator.Dots; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.assertj.core.api.AssertionsForClassTypes.offset; + +class TriangleTest { + @Test + void is_triangle() { + String input = "(10,11)-(22,10)-(22,18)"; + Dots dots = new Dots(input); + assertThat(dots.isTriangle()).isTrue(); + } + + @Test + void get_triangle_distances() { + String input = "(10,11)-(22,10)-(22,18)"; + Dots dots = new Dots(input); + assertThat(dots.getLinesLength()).isEqualTo(33.93, offset(0.01)); + } + + @Test + void get_triangle_area() { + String input = "(10,11)-(22,10)-(22,18)"; + Dots dots = new Dots(input); + assertThat(dots.getTriangleArea()).isEqualTo(48, offset(0.1)); + } +} From 88e8febd4258d1bcfa0b38c012df593028c0e284 Mon Sep 17 00:00:00 2001 From: DK Date: Mon, 16 Oct 2023 20:55:58 +0900 Subject: [PATCH 4/8] =?UTF-8?q?Refactor=20:=20=EB=91=90=EB=B2=88=EC=A7=B8?= =?UTF-8?q?=20=EB=B2=84=EC=A0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/calculator/DotV1.java | 56 ++++++++++++++++++ src/main/java/calculator/Dots.java | 58 +++++++++---------- .../calculator/{Line.java => LineV1.java} | 6 +- .../calculator/{Square.java => SquareV1.java} | 4 +- src/main/java/calculator/Triangle.java | 5 -- src/main/java/calculator/TriangleV1.java | 5 ++ src/main/java/figure/AbstractFigure.java | 21 +++++++ src/main/java/{calculator => figure}/Dot.java | 2 +- src/main/java/figure/Figure.java | 10 ++++ src/main/java/figure/FigureEnum.java | 22 +++++++ src/main/java/figure/FigureFactory.java | 21 +++++++ src/main/java/figure/Line.java | 31 ++++++++++ src/main/java/figure/Square.java | 40 +++++++++++++ src/main/java/figure/Triangle.java | 46 +++++++++++++++ .../java/{DotTest.java => DotV1Test.java} | 34 +++++------ .../java/{LineTest.java => LineV1Test.java} | 17 +++--- .../{SquareTest.java => SquareV1Test.java} | 8 +-- ...{TriangleTest.java => TriangleV1Test.java} | 2 +- 18 files changed, 317 insertions(+), 71 deletions(-) create mode 100644 src/main/java/calculator/DotV1.java rename src/main/java/calculator/{Line.java => LineV1.java} (80%) rename src/main/java/calculator/{Square.java => SquareV1.java} (81%) delete mode 100644 src/main/java/calculator/Triangle.java create mode 100644 src/main/java/calculator/TriangleV1.java create mode 100644 src/main/java/figure/AbstractFigure.java rename src/main/java/{calculator => figure}/Dot.java (98%) create mode 100644 src/main/java/figure/Figure.java create mode 100644 src/main/java/figure/FigureEnum.java create mode 100644 src/main/java/figure/FigureFactory.java create mode 100644 src/main/java/figure/Line.java create mode 100644 src/main/java/figure/Square.java create mode 100644 src/main/java/figure/Triangle.java rename src/test/java/{DotTest.java => DotV1Test.java} (57%) rename src/test/java/{LineTest.java => LineV1Test.java} (74%) rename src/test/java/{SquareTest.java => SquareV1Test.java} (82%) rename src/test/java/{TriangleTest.java => TriangleV1Test.java} (97%) diff --git a/src/main/java/calculator/DotV1.java b/src/main/java/calculator/DotV1.java new file mode 100644 index 00000000..fcea73c8 --- /dev/null +++ b/src/main/java/calculator/DotV1.java @@ -0,0 +1,56 @@ +package calculator; + +import java.util.Objects; + +public class DotV1 { + private final int x; + private final int y; + private static final String INVALID_INPUT_FORMAT = "Invalid input format"; + private static final String REGEX_FOR_STRING_INPUT = "[()]"; + private static final int MAX_LOCATION_FOR_DOT = 24; + public DotV1(int x, int y) { + validateLocations(x, y); + this.x = x; + this.y = y; + } + + public DotV1(String input) { + String[] parts = input.replaceAll(REGEX_FOR_STRING_INPUT, "").split(","); + if (parts.length != 2) { + throw new IllegalArgumentException(INVALID_INPUT_FORMAT); + } + int x = Integer.parseInt(parts[0].trim()); + int y = Integer.parseInt(parts[1].trim()); + validateLocations(x, y); + this.x = x; + this.y = y; + } + + private void validateLocations(int x, int y) { + if (x > MAX_LOCATION_FOR_DOT || y > MAX_LOCATION_FOR_DOT) throw new IllegalArgumentException(); + } + + public double getDistanceBetween(DotV1 secondDotV1) { + return Math.sqrt(Math.pow((secondDotV1.x - this.x), 2) + Math.pow((secondDotV1.y - this.y), 2)); + } + public boolean isXParallel(DotV1 dotV1) { + return this.y == dotV1.y; + } + + public boolean isYParallel(DotV1 dotV1) { + return this.x == dotV1.x; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + DotV1 dotV1 = (DotV1) o; + return x == dotV1.x && y == dotV1.y; + } + + @Override + public int hashCode() { + return Objects.hash(x, y); + } +} diff --git a/src/main/java/calculator/Dots.java b/src/main/java/calculator/Dots.java index 971bdd85..ce1bf2d7 100644 --- a/src/main/java/calculator/Dots.java +++ b/src/main/java/calculator/Dots.java @@ -7,7 +7,7 @@ import java.util.stream.IntStream; public class Dots { - private final List dots; + private final List dotV1s; /** * CONSTANTS @@ -15,19 +15,19 @@ public class Dots { private static final String SPLIT_EXPRESSION = "-"; private static final String IS_NOT_LINE = "선이 아니다."; private static final String IS_NOT_SQUARE = "사각형이 아니다."; + public Dots(String input) { validateInput(input); - this.dots = Arrays.stream(input.split("-")).map(Dot::new).collect(Collectors.toList()); + this.dotV1s = Arrays.stream(input.split("-")).map(DotV1::new).collect(Collectors.toList()); } - private Dots(Dot first, Dot second){ -// this.dots = List.of(first, second); - this.dots = new ArrayList<>(); - dots.add(first); - dots.add(second); + private Dots(DotV1 first, DotV1 second){ + this.dotV1s = new ArrayList<>(); + dotV1s.add(first); + dotV1s.add(second); } - public static Dots asLine(Dot first, Dot second){ + public static Dots asLine(DotV1 first, DotV1 second){ return new Dots(first, second); } @@ -41,42 +41,42 @@ private void validateInput(String input) { } public int size() { - return this.dots.size(); + return this.dotV1s.size(); } /** * line methods */ public boolean isLine() { - return this.dots.size() == 2; + return this.dotV1s.size() == 2; } public boolean isXParallelLine(){ if (!isLine()) { throw new IllegalArgumentException(IS_NOT_LINE); } - return dots.get(0).isXParallel(dots.get(1)); + return dotV1s.get(0).isXParallel(dotV1s.get(1)); } public boolean isYParallelLine(){ if (!isLine()) { throw new IllegalArgumentException(IS_NOT_LINE); } - return dots.get(0).isYParallel(dots.get(1)); + return dotV1s.get(0).isYParallel(dotV1s.get(1)); } public double getDistanceBetween(){ if (!this.isLine()) { throw new IllegalArgumentException(IS_NOT_LINE); } - return this.dots.get(0).getDistanceBetween(dots.get(1)); + return this.dotV1s.get(0).getDistanceBetween(dotV1s.get(1)); } /** * square methods */ public boolean isSquare() { - if (this.dots.size() != 4) { + if (this.dotV1s.size() != 4) { return false; } return isAllParallel(); @@ -84,9 +84,9 @@ public boolean isSquare() { public boolean isAllParallel() { return IntStream.range(0, 4).allMatch(i -> { - Dot dot1 = dots.get(i); - Dot dot2 = dots.get((i + 1) % 4); // 다음 점 - return dot1.isXParallel(dot2) || dot1.isYParallel(dot2); + DotV1 dotV1 = dotV1s.get(i); + DotV1 dotV12 = dotV1s.get((i + 1) % 4); // 다음 점 + return dotV1.isXParallel(dotV12) || dotV1.isYParallel(dotV12); }); } @@ -96,7 +96,7 @@ public int getSquareArea(){ } List collect = IntStream.range(0, 4) - .mapToObj(i -> dots.get(i).getDistanceBetween(dots.get((i + 1) % 4))) + .mapToObj(i -> dotV1s.get(i).getDistanceBetween(dotV1s.get((i + 1) % 4))) .distinct().collect(Collectors.toList()); if (collect.size() == 1) return (int) Math.pow(collect.get(0), 2); @@ -107,16 +107,16 @@ public int getSquareArea(){ * triangle */ public boolean isTriangle() { - return this.dots.size() == 3; + return this.dotV1s.size() == 3; } public double getLinesLength(){ double lineLength = 0; - for (int i = 0; i < this.dots.size(); i++) { - Dot first = dots.get(i); - Dot second = dots.get((i + 1) % dots.size()); - Line line = new Line(first, second); - lineLength += line.getDotsDistance(); + for (int i = 0; i < this.dotV1s.size(); i++) { + DotV1 first = dotV1s.get(i); + DotV1 second = dotV1s.get((i + 1) % dotV1s.size()); + LineV1 lineV1 = new LineV1(first, second); + lineLength += lineV1.getDotsDistance(); } return lineLength; } @@ -126,11 +126,11 @@ public double getLinesLength(){ //Area = √(s * (s - a) * (s - b) * (s - c)) public double getTriangleArea(){ List lineLengths = new ArrayList<>(); - for (int i = 0; i < this.dots.size(); i++) { - Dot first = dots.get(i); - Dot second = dots.get((i + 1) % dots.size()); - Line line = new Line(first, second); - lineLengths.add(line.getDotsDistance()); + for (int i = 0; i < this.dotV1s.size(); i++) { + DotV1 first = dotV1s.get(i); + DotV1 second = dotV1s.get((i + 1) % dotV1s.size()); + LineV1 lineV1 = new LineV1(first, second); + lineLengths.add(lineV1.getDotsDistance()); } double area = getLinesLength() / 2; for (Double lineLength : lineLengths) { diff --git a/src/main/java/calculator/Line.java b/src/main/java/calculator/LineV1.java similarity index 80% rename from src/main/java/calculator/Line.java rename to src/main/java/calculator/LineV1.java index af0fc7d2..0fdf8237 100644 --- a/src/main/java/calculator/Line.java +++ b/src/main/java/calculator/LineV1.java @@ -1,13 +1,13 @@ package calculator; -public class Line { +public class LineV1 { private final Dots dots; - public Line(Dots dots) { + public LineV1(Dots dots) { this.dots = dots; } - public Line(Dot first, Dot second){ + public LineV1(DotV1 first, DotV1 second){ this.dots = Dots.asLine(first, second); } diff --git a/src/main/java/calculator/Square.java b/src/main/java/calculator/SquareV1.java similarity index 81% rename from src/main/java/calculator/Square.java rename to src/main/java/calculator/SquareV1.java index 6b9ba93d..da316fc9 100644 --- a/src/main/java/calculator/Square.java +++ b/src/main/java/calculator/SquareV1.java @@ -1,9 +1,9 @@ package calculator; -public class Square { +public class SquareV1 { private final Dots dots; - public Square(Dots dots) { + public SquareV1(Dots dots) { if (!dots.isSquare()){ throw new IllegalArgumentException(); } diff --git a/src/main/java/calculator/Triangle.java b/src/main/java/calculator/Triangle.java deleted file mode 100644 index f202db9e..00000000 --- a/src/main/java/calculator/Triangle.java +++ /dev/null @@ -1,5 +0,0 @@ -package calculator; - -public class Triangle { - -} diff --git a/src/main/java/calculator/TriangleV1.java b/src/main/java/calculator/TriangleV1.java new file mode 100644 index 00000000..69b503ef --- /dev/null +++ b/src/main/java/calculator/TriangleV1.java @@ -0,0 +1,5 @@ +package calculator; + +public class TriangleV1 { + +} diff --git a/src/main/java/figure/AbstractFigure.java b/src/main/java/figure/AbstractFigure.java new file mode 100644 index 00000000..a2499d6b --- /dev/null +++ b/src/main/java/figure/AbstractFigure.java @@ -0,0 +1,21 @@ +package figure; + +import java.util.List; + +public abstract class AbstractFigure implements Figure{ + private final List dotList; + + protected AbstractFigure(List dotList) { + if (dotList.size() != this.size()){ + throw new IllegalArgumentException(); + } + this.dotList = dotList; + } + public Dot getDot(int index){ + return this.dotList.get(index); + } + @Override + public List getDots(){ + return this.dotList; + } +} diff --git a/src/main/java/calculator/Dot.java b/src/main/java/figure/Dot.java similarity index 98% rename from src/main/java/calculator/Dot.java rename to src/main/java/figure/Dot.java index db7505f7..ddd08a85 100644 --- a/src/main/java/calculator/Dot.java +++ b/src/main/java/figure/Dot.java @@ -1,4 +1,4 @@ -package calculator; +package figure; import java.util.Objects; diff --git a/src/main/java/figure/Figure.java b/src/main/java/figure/Figure.java new file mode 100644 index 00000000..9c7d58d8 --- /dev/null +++ b/src/main/java/figure/Figure.java @@ -0,0 +1,10 @@ +package figure; + +import java.util.List; + +public interface Figure { + String getName(); + int size(); + double getArea(); + List getDots(); +} diff --git a/src/main/java/figure/FigureEnum.java b/src/main/java/figure/FigureEnum.java new file mode 100644 index 00000000..5fe7acb2 --- /dev/null +++ b/src/main/java/figure/FigureEnum.java @@ -0,0 +1,22 @@ +package figure; + +public enum FigureEnum { + LINE("Line", 2), + TRIANGLE("Triangle", 3), + SQUARE("Square", 4); + + private final String name; + private final int size; + FigureEnum(String name, int size) { + this.name = name; + this.size = size; + } + + public String getName() { + return name; + } + + public int getSize(){ + return this.size; + } +} diff --git a/src/main/java/figure/FigureFactory.java b/src/main/java/figure/FigureFactory.java new file mode 100644 index 00000000..21c4c6f2 --- /dev/null +++ b/src/main/java/figure/FigureFactory.java @@ -0,0 +1,21 @@ +package figure; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class FigureFactory { + private final List
figures; + private static final Map figureMap = new HashMap<>(); + + public FigureFactory(List
figures) { + this.figures = figures; + for (Figure figure : figures) { + figureMap.put(figure.size(), figure); + } + } + + static Figure getInstance(List points) { + return figureMap.get(points.size()); + } +} \ No newline at end of file diff --git a/src/main/java/figure/Line.java b/src/main/java/figure/Line.java new file mode 100644 index 00000000..8cfa9ebf --- /dev/null +++ b/src/main/java/figure/Line.java @@ -0,0 +1,31 @@ +package figure; + +import java.util.List; + +public class Line extends AbstractFigure { + + protected Line(List dotList) { + super(dotList); + } + + @Override + public String getName() { + return FigureEnum.LINE.getName(); + } + + @Override + public int size() { + return FigureEnum.LINE.getSize(); + } + + @Override + public double getArea() { + return getLineDistance(); + } + + private double getLineDistance() { + Dot dot = this.getDot(0); + Dot secondDot = this.getDot(1); + return dot.getDistanceBetween(secondDot); + } +} diff --git a/src/main/java/figure/Square.java b/src/main/java/figure/Square.java new file mode 100644 index 00000000..00751769 --- /dev/null +++ b/src/main/java/figure/Square.java @@ -0,0 +1,40 @@ +package figure; + +import calculator.DotV1; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class Square extends AbstractFigure{ + + protected Square(List dotList) { + super(dotList); + } + + @Override + public String getName() { + return FigureEnum.SQUARE.getName(); + } + + @Override + public int size() { + return FigureEnum.SQUARE.getSize(); + } + + @Override + public double getArea() { + return getSquareArea(); + } + + private double getSquareArea(){ + List collect = IntStream.range(0, 4) + .mapToObj(i -> getDot(i).getDistanceBetween(getDots().get((i + 1) % 4))) + .distinct().collect(Collectors.toList()); + + if (collect.size() == 1) return (int) Math.pow(collect.get(0), 2); + + return collect.get(0) * collect.get(1); + } + +} diff --git a/src/main/java/figure/Triangle.java b/src/main/java/figure/Triangle.java new file mode 100644 index 00000000..31310198 --- /dev/null +++ b/src/main/java/figure/Triangle.java @@ -0,0 +1,46 @@ +package figure; + +import java.util.Arrays; +import java.util.List; + +public class Triangle extends AbstractFigure{ + protected Triangle(List dotList) { + super(dotList); + } + + @Override + public String getName() { + return FigureEnum.TRIANGLE.getName(); + } + + @Override + public int size() { + return FigureEnum.TRIANGLE.getSize(); + } + + @Override + public double getArea() { + return calculateArea(); + } + private double getLineLength(int firstIdx, int secondIdx){ + Dot dot = getDot(firstIdx); + Dot secondDot = getDot(secondIdx); + return dot.getDistanceBetween(secondDot); + } + + //헤론의 공식 + //s = (a + b + c) / 2 + //Area = √(s * (s - a) * (s - b) * (s - c)) + private double calculateArea(){ + double[] lengths = new double[3]; + + for (int i = 0; i < size(); i++) { + lengths[i] = this.getLineLength(i, (i + 1) % 3); + } + + double s = Arrays.stream(lengths).sum() / 2; + + return Math.sqrt(s * (s - lengths[0]) * (s - lengths[1]) * (s - lengths[2])); + } + +} diff --git a/src/test/java/DotTest.java b/src/test/java/DotV1Test.java similarity index 57% rename from src/test/java/DotTest.java rename to src/test/java/DotV1Test.java index c88c3e9f..ff2a0d46 100644 --- a/src/test/java/DotTest.java +++ b/src/test/java/DotV1Test.java @@ -1,9 +1,9 @@ -import calculator.Dot; +import calculator.DotV1; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.*; -class DotTest { +class DotV1Test { //- 사용자가 점에 대한 좌표 정보를 입력하는 메뉴를 구성한다. //- 좌표 정보는 괄호"(", ")"로 둘러쌓여 있으며 쉼표(,)로 x값과 y값을 구분한다. //- X, Y좌표 모두 최대 24까지만 입력할 수 있다. @@ -14,46 +14,46 @@ class DotTest { @Test void dotInit_test() { - Dot dot = new Dot(1, 1); - assertThat(dot).isEqualTo(new Dot(1, 1)); + DotV1 dotV1 = new DotV1(1, 1); + assertThat(dotV1).isEqualTo(new DotV1(1, 1)); } @Test void dot_validation_test() { //- 입력 범위를 초과할 경우 에러 문구를 출력하고 다시 입력을 받는다. 중요! - assertThatThrownBy(() -> new Dot(25, 25)).isInstanceOf(IllegalArgumentException.class); + assertThatThrownBy(() -> new DotV1(25, 25)).isInstanceOf(IllegalArgumentException.class); } @Test void string_input_test() { String input = "(1,1)"; - Dot dot = new Dot(input); - assertThat(dot).isEqualTo(new Dot(1,1)); + DotV1 dotV1 = new DotV1(input); + assertThat(dotV1).isEqualTo(new DotV1(1,1)); } @Test void validate_input_test() { String input = "(25,25)"; - assertThatThrownBy(() -> new Dot(input)).isInstanceOf(IllegalArgumentException.class); + assertThatThrownBy(() -> new DotV1(input)).isInstanceOf(IllegalArgumentException.class); } @Test void get_dot_distance() { - Dot dot = new Dot(10,10); - Dot secondDot = new Dot(14,15); - assertThat(dot.getDistanceBetween(secondDot)).isEqualTo(6.4, offset(0.1)); + DotV1 dotV1 = new DotV1(10,10); + DotV1 secondDotV1 = new DotV1(14,15); + assertThat(dotV1.getDistanceBetween(secondDotV1)).isEqualTo(6.4, offset(0.1)); } @Test void is_x_parallel() { - Dot dot = new Dot(10, 10); - Dot dot2 = new Dot(15, 10); - assertThat(dot.isXParallel(dot2)).isTrue(); + DotV1 dotV1 = new DotV1(10, 10); + DotV1 dotV12 = new DotV1(15, 10); + assertThat(dotV1.isXParallel(dotV12)).isTrue(); } @Test void is_y_parallel() { - Dot dot = new Dot(10, 10); - Dot dot2 = new Dot(10, 15); - assertThat(dot.isYParallel(dot2)).isTrue(); + DotV1 dotV1 = new DotV1(10, 10); + DotV1 dotV12 = new DotV1(10, 15); + assertThat(dotV1.isYParallel(dotV12)).isTrue(); } } diff --git a/src/test/java/LineTest.java b/src/test/java/LineV1Test.java similarity index 74% rename from src/test/java/LineTest.java rename to src/test/java/LineV1Test.java index 887ea81e..82b75a34 100644 --- a/src/test/java/LineTest.java +++ b/src/test/java/LineV1Test.java @@ -1,11 +1,10 @@ -import calculator.Dot; import calculator.Dots; -import calculator.Line; +import calculator.LineV1; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.*; -class LineTest { +class LineV1Test { //- 사용자가 점에 대한 좌표 정보를 입력하는 메뉴를 구성한다. //- 좌표 정보는 괄호"(", ")"로 둘러쌓여 있으며 쉼표(,)로 x값과 y값을 구분한다. //- X, Y좌표 모두 최대 24까지만 입력할 수 있다. @@ -19,21 +18,21 @@ class LineTest { @Test void lineDistance_test() { String input = "(1,1)-(5,5)"; - Line line = new Line(new Dots(input)); - assertThat(line.getDotsDistance()).isEqualTo(5.65, offset(0.01)); + LineV1 lineV1 = new LineV1(new Dots(input)); + assertThat(lineV1.getDotsDistance()).isEqualTo(5.65, offset(0.01)); } @Test void is_line_x_parallel() { String input = "(1,1)-(5,1)"; // y 값이 같다. - Line line = new Line(new Dots(input)); - assertThat(line.isXParallel()).isTrue(); + LineV1 lineV1 = new LineV1(new Dots(input)); + assertThat(lineV1.isXParallel()).isTrue(); } @Test void is_line_y_parallel() { String input = "(1,1)-(1,5)"; // x 값이 같다. - Line line = new Line(new Dots(input)); - assertThat(line.isYParallel()).isTrue(); + LineV1 lineV1 = new LineV1(new Dots(input)); + assertThat(lineV1.isYParallel()).isTrue(); } } diff --git a/src/test/java/SquareTest.java b/src/test/java/SquareV1Test.java similarity index 82% rename from src/test/java/SquareTest.java rename to src/test/java/SquareV1Test.java index c021497a..92a1cab6 100644 --- a/src/test/java/SquareTest.java +++ b/src/test/java/SquareV1Test.java @@ -1,10 +1,10 @@ import calculator.Dots; -import calculator.Square; +import calculator.SquareV1; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; -class SquareTest { +class SquareV1Test { //- 좌표값을 두 개 입력한 경우, 두 점을 있는 직선으로 가정한다. 좌표값과 좌표값 사이는 '-' 문자로 구분한다. //- 좌표값을 네 개 입력한 경우, 네 점을 연결하는 사각형으로 가정한다. // - 네 점이 뒤틀어진 사다리꼴이나 마름모는 제외하고 직사각형만 허용하도록 검사한다. @@ -13,7 +13,7 @@ class SquareTest { void square_area_test() { String input = "(10,10)-(22,10)-(22,18)-(10,18)"; Dots dots = new Dots(input); - Square square = new Square(dots); - assertThat(square.getArea()).isEqualTo(12 * 8); + SquareV1 squareV1 = new SquareV1(dots); + assertThat(squareV1.getArea()).isEqualTo(12 * 8); } } diff --git a/src/test/java/TriangleTest.java b/src/test/java/TriangleV1Test.java similarity index 97% rename from src/test/java/TriangleTest.java rename to src/test/java/TriangleV1Test.java index f4503d37..723ca77f 100644 --- a/src/test/java/TriangleTest.java +++ b/src/test/java/TriangleV1Test.java @@ -4,7 +4,7 @@ import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import static org.assertj.core.api.AssertionsForClassTypes.offset; -class TriangleTest { +class TriangleV1Test { @Test void is_triangle() { String input = "(10,11)-(22,10)-(22,18)"; From 3315a89dc81b14df33236d2afd026305b2799b48 Mon Sep 17 00:00:00 2001 From: DK Date: Mon, 30 Oct 2023 16:30:39 +0900 Subject: [PATCH 5/8] =?UTF-8?q?feat=20:=20=ED=8C=A9=ED=86=A0=EB=A6=AC=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=99=84=EC=84=B1,=20=EC=93=B8?= =?UTF-8?q?=EB=AA=A8=EC=97=86=EB=8A=94(V1)=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Main.java | 6 + src/main/java/calculator/DotV1.java | 56 --------- src/main/java/calculator/Dots.java | 141 ----------------------- src/main/java/calculator/LineV1.java | 25 ---- src/main/java/calculator/SquareV1.java | 16 --- src/main/java/calculator/TriangleV1.java | 5 - src/main/java/figure/FigureFactory.java | 29 +++-- src/test/java/DotV1Test.java | 59 ---------- src/test/java/DotsTest.java | 67 ----------- src/test/java/LineV1Test.java | 38 ------ src/test/java/SquareV1Test.java | 19 --- src/test/java/TriangleV1Test.java | 28 ----- 12 files changed, 26 insertions(+), 463 deletions(-) create mode 100644 src/main/java/Main.java delete mode 100644 src/main/java/calculator/DotV1.java delete mode 100644 src/main/java/calculator/Dots.java delete mode 100644 src/main/java/calculator/LineV1.java delete mode 100644 src/main/java/calculator/SquareV1.java delete mode 100644 src/main/java/calculator/TriangleV1.java delete mode 100644 src/test/java/DotV1Test.java delete mode 100644 src/test/java/DotsTest.java delete mode 100644 src/test/java/LineV1Test.java delete mode 100644 src/test/java/SquareV1Test.java delete mode 100644 src/test/java/TriangleV1Test.java diff --git a/src/main/java/Main.java b/src/main/java/Main.java new file mode 100644 index 00000000..2e4814d9 --- /dev/null +++ b/src/main/java/Main.java @@ -0,0 +1,6 @@ +import figure.FigureFactory; + +public class Main { + public static void main(String[] args) { + } +} diff --git a/src/main/java/calculator/DotV1.java b/src/main/java/calculator/DotV1.java deleted file mode 100644 index fcea73c8..00000000 --- a/src/main/java/calculator/DotV1.java +++ /dev/null @@ -1,56 +0,0 @@ -package calculator; - -import java.util.Objects; - -public class DotV1 { - private final int x; - private final int y; - private static final String INVALID_INPUT_FORMAT = "Invalid input format"; - private static final String REGEX_FOR_STRING_INPUT = "[()]"; - private static final int MAX_LOCATION_FOR_DOT = 24; - public DotV1(int x, int y) { - validateLocations(x, y); - this.x = x; - this.y = y; - } - - public DotV1(String input) { - String[] parts = input.replaceAll(REGEX_FOR_STRING_INPUT, "").split(","); - if (parts.length != 2) { - throw new IllegalArgumentException(INVALID_INPUT_FORMAT); - } - int x = Integer.parseInt(parts[0].trim()); - int y = Integer.parseInt(parts[1].trim()); - validateLocations(x, y); - this.x = x; - this.y = y; - } - - private void validateLocations(int x, int y) { - if (x > MAX_LOCATION_FOR_DOT || y > MAX_LOCATION_FOR_DOT) throw new IllegalArgumentException(); - } - - public double getDistanceBetween(DotV1 secondDotV1) { - return Math.sqrt(Math.pow((secondDotV1.x - this.x), 2) + Math.pow((secondDotV1.y - this.y), 2)); - } - public boolean isXParallel(DotV1 dotV1) { - return this.y == dotV1.y; - } - - public boolean isYParallel(DotV1 dotV1) { - return this.x == dotV1.x; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - DotV1 dotV1 = (DotV1) o; - return x == dotV1.x && y == dotV1.y; - } - - @Override - public int hashCode() { - return Objects.hash(x, y); - } -} diff --git a/src/main/java/calculator/Dots.java b/src/main/java/calculator/Dots.java deleted file mode 100644 index ce1bf2d7..00000000 --- a/src/main/java/calculator/Dots.java +++ /dev/null @@ -1,141 +0,0 @@ -package calculator; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -public class Dots { - private final List dotV1s; - - /** - * CONSTANTS - */ - private static final String SPLIT_EXPRESSION = "-"; - private static final String IS_NOT_LINE = "선이 아니다."; - private static final String IS_NOT_SQUARE = "사각형이 아니다."; - - public Dots(String input) { - validateInput(input); - this.dotV1s = Arrays.stream(input.split("-")).map(DotV1::new).collect(Collectors.toList()); - } - - private Dots(DotV1 first, DotV1 second){ - this.dotV1s = new ArrayList<>(); - dotV1s.add(first); - dotV1s.add(second); - } - - public static Dots asLine(DotV1 first, DotV1 second){ - return new Dots(first, second); - } - - /** - * validations & common methods - */ - private void validateInput(String input) { - if (!input.contains(SPLIT_EXPRESSION)){ - throw new IllegalArgumentException(); - } - } - - public int size() { - return this.dotV1s.size(); - } - - /** - * line methods - */ - public boolean isLine() { - return this.dotV1s.size() == 2; - } - - public boolean isXParallelLine(){ - if (!isLine()) { - throw new IllegalArgumentException(IS_NOT_LINE); - } - return dotV1s.get(0).isXParallel(dotV1s.get(1)); - } - - public boolean isYParallelLine(){ - if (!isLine()) { - throw new IllegalArgumentException(IS_NOT_LINE); - } - return dotV1s.get(0).isYParallel(dotV1s.get(1)); - } - - public double getDistanceBetween(){ - if (!this.isLine()) { - throw new IllegalArgumentException(IS_NOT_LINE); - } - return this.dotV1s.get(0).getDistanceBetween(dotV1s.get(1)); - } - - /** - * square methods - */ - public boolean isSquare() { - if (this.dotV1s.size() != 4) { - return false; - } - return isAllParallel(); - } - - public boolean isAllParallel() { - return IntStream.range(0, 4).allMatch(i -> { - DotV1 dotV1 = dotV1s.get(i); - DotV1 dotV12 = dotV1s.get((i + 1) % 4); // 다음 점 - return dotV1.isXParallel(dotV12) || dotV1.isYParallel(dotV12); - }); - } - - public int getSquareArea(){ - if (!isSquare()) { - throw new IllegalArgumentException(IS_NOT_SQUARE); - } - - List collect = IntStream.range(0, 4) - .mapToObj(i -> dotV1s.get(i).getDistanceBetween(dotV1s.get((i + 1) % 4))) - .distinct().collect(Collectors.toList()); - - if (collect.size() == 1) return (int) Math.pow(collect.get(0), 2); - return (int) (collect.get(0) * collect.get(1)); - } - - /** - * triangle - */ - public boolean isTriangle() { - return this.dotV1s.size() == 3; - } - - public double getLinesLength(){ - double lineLength = 0; - for (int i = 0; i < this.dotV1s.size(); i++) { - DotV1 first = dotV1s.get(i); - DotV1 second = dotV1s.get((i + 1) % dotV1s.size()); - LineV1 lineV1 = new LineV1(first, second); - lineLength += lineV1.getDotsDistance(); - } - return lineLength; - } - - //헤론의 공식 - //s = (a + b + c) / 2 - //Area = √(s * (s - a) * (s - b) * (s - c)) - public double getTriangleArea(){ - List lineLengths = new ArrayList<>(); - for (int i = 0; i < this.dotV1s.size(); i++) { - DotV1 first = dotV1s.get(i); - DotV1 second = dotV1s.get((i + 1) % dotV1s.size()); - LineV1 lineV1 = new LineV1(first, second); - lineLengths.add(lineV1.getDotsDistance()); - } - double area = getLinesLength() / 2; - for (Double lineLength : lineLengths) { - area *= (getLinesLength() / 2) - lineLength; - } - return Math.sqrt(area); - } -} \ No newline at end of file diff --git a/src/main/java/calculator/LineV1.java b/src/main/java/calculator/LineV1.java deleted file mode 100644 index 0fdf8237..00000000 --- a/src/main/java/calculator/LineV1.java +++ /dev/null @@ -1,25 +0,0 @@ -package calculator; - -public class LineV1 { - private final Dots dots; - - public LineV1(Dots dots) { - this.dots = dots; - } - - public LineV1(DotV1 first, DotV1 second){ - this.dots = Dots.asLine(first, second); - } - - public double getDotsDistance(){ - return this.dots.getDistanceBetween(); - } - - public boolean isXParallel() { - return this.dots.isXParallelLine(); - } - - public boolean isYParallel(){ - return this.dots.isYParallelLine(); - } -} \ No newline at end of file diff --git a/src/main/java/calculator/SquareV1.java b/src/main/java/calculator/SquareV1.java deleted file mode 100644 index da316fc9..00000000 --- a/src/main/java/calculator/SquareV1.java +++ /dev/null @@ -1,16 +0,0 @@ -package calculator; - -public class SquareV1 { - private final Dots dots; - - public SquareV1(Dots dots) { - if (!dots.isSquare()){ - throw new IllegalArgumentException(); - } - this.dots = dots; - } - - public int getArea() { - return this.dots.getSquareArea(); - } -} diff --git a/src/main/java/calculator/TriangleV1.java b/src/main/java/calculator/TriangleV1.java deleted file mode 100644 index 69b503ef..00000000 --- a/src/main/java/calculator/TriangleV1.java +++ /dev/null @@ -1,5 +0,0 @@ -package calculator; - -public class TriangleV1 { - -} diff --git a/src/main/java/figure/FigureFactory.java b/src/main/java/figure/FigureFactory.java index 21c4c6f2..c106a462 100644 --- a/src/main/java/figure/FigureFactory.java +++ b/src/main/java/figure/FigureFactory.java @@ -1,21 +1,32 @@ package figure; +import java.lang.reflect.Constructor; import java.util.HashMap; import java.util.List; import java.util.Map; public class FigureFactory { - private final List
figures; - private static final Map figureMap = new HashMap<>(); + private FigureFactory() { + throw new IllegalArgumentException("util class"); + } - public FigureFactory(List
figures) { - this.figures = figures; - for (Figure figure : figures) { - figureMap.put(figure.size(), figure); - } + private static final Map> figureMap = new HashMap<>(); + + static { + figureMap.put(FigureEnum.LINE.getSize(), Line.class); + figureMap.put(FigureEnum.TRIANGLE.getSize(), Triangle.class); + figureMap.put(FigureEnum.SQUARE.getSize(), Square.class); } - static Figure getInstance(List points) { - return figureMap.get(points.size()); + public static Figure getInstance(List points) { + Class figureClass = figureMap.get(points.size()); + if (figureClass == null) { + throw new IllegalArgumentException("잘못된 입력"); + } + try { + return figureClass.getConstructor(List.class).newInstance(points); + } catch (Exception e) { + throw new IllegalArgumentException("유효하지 않은 도형"); + } } } \ No newline at end of file diff --git a/src/test/java/DotV1Test.java b/src/test/java/DotV1Test.java deleted file mode 100644 index ff2a0d46..00000000 --- a/src/test/java/DotV1Test.java +++ /dev/null @@ -1,59 +0,0 @@ -import calculator.DotV1; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.*; - -class DotV1Test { - //- 사용자가 점에 대한 좌표 정보를 입력하는 메뉴를 구성한다. - //- 좌표 정보는 괄호"(", ")"로 둘러쌓여 있으며 쉼표(,)로 x값과 y값을 구분한다. - //- X, Y좌표 모두 최대 24까지만 입력할 수 있다. - - //- 정상적인 좌표값을 입력한 경우, 해당 좌표에 특수문자를 표시한다. - //- 좌표값을 두 개 입력한 경우, 두 점을 있는 직선으로 가정한다. 좌표값과 좌표값 사이는 '-' 문자로 구분한다. - //- 직선인 경우는 두 점 사이 거리를 계산해서 출력한다. - - @Test - void dotInit_test() { - DotV1 dotV1 = new DotV1(1, 1); - assertThat(dotV1).isEqualTo(new DotV1(1, 1)); - } - - @Test - void dot_validation_test() { //- 입력 범위를 초과할 경우 에러 문구를 출력하고 다시 입력을 받는다. 중요! - assertThatThrownBy(() -> new DotV1(25, 25)).isInstanceOf(IllegalArgumentException.class); - } - - @Test - void string_input_test() { - String input = "(1,1)"; - DotV1 dotV1 = new DotV1(input); - assertThat(dotV1).isEqualTo(new DotV1(1,1)); - } - - @Test - void validate_input_test() { - String input = "(25,25)"; - assertThatThrownBy(() -> new DotV1(input)).isInstanceOf(IllegalArgumentException.class); - } - - @Test - void get_dot_distance() { - DotV1 dotV1 = new DotV1(10,10); - DotV1 secondDotV1 = new DotV1(14,15); - assertThat(dotV1.getDistanceBetween(secondDotV1)).isEqualTo(6.4, offset(0.1)); - } - - @Test - void is_x_parallel() { - DotV1 dotV1 = new DotV1(10, 10); - DotV1 dotV12 = new DotV1(15, 10); - assertThat(dotV1.isXParallel(dotV12)).isTrue(); - } - - @Test - void is_y_parallel() { - DotV1 dotV1 = new DotV1(10, 10); - DotV1 dotV12 = new DotV1(10, 15); - assertThat(dotV1.isYParallel(dotV12)).isTrue(); - } -} diff --git a/src/test/java/DotsTest.java b/src/test/java/DotsTest.java deleted file mode 100644 index 048ceace..00000000 --- a/src/test/java/DotsTest.java +++ /dev/null @@ -1,67 +0,0 @@ -import calculator.Dots; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -class DotsTest { - @Test - void dots_init_test() { - String input = "(10,10)-(22,10)-(22,18)-(10,18)"; - Dots dots = new Dots(input); - assertThat(dots.size()).isEqualTo(4); - } - - @Test - void is_line() { - String input = "(10,10)-(22,10)"; - Dots dots = new Dots(input); - assertThat(dots.isLine()).isTrue(); - } - - @Test - void invalid_lineInput_test() { - String input = "(1,1)1(5,5)"; - String input2 = "(1,1)"; - String input3 = "(25,25)-(25,25)"; - - assertThatThrownBy(() -> new Dots(input)).isInstanceOf(IllegalArgumentException.class); - assertThatThrownBy(() -> new Dots(input2)).isInstanceOf(IllegalArgumentException.class); - assertThatThrownBy(() -> new Dots(input3)).isInstanceOf(IllegalArgumentException.class); - } - - @Test - void is_square() { - String input = "(10,10)-(22,10)-(22,18)-(10,18)"; - Dots dots = new Dots(input); - assertThat(dots.isSquare()).isTrue(); - } - - @Test - void is_not_square() { - String input = "(10,11)-(22,10)-(22,18)-(10,18)"; - Dots dots = new Dots(input); - assertThat(dots.isSquare()).isFalse(); - } - - @Test - void is_triangle() { - String input = "(10,11)-(22,10)-(22,18)"; - Dots dots = new Dots(input); - assertThat(dots.isTriangle()).isTrue(); - } - - @Test - void is_not_triangle() { - String input = "(10,11)-(22,10)"; - Dots dots = new Dots(input); - assertThat(dots.isTriangle()).isFalse(); - } - - @Test - void triangle_area() { - String input = "(10,11)-(22,10)-(22,18)"; - Dots dots = new Dots(input); - - } -} diff --git a/src/test/java/LineV1Test.java b/src/test/java/LineV1Test.java deleted file mode 100644 index 82b75a34..00000000 --- a/src/test/java/LineV1Test.java +++ /dev/null @@ -1,38 +0,0 @@ -import calculator.Dots; -import calculator.LineV1; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.*; - -class LineV1Test { - //- 사용자가 점에 대한 좌표 정보를 입력하는 메뉴를 구성한다. - //- 좌표 정보는 괄호"(", ")"로 둘러쌓여 있으며 쉼표(,)로 x값과 y값을 구분한다. - //- X, Y좌표 모두 최대 24까지만 입력할 수 있다. - - //- 정상적인 좌표값을 입력한 경우, 해당 좌표에 특수문자를 표시한다. - //- 좌표값을 두 개 입력한 경우, 두 점을 있는 직선으로 가정한다. 좌표값과 좌표값 사이는 '-' 문자로 구분한다. - //- 직선인 경우는 두 점 사이 거리를 계산해서 출력한다. - - // getter 매소드를 두는 것이 좋지 않다고 판단됨. lineGetFirstDot() 과 같은 형태는 쓰지 않기로 - - - @Test - void lineDistance_test() { - String input = "(1,1)-(5,5)"; - LineV1 lineV1 = new LineV1(new Dots(input)); - assertThat(lineV1.getDotsDistance()).isEqualTo(5.65, offset(0.01)); - } - - @Test - void is_line_x_parallel() { - String input = "(1,1)-(5,1)"; // y 값이 같다. - LineV1 lineV1 = new LineV1(new Dots(input)); - assertThat(lineV1.isXParallel()).isTrue(); - } - - @Test - void is_line_y_parallel() { - String input = "(1,1)-(1,5)"; // x 값이 같다. - LineV1 lineV1 = new LineV1(new Dots(input)); - assertThat(lineV1.isYParallel()).isTrue(); - } -} diff --git a/src/test/java/SquareV1Test.java b/src/test/java/SquareV1Test.java deleted file mode 100644 index 92a1cab6..00000000 --- a/src/test/java/SquareV1Test.java +++ /dev/null @@ -1,19 +0,0 @@ -import calculator.Dots; -import calculator.SquareV1; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -class SquareV1Test { - //- 좌표값을 두 개 입력한 경우, 두 점을 있는 직선으로 가정한다. 좌표값과 좌표값 사이는 '-' 문자로 구분한다. - //- 좌표값을 네 개 입력한 경우, 네 점을 연결하는 사각형으로 가정한다. - // - 네 점이 뒤틀어진 사다리꼴이나 마름모는 제외하고 직사각형만 허용하도록 검사한다. - // - 사각형인 경우 사각형의 넓이를 계산해서 출력한다 - @Test - void square_area_test() { - String input = "(10,10)-(22,10)-(22,18)-(10,18)"; - Dots dots = new Dots(input); - SquareV1 squareV1 = new SquareV1(dots); - assertThat(squareV1.getArea()).isEqualTo(12 * 8); - } -} diff --git a/src/test/java/TriangleV1Test.java b/src/test/java/TriangleV1Test.java deleted file mode 100644 index 723ca77f..00000000 --- a/src/test/java/TriangleV1Test.java +++ /dev/null @@ -1,28 +0,0 @@ -import calculator.Dots; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; -import static org.assertj.core.api.AssertionsForClassTypes.offset; - -class TriangleV1Test { - @Test - void is_triangle() { - String input = "(10,11)-(22,10)-(22,18)"; - Dots dots = new Dots(input); - assertThat(dots.isTriangle()).isTrue(); - } - - @Test - void get_triangle_distances() { - String input = "(10,11)-(22,10)-(22,18)"; - Dots dots = new Dots(input); - assertThat(dots.getLinesLength()).isEqualTo(33.93, offset(0.01)); - } - - @Test - void get_triangle_area() { - String input = "(10,11)-(22,10)-(22,18)"; - Dots dots = new Dots(input); - assertThat(dots.getTriangleArea()).isEqualTo(48, offset(0.1)); - } -} From 96b5eb88ae277d8bb8439caa4ffef64242c6a43b Mon Sep 17 00:00:00 2001 From: DK Date: Mon, 30 Oct 2023 20:26:25 +0900 Subject: [PATCH 6/8] =?UTF-8?q?Refactor=20:=20=EA=B2=8C=EC=9E=84=EC=9D=98?= =?UTF-8?q?=20=EC=99=84=EC=84=B1=20=EB=B0=8F=20Factory=20pattern(with=20la?= =?UTF-8?q?mbda)=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/app/FigureGame.java | 18 +++++++++++ src/main/java/app/Main.java | 9 ++++++ src/main/java/figure/Dot.java | 12 +++---- src/main/java/figure/FigureFactoryLambda.java | 22 +++++++++++++ src/main/java/figure/Square.java | 2 -- src/main/java/view/InputView.java | 13 ++++++++ src/main/java/view/OutputView.java | 31 +++++++++++++++++++ 7 files changed, 99 insertions(+), 8 deletions(-) create mode 100644 src/main/java/app/FigureGame.java create mode 100644 src/main/java/app/Main.java create mode 100644 src/main/java/figure/FigureFactoryLambda.java create mode 100644 src/main/java/view/OutputView.java diff --git a/src/main/java/app/FigureGame.java b/src/main/java/app/FigureGame.java new file mode 100644 index 00000000..4c33b095 --- /dev/null +++ b/src/main/java/app/FigureGame.java @@ -0,0 +1,18 @@ +package app; + +import view.InputView; +import view.OutputView; + +import java.io.IOException; + +public class FigureGame { + private FigureGame() { + throw new IllegalArgumentException(); + } + + public static void game() throws IOException { + OutputView.printGetInput(); + String[] userInputDots = InputView.getInput(); + OutputView.printOutput(userInputDots); + } +} diff --git a/src/main/java/app/Main.java b/src/main/java/app/Main.java new file mode 100644 index 00000000..cb0b3b20 --- /dev/null +++ b/src/main/java/app/Main.java @@ -0,0 +1,9 @@ +package app; + +import java.io.IOException; + +public class Main { + public static void main(String[] args) throws IOException { + FigureGame.game(); + } +} diff --git a/src/main/java/figure/Dot.java b/src/main/java/figure/Dot.java index ddd08a85..ab4d1755 100644 --- a/src/main/java/figure/Dot.java +++ b/src/main/java/figure/Dot.java @@ -8,22 +8,22 @@ public class Dot { private static final String INVALID_INPUT_FORMAT = "Invalid input format"; private static final String REGEX_FOR_STRING_INPUT = "[()]"; private static final int MAX_LOCATION_FOR_DOT = 24; - public Dot(int x, int y) { + private Dot(int x, int y) { validateLocations(x, y); this.x = x; this.y = y; } - - public Dot(String input) { + public static Dot ofTest(int x, int y){ + return new Dot(x,y); + } + public static Dot of(String input){ String[] parts = input.replaceAll(REGEX_FOR_STRING_INPUT, "").split(","); if (parts.length != 2) { throw new IllegalArgumentException(INVALID_INPUT_FORMAT); } int x = Integer.parseInt(parts[0].trim()); int y = Integer.parseInt(parts[1].trim()); - validateLocations(x, y); - this.x = x; - this.y = y; + return new Dot(x, y); } private void validateLocations(int x, int y) { diff --git a/src/main/java/figure/FigureFactoryLambda.java b/src/main/java/figure/FigureFactoryLambda.java new file mode 100644 index 00000000..91c05229 --- /dev/null +++ b/src/main/java/figure/FigureFactoryLambda.java @@ -0,0 +1,22 @@ +package figure; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; + +public class FigureFactoryLambda { + private FigureFactoryLambda() { + throw new IllegalArgumentException("util class"); + } + private static final Map, Figure>> figureMap = new HashMap<>(); + static { + figureMap.put(2, Line::new); + figureMap.put(3, Triangle::new); + figureMap.put(4, Square::new); + } + public static Figure getInstance(List dotList){ + Function, Figure> figureFunction = figureMap.get(dotList.size()); + return figureFunction.apply(dotList); + } +} \ No newline at end of file diff --git a/src/main/java/figure/Square.java b/src/main/java/figure/Square.java index 00751769..c28526ed 100644 --- a/src/main/java/figure/Square.java +++ b/src/main/java/figure/Square.java @@ -1,7 +1,5 @@ package figure; -import calculator.DotV1; - import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index ae2791fb..a3b318eb 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -1,4 +1,17 @@ package view; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + public class InputView { + private InputView() { + throw new IllegalArgumentException(); + } + + private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + public static String[] getInput() throws IOException { + String userInput = br.readLine(); + return userInput.split("-"); + } } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java new file mode 100644 index 00000000..edfce0ba --- /dev/null +++ b/src/main/java/view/OutputView.java @@ -0,0 +1,31 @@ +package view; + +import figure.Dot; +import figure.Figure; +import figure.FigureFactoryLambda; + +import java.io.BufferedWriter; +import java.io.OutputStreamWriter; +import java.util.ArrayList; +import java.util.List; + +public class OutputView { + private OutputView() { + throw new IllegalArgumentException(); + } + + public static void printGetInput(){ + System.out.println("숫자를 입력해라"); + } + + public static void printOutput(String[] userInputs){ + List dotList = new ArrayList<>(); + for (String userInput : userInputs) { + dotList.add(Dot.of(userInput)); + } + Figure instance = FigureFactoryLambda.getInstance(dotList); + String name = instance.getName(); + double area = instance.getArea(); + System.out.println(name + "의 Area 는 : " + area + "이다."); + } +} From 17008b692efa08cde9b13a0395ff3a7820cf0141 Mon Sep 17 00:00:00 2001 From: DK Date: Mon, 30 Oct 2023 21:05:07 +0900 Subject: [PATCH 7/8] =?UTF-8?q?Refactor=20:=20clazz.constructer()=20?= =?UTF-8?q?=EB=A7=A4=EC=84=9C=EB=93=9C=EB=8A=94=20public=20=EC=A0=91?= =?UTF-8?q?=EA=B7=BC=EC=A0=9C=EC=96=B4=EC=9E=90=EC=97=90=EC=84=9C=EB=A7=8C?= =?UTF-8?q?=20=EC=9D=B8=EC=8B=9D=EB=90=9C=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/figure/Line.java | 2 +- src/main/java/figure/Square.java | 2 +- src/main/java/figure/Triangle.java | 2 +- src/main/java/view/OutputView.java | 6 ++---- 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/main/java/figure/Line.java b/src/main/java/figure/Line.java index 8cfa9ebf..d38c2535 100644 --- a/src/main/java/figure/Line.java +++ b/src/main/java/figure/Line.java @@ -4,7 +4,7 @@ public class Line extends AbstractFigure { - protected Line(List dotList) { + public Line(List dotList) { super(dotList); } diff --git a/src/main/java/figure/Square.java b/src/main/java/figure/Square.java index c28526ed..da40100c 100644 --- a/src/main/java/figure/Square.java +++ b/src/main/java/figure/Square.java @@ -6,7 +6,7 @@ public class Square extends AbstractFigure{ - protected Square(List dotList) { + public Square(List dotList) { super(dotList); } diff --git a/src/main/java/figure/Triangle.java b/src/main/java/figure/Triangle.java index 31310198..1f1a351d 100644 --- a/src/main/java/figure/Triangle.java +++ b/src/main/java/figure/Triangle.java @@ -4,7 +4,7 @@ import java.util.List; public class Triangle extends AbstractFigure{ - protected Triangle(List dotList) { + public Triangle(List dotList) { super(dotList); } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index edfce0ba..67916987 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -2,10 +2,8 @@ import figure.Dot; import figure.Figure; -import figure.FigureFactoryLambda; +import figure.FigureFactory; -import java.io.BufferedWriter; -import java.io.OutputStreamWriter; import java.util.ArrayList; import java.util.List; @@ -23,7 +21,7 @@ public static void printOutput(String[] userInputs){ for (String userInput : userInputs) { dotList.add(Dot.of(userInput)); } - Figure instance = FigureFactoryLambda.getInstance(dotList); + Figure instance = FigureFactory.getInstance(dotList); String name = instance.getName(); double area = instance.getArea(); System.out.println(name + "의 Area 는 : " + area + "이다."); From 74250d600bab8a98a72f09192ce85d8de40e1457 Mon Sep 17 00:00:00 2001 From: DK Date: Tue, 31 Oct 2023 10:01:56 +0900 Subject: [PATCH 8/8] =?UTF-8?q?feat=20:=20Custom=20=EC=9D=B8=ED=84=B0?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=8A=A4=EB=A5=BC=20=EC=9D=B4=EC=9A=A9?= =?UTF-8?q?=ED=95=9C=20Function=20=ED=99=9C=EC=9A=A9=20(=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A6=AC)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/figure/FactoryFunction.java | 8 ++++++++ src/main/java/figure/FigureFactoryLambda.java | 10 ++++++++++ 2 files changed, 18 insertions(+) create mode 100644 src/main/java/figure/FactoryFunction.java diff --git a/src/main/java/figure/FactoryFunction.java b/src/main/java/figure/FactoryFunction.java new file mode 100644 index 00000000..f5b5ae13 --- /dev/null +++ b/src/main/java/figure/FactoryFunction.java @@ -0,0 +1,8 @@ +package figure; + +import java.util.List; + +@FunctionalInterface +public interface FactoryFunction { + Figure create(List dotList); +} diff --git a/src/main/java/figure/FigureFactoryLambda.java b/src/main/java/figure/FigureFactoryLambda.java index 91c05229..fcd8ba9e 100644 --- a/src/main/java/figure/FigureFactoryLambda.java +++ b/src/main/java/figure/FigureFactoryLambda.java @@ -10,6 +10,12 @@ private FigureFactoryLambda() { throw new IllegalArgumentException("util class"); } private static final Map, Figure>> figureMap = new HashMap<>(); + private static final Map figureMap2 = new HashMap<>(); + static { + figureMap2.put(2, Line::new); + figureMap2.put(3, Triangle::new); + figureMap2.put(4, Square::new); + } static { figureMap.put(2, Line::new); figureMap.put(3, Triangle::new); @@ -19,4 +25,8 @@ public static Figure getInstance(List dotList){ Function, Figure> figureFunction = figureMap.get(dotList.size()); return figureFunction.apply(dotList); } + public static Figure getInstanceByCustomFunction(List dotList){ + FactoryFunction factoryFunction = figureMap2.get(dotList.size()); + return factoryFunction.create(dotList); + } } \ No newline at end of file