Je développe une application qui compare des fichiers. J'ai décidé d'utiliser le modèle de conception de stratégie, pour gérer différents formats, j'ai donc quelque chose comme ceci:

public class Report {
   CompareStrategy strategy;
   ...
}


public interface CompareStrategy {
   int compare(InputStream A, InputStreamB);
}

Ensuite, naturellement, j'implémente la méthode de comparaison pour différents formats de fichiers.

Supposons maintenant que je veuille ajouter une autre méthode, qui traite de certaines restrictions pour la comparaison (par exemple, omettre une ligne dans le cas d'un fichier Excel ou csv, ou omettre un nœud en XML).

Serait-il préférable de:

  1. Ajouter une autre méthode à l'interface et à chaque implémentation (il y en a peu pour le moment)
  2. Ecrire une nouvelle interface qui hérite de CompareStrategy puis l'implémenter?

La deuxième question est la suivante: puisque les différences peuvent être de différents types - serait-il correct de créer une différence d'interface de marqueur pour activer quelque chose comme:

int compareWithDifferences(..., Iterable<Difference> differences);

Puis continuer à définir ce que signifie une différence pour le format de fichier spécifique?

4
DCzo 1 août 2017 à 10:06

2 réponses

Meilleure réponse

Supposons maintenant que je veuille ajouter une autre méthode, qui traite de certaines restrictions pour la comparaison (par exemple, omettre une ligne dans le cas d'un fichier Excel ou csv, ou omettre un nœud en XML).

Il semble que vous ayez besoin du modèle de modèle

Vous pouvez créer une classe abstraite comme

public abstract class XMLCompareStrategy implements CompareStrategy {

    public int compare(InputStream A, InputStreamB) {
        // several steps
        customMethod(...);
        // more steps
    }

    protected abstract ... customMethod(...);

}

De cette façon, vous pouvez créer plusieurs classes qui ont la fonctionnalité principale ou principale et fournir des détails personnalisés pour chaque situation

4
Pelocho 1 août 2017 à 07:15

Je pense que vous devriez peut-être écrire une autre interface qui hérite de CompareStrategy. Comme ça si vous avez besoin de compareWithDifferences() vous pouvez, mais vous n'avez pas besoin d'utiliser cette interface, vous pouvez toujours utiliser la plus simple sans aucune différence.

Comme l'a dit Jonathan, si vous pouvez prévoir les difficultés, préparez-vous. Dans ce cas, je pense que vous devriez vous préparer. En effet, cela ne vous coûtera pas beaucoup de temps pour créer une autre interface et vous n'aurez pas à refactoriser plus tard.

0
GhostCat 1 août 2017 à 07:23