Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
447b6b4
feat : RentCompany 테스트 생성
sdrs6921 Nov 9, 2021
8c685fa
feat : DistancePerLiter, TripDistance VO 구현
sdrs6921 Nov 9, 2021
18d2b37
feat : Car 추상 클래스 및 구현체 테스트 및 구현
sdrs6921 Nov 9, 2021
d09679f
feat : RentCompany 구현
sdrs6921 Nov 9, 2021
2ae061c
feat : X좌표 테스트 및 기능 구현
sdrs6921 Nov 9, 2021
cf77972
feat : Y좌표 테스트 및 기능 구현
sdrs6921 Nov 9, 2021
5d34abc
feat : 점 좌표 테스트 및 기능 구현
sdrs6921 Nov 9, 2021
d1579d6
feat : X 값 사이의 거리를 반환하는 메서드 테스트 및 기능 구현
sdrs6921 Nov 11, 2021
e30f68d
feat : Y 값 사이의 거리를 반환하는 메서드 테스트 및 기능 구현
sdrs6921 Nov 11, 2021
28767e4
feat : 두 점 사이의 거리를 반환하는 메서드 테스트 및 기능 구현
sdrs6921 Nov 11, 2021
d9454df
feat : 선 도메인 테스트 및 기능 구현
sdrs6921 Nov 11, 2021
1a87481
feat : X, Y를 좌표값으로 통일하여 중복 제거
sdrs6921 Nov 11, 2021
b76415a
style : 명확한 변수 명으로 변경
sdrs6921 Nov 11, 2021
ece1e02
feat : 도형 추상 클래스 생성
sdrs6921 Nov 11, 2021
ec4f5fa
refactor : 좌표 값 예외 메세지 수
sdrs6921 Nov 11, 2021
bf154e1
feat : 좌표 값 중복 테스트 및 기능 구현
sdrs6921 Nov 11, 2021
b257cc9
feat : X, Y 좌표 반환 메서드 접근제어자 변경
sdrs6921 Nov 12, 2021
a431858
feat : X, Y 좌표의 일치 여부를 반환하는 메서드 기능 구현
sdrs6921 Nov 12, 2021
3072a03
feat : 사각형 도메인 테스트 및 기능 구현
sdrs6921 Nov 12, 2021
fb3cb85
feat : 좌표 절대 증가값을 반환하는 메서드 테스트 및 기능 구현
sdrs6921 Nov 12, 2021
c5bb8aa
feat : 점과 점 사이의 기울기를 구하는 메서드 테스트 및 기능 구현
sdrs6921 Nov 12, 2021
24b8383
refactor : 직선 객체를 도형 추상 클래스와 분리
sdrs6921 Nov 17, 2021
e2a3756
refactor : 직선 중복 체크 메서드 테스트 및 기능 구현
sdrs6921 Nov 17, 2021
d36c077
refactor : 불필요한 상속 클래스 제거
sdrs6921 Nov 17, 2021
a26dfbb
refactor : 점 사이의 중복 검사 테스트 및 기능 구현
sdrs6921 Nov 17, 2021
ec8d40c
chore : 자바 버전 11로 변경
sdrs6921 Nov 18, 2021
eda750a
feat : 삼각형 도메인 테스트 및 기능 구현
sdrs6921 Nov 18, 2021
479fec9
refactor : 불필요한 기울기 계산 메서드 제거
sdrs6921 Nov 18, 2021
7c7045b
feat : 도형 생성 팩토리 기능 구현
sdrs6921 Nov 18, 2021
19d99f5
style : 메서드 위치 조정
sdrs6921 Nov 18, 2021
ba33221
feat : InputView 기능 구현
sdrs6921 Nov 18, 2021
8209dca
feat : OutputView 기능 구현
sdrs6921 Nov 18, 2021
db8671a
feat : CoordinateController 기능 구현
sdrs6921 Nov 18, 2021
4dac679
feat : Main 메서드 기능 구현
sdrs6921 Nov 18, 2021
bcddcf2
refactor : 사용하지 않는 메서드 제거
sdrs6921 Nov 20, 2021
ad3203d
refactor : equals 메서드에서 필드를 메서드로 접근하도록 변경
sdrs6921 Nov 20, 2021
37b5553
refactor : View 에서 Figure 구현체에 대한 의존성 분리
sdrs6921 Nov 20, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ apply plugin: 'eclipse'

group = 'camp.nextstep'
version = '1.0.0'
sourceCompatibility = '1.8'
sourceCompatibility = '11'

repositories {
mavenCentral()
Expand Down
20 changes: 20 additions & 0 deletions src/main/java/coordinate/CoordinateMain.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package coordinate;

import coordinate.controller.CoordinateController;
import coordinate.view.InputConsoleView;
import coordinate.view.InputView;
import coordinate.view.OutputConsoleView;
import coordinate.view.OutputView;

import java.util.Scanner;

public class CoordinateMain {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
InputView inputView = new InputConsoleView(scanner);
OutputView outputView = new OutputConsoleView();
CoordinateController coordinateController = new CoordinateController(inputView, outputView);
coordinateController.run();
scanner.close();
}
}
49 changes: 49 additions & 0 deletions src/main/java/coordinate/controller/CoordinateController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package coordinate.controller;

import coordinate.domain.Figure;
import coordinate.domain.FigureFactory;
import coordinate.domain.Line;
import coordinate.domain.StraightLine;
import coordinate.domain.vo.Point;
import coordinate.view.InputView;
import coordinate.view.OutputView;

import java.util.List;

public class CoordinateController {

private static final int NUMBER_OF_LINE = 2;

private final InputView inputView;
private final OutputView outputView;

public CoordinateController(final InputView inputView, final OutputView outputView) {
this.inputView = inputView;
this.outputView = outputView;
}

public void run() {
List<Point> points = inputView.input();

if (isLineNumberOf(points)) {
printLine(points);
return;
}

printFigure(points);
}

private boolean isLineNumberOf(final List<Point> points) {
return points.size() == NUMBER_OF_LINE;
}

private void printLine(final List<Point> points) {
Line line = new StraightLine(points);
outputView.printLine(line);
}

private void printFigure(final List<Point> points) {
Figure figure = FigureFactory.create(points);
outputView.printFigure(figure);
}
}
7 changes: 7 additions & 0 deletions src/main/java/coordinate/domain/Figure.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package coordinate.domain;

public interface Figure {
double area();

String figureType();
}
38 changes: 38 additions & 0 deletions src/main/java/coordinate/domain/FigureFactory.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package coordinate.domain;

import coordinate.domain.vo.Point;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;

public class FigureFactory {

private static final String INVALID_NUMBER_OF_POINTS_MESSAGE = "유효하지 않은 점의 개수입니다";
private static final int NUMBER_OF_TRIANGLE_POINTS = 3;
private static final int NUMBER_OF_RECTANGLE_POINTS = 4;

private static final Map<Integer, Function<List<Point>, Figure>> factory = new HashMap<>();

static {
factory.put(NUMBER_OF_TRIANGLE_POINTS, Triangle::new);
factory.put(NUMBER_OF_RECTANGLE_POINTS, Rectangle::new);
}

private FigureFactory() {

}

public static Figure create(final List<Point> points) {
int numberOfPoints = points.size();
validateNumberOfPoints(numberOfPoints);
return factory.get(numberOfPoints).apply(points);
}

private static void validateNumberOfPoints(final int numberOfPoints) {
if (numberOfPoints < NUMBER_OF_TRIANGLE_POINTS || numberOfPoints > NUMBER_OF_RECTANGLE_POINTS) {
throw new IllegalArgumentException(INVALID_NUMBER_OF_POINTS_MESSAGE);
}
}
}
6 changes: 6 additions & 0 deletions src/main/java/coordinate/domain/Line.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package coordinate.domain;

@FunctionalInterface
public interface Line {
double length();
}
112 changes: 112 additions & 0 deletions src/main/java/coordinate/domain/Rectangle.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
package coordinate.domain;

import coordinate.domain.vo.Coordinate;
import coordinate.domain.vo.Point;

import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

import static java.util.Arrays.asList;

public class Rectangle implements Figure {

private static final int NUMBER_OF_RECTANGLE_POINTS = 4;
private static final int NUMBER_OF_DUPLICATED_COORDINATE = 2;

private static final String INVALID_NUMBER_OF_RECTANGLE_POINTS_MESSAGE = "사각형의 점은 4개여야 합니다";
private static final String INVALID_RECTANGLE_MESSAGE = "직사각형이 아닙니다";
private static final String DUPLICATE_POINTS_EXCEPTION_MESSAGE = "점 사이에 중복이 존재합니다";

private final List<Point> points;

public Rectangle(final List<Point> points) {
validateNumberOf(points);
validateDuplicateOf(points);
validateIsRectangle(points);
this.points = points;
}

private void validateNumberOf(final List<Point> points) {
if (points.size() != NUMBER_OF_RECTANGLE_POINTS) {
throw new IllegalArgumentException(INVALID_NUMBER_OF_RECTANGLE_POINTS_MESSAGE);
}
}

private void validateDuplicateOf(final List<Point> points) {
Set<Point> distinctPoints = new HashSet<>(points);

if (distinctPoints.size() < points.size()) {
throw new IllegalArgumentException(DUPLICATE_POINTS_EXCEPTION_MESSAGE);
}
}

private void validateIsRectangle(final List<Point> points) {
Set<Coordinate> duplicatedRemovedXCoordinate = removeDuplicateCoordinate(points, Point::x);
Set<Coordinate> duplicatedRemovedYCoordinate = removeDuplicateCoordinate(points, Point::y);

if (hasTwo(duplicatedRemovedXCoordinate) && hasTwo(duplicatedRemovedYCoordinate)) {
throw new IllegalArgumentException(INVALID_RECTANGLE_MESSAGE);
}
}

private Set<Coordinate> removeDuplicateCoordinate(final List<Point> points,
final Function<Point, Coordinate> extractedFunction) {
return points.stream()
.map(extractedFunction)
.collect(Collectors.toSet());
}

private boolean hasTwo(final Set<Coordinate> duplicatedRemovedCoordinate) {
return duplicatedRemovedCoordinate.size() != NUMBER_OF_DUPLICATED_COORDINATE;
}

private List<Point> points() {
return points;
}

@Override
public String figureType() {
return "사각형";
}

@Override
public double area() {
Point point = points.get(0);
Point sameXCoordinatePoint = getSameCoordinatePoint(point::hasSameXCoordinate);
Point sameYCoordinatePoint = getSameCoordinatePoint(point::hasSameYCoordinate);

Line width = new StraightLine(asList(point, sameXCoordinatePoint));
Line height = new StraightLine(asList(point, sameYCoordinatePoint));

return width.length() * height.length();
}

private Point getSameCoordinatePoint(final Predicate<Point> hasSameCoordinatePredicate) {
int startIndex = 1;

return IntStream.range(startIndex, points.size())
.mapToObj(points::get)
.filter(hasSameCoordinatePredicate)
.findAny()
.orElseThrow(() -> new IllegalStateException(INVALID_RECTANGLE_MESSAGE));
}

@Override
public boolean equals(final Object other) {
if (this == other) return true;
if (!(other instanceof Rectangle)) return false;
final Rectangle rectangle = (Rectangle) other;
return points().equals(rectangle.points());
}

@Override
public int hashCode() {
return Objects.hash(points);
}
}
60 changes: 60 additions & 0 deletions src/main/java/coordinate/domain/StraightLine.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package coordinate.domain;

import coordinate.domain.vo.Point;

import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;

public class StraightLine implements Line {

private static final int NUMBER_OF_LINE_POINTS = 2;

private static final String INVALID_NUMBER_OF_STRAIGHT_LINE_POINTS_EXCEPTION_MESSAGE = "선의 점의 개수는 2개여야 합니다";
private static final String DUPLICATE_LINE_POINTS_EXCEPTION_MESSAGE = "점 사이에 중복이 존재합니다";

private final List<Point> points;

public StraightLine(List<Point> points) {
validateNumberOf(points);
validateDuplicateOf(points);
this.points = points;
}

private void validateNumberOf(final List<Point> points) {
if (points.size() != NUMBER_OF_LINE_POINTS) {
throw new IllegalArgumentException(INVALID_NUMBER_OF_STRAIGHT_LINE_POINTS_EXCEPTION_MESSAGE);
}
}

private void validateDuplicateOf(final List<Point> points) {
Set<Point> distinctPoints = new HashSet<>(points);

if (distinctPoints.size() < points.size()) {
throw new IllegalArgumentException(DUPLICATE_LINE_POINTS_EXCEPTION_MESSAGE);
}
}

private List<Point> points() {
return points;
}

@Override
public double length() {
return points.get(0).distance(points.get(1));
}

@Override
public boolean equals(final Object other) {
if (this == other) return true;
if (!(other instanceof StraightLine)) return false;
final StraightLine that = (StraightLine) other;
return points().equals(that.points());
}

@Override
public int hashCode() {
return Objects.hash(points);
}
}
Loading