1
votes

Refactoriser les méthodes surchargées en une seule méthode

Actuellement, j'ai une méthode surchargeant la méthode suivante:

    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));
    }

La méthode est nécessaire pour vérifier si deux ou trois points sont verticaux / horizontaux entre eux . Dans le cas de trois points, il suffit de vérifier si les deux derniers points sont horizontaux / verticaux par rapport au point de départ.

Quelqu'un a-t-il une idée de la façon dont je peux tout mettre en une seule méthode?


4 commentaires

Vous pourriez utiliser des arguments variadiques, vous pourriez avoir une fonction qui prend une liste?


Oui, mais à quoi ressemblerait une méthode avec les fonctionnalités requises?


Pourquoi voudriez-vous faire ça? Je renommerais votre deuxième méthode, afin que vous puissiez la lire vérifie si tous les points de la liste sont horizontaux ou verticaux. quelque chose comme: allPointsAreHorizontalOrVertical


Quel est l'avantage d'exiger de l'appelant qu'il passe deux points sous forme de liste? Si vous ne souhaitez pas exposer la version à deux points dans une API publique, rendez simplement la méthode privée.


4 Réponses :


0
votes

La méthode pourrait être implémentée comme ceci:

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));
}

Votre méthode isHorizontalOrVertical (List ) échouera lorsque la liste est vide, et l'appel échoue Cela n’a pas beaucoup de sens quand la liste n’a qu’un seul élément.

Je pense qu’une meilleure façon de faire est d’utiliser deux paramètres obligatoires, plus un paramètre variadique, de sorte que les appelants doivent donner au moins 2 points.

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

Ceci est techniquement toujours "une méthode" en ce qui concerne l'interface publique. Vous pouvez remplacer l'aide are2PointsHorizontalOrVertical dans la méthode publique si vous le souhaitez vraiment , mais je ne vois aucun avantage à le faire.


0 commentaires

0
votes

Vous ne pouvez avoir qu'une seule méthode comme suit:

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)));
}

Remarque: Si vous n'utilisez pas la version Java> = 9, veuillez utiliser Arrays.asList au lieu de List.of .


8 commentaires

Comment return points.stream () .allMatch (p -> isHorizontalOrVertical (start, p)); est censé fonctionner quand il n'y a qu'une seule méthode mais qu'il a besoin de deux arguments?


Qu'entendez-vous par List.of (..) ?


@EugenCovaci - veuillez vérifier stackoverflow.com/questions/46579074/...


Êtes-vous sûr que l'OP utilise la version Java> = 9?


@EugenCovaci - C'est l'hypothèse. Si ce n'est pas le cas, OP fera un commentaire.


J'utilise Java 8


@ArvindKumarAvinash Merci. Serait-il préférable d'utiliser if (points.isEmpty () || ...) au lieu de if (points == null || ...) ?


Il n'est pas seulement préférable d'utiliser points == null car points.isEmpty () lancera NullPointerException si points est nul .



0
votes

En fait, vous ne pouvez avoir qu'une seule méthode:

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 commentaires

1
votes


0 commentaires