Функция рефакторинга перегружена методами всего за один метод - PullRequest
0 голосов
/ 22 февраля 2020

В настоящее время у меня есть метод, перегружающий следующий метод:

    public boolean isHorizontalOrVertical(Point firstPoint, Point secondPoint) {
        return firstPoint.getFirstComponent() == secondPoint.getFirstComponent()
                || firstPoint.getSecondComponent() == secondPoint.getSecondComponent();
    }

    public boolean isHorizontalOrVertical(List<Point> points) {
        if (points == null || points.size() < 2) {
            throw new IllegalArgumentException("invalid number of points");
        }
        Point start = points.get(0);
        return points.stream()
                .allMatch(p -> isHorizontalOrVertical(start, p));
    }

Метод необходим для проверки , если две или три точки расположены вертикально / горизонтально друг к другу . В случае трех точек, он просто должен проверить, являются ли две последние точки горизонтальными / вертикальными относительно начальной точки.

Кто-нибудь знает, как я могу получить все это только в одном методе?

Ответы [ 4 ]

1 голос
/ 22 февраля 2020

Прежде всего, я должен отметить тот факт, что не имеет смысла, по крайней мере для меня, метод, который вычисляет, являются ли два объекта горизонтальным или вертикальным и эти объекты Очки . Как две точки могут быть горизонтальными или вертикальными?


isHorizontOrVertical - это плохое имя

Преодолевая вышесказанное, вы можете создать один метод, который вычисляет, являются ли две точки горизонтальными или вертикальными.

Измените имя isHorizontOrVertical , поскольку оно избыточно. Лучшее имя - isHor Horizontal или isVertical . Метод вернет логическое значение, поэтому, если isHor horizontal возвращает false, то он вертикальный и наоборот. Возможно, лучшим именем могло бы быть areTwoPointsHor Horizontal , но у меня возникают проблемы даже при написании этого, поскольку оно передает неправильное сообщение, но вы можете выбрать свое собственное.

Так что метод,

    public boolean isHorizontal(Point first, Point second){
        boolean sameFirstComponents = firstPoint.getFirstComponent() == 
                secondPoint.getFirstComponent();
        boolean sameSecondComponents = firstPoint.getSecondComponent() == 
                secondPoint.getSecondComponent();          
        return sameFirstComponents || sameSecondComponents;
    }

Наконец, создайте метод, который вычисляет, находится ли произвольное количество точек в списке между ними по горизонтали или вертикали (при условии , если точка A горизонтальна с точкой B, тогда, если точка C горизонтальна с B, то же самое с A ).

Oveload этот метод, поскольку он делает то же самое, и единственное, что меняется, это параметры. (Обратите внимание на использование простого isHor Horizontal метода сверху)

   public boolean isHorizontal(List<Point> points){
        boolean allPointsHorizontal = true;
        for (int i=0; i<points.size(); i++) {

            boolean nextPointExists = i<points.size() - 1;
            if (nextPointExists) {
                Point current = points.get(i);
                Point next = points.get(i+1);
                allPointsHorizontal = allPointsHorizontal && isHorizontal(current,next);

                if (!allPointsHorizontal)
                    return false;  
            }
        }

        return allPointsHorizontal;
    }
1 голос
/ 22 февраля 2020

На самом деле, вы можете использовать только один метод:

public boolean isHorizontalOrVertical(Point firstPoint, Point secondPoint, Point... others) {
    // check firstPoint, secondPoint for null is ommited
    if (others == null || others.length == 0) {
        return firstPoint.getFirstComponent() == secondPoint.getFirstComponent()
                || firstPoint.getSecondComponent() == secondPoint.getSecondComponent();
    } else {
        // First, create a stream with second point + others elements
        // then match against the first point
        return Stream.of(new Point[]{secondPoint}, others).flatMap(e -> Stream.of(e))
                .allMatch(p -> isHorizontalOrVertical(firstPoint, p));
    }

}
0 голосов
/ 22 февраля 2020

Вы можете использовать только один метод следующим образом:

public boolean isHorizontalOrVertical(List<Point> points) {
    if (points == null || points.size() < 2) {
        throw new IllegalArgumentException("invalid number of points");
    }
    if (points.size() == 2) {
       return points.get(0).getFirstComponent() == points.get(1).getFirstComponent()
                || points.get(0).getSecondComponent() == points.get(1).getSecondComponent();
    } 
    Point start = points.get(0);
    return points.stream()
                .allMatch(p -> isHorizontalOrVertical(List.of(start, p)));
}

Примечание: Если вы не используете Java версия> = 9, используйте Arrays.asList вместо List.of .

0 голосов
/ 22 февраля 2020

Метод может быть реализован следующим образом:

public boolean isHorizontalOrVertical(Point firstPoint, Point secondPoint, Point thirdPoint) {
    return isHorizontalOrVertical(Arrays.asList(firstPoint, secondPoint, thirdPoint));
}

Ваш метод isHorizontalOrVertical(List<Point>) завершится ошибкой, когда список пуст, и вызов не имеет особого смысла, когда список имеет только один элемент.

Я думаю, что лучший способ сделать это с двумя обязательными параметрами, плюс параметр c variadi, так что вызывающие абоненты должны по крайней мере дать 2 балла.

private boolean are2PointsHorizontalOrVertical(Point firstPoint, Point secondPoint) {
    return firstPoint.getFirstComponent() == secondPoint.getFirstComponent()
            || firstPoint.getSecondComponent() == secondPoint.getSecondComponent();
}

public boolean arePointsHorizontalOrVertical(Point point1, Point point2, Point... rest) {
    return are2PointsHorizontalOrVertical(point1, point2) &&
        Arrays.stream(rest).allMatch(x -> are2PointsHorizontalOrVertical(point1, x));
}

Это технически все еще "один метод" в отношении интерфейса publi c. Вы можете заменить помощника are2PointsHorizontalOrVertical обратно в метод publi c, если вы действительно хотите, но я не вижу никакой выгоды в этом.

...