Je fais actuellement partie d'un projet où il y a une interface comme ceci:conseil refactorisation: cartes à POJO
public interface RepositoryOperation {
public OperationResult execute(Map<RepOpParam, Object> params);
}
Cette interface a environ ~ 100. Implémenteurs
Pour appeler un implémenteur il faut faire ce qui suit:
final Map<RepOpParam, Object> opParams = new HashMap<RepOpParam, Object>();
opParams.put(ParamName.NAME1, val1);
opParams.put(ParamName.NAME2, val2);
Maintenant, je pense qu'il ya évidemment quelque chose de mal à quoi que ce soit avec une déclaration générique <Something, Object>
.
Actuellement, l'appelant d'un OperationImpl
doit réellement lire le code de l'opération pour savoir comment créer la table d'arguments. Après quelques discussions, j'ai réussi à convaincre mes collègues de me laisser refaire.
Il me semble que le plus simple « solution » serait de changer l'interface comme ceci:
public interface RepositoryOperation {
public OperationResult execute(OperationParam param);
}
Après toutes les opérations concrètes définiront (étendre) leur propre OperationParam et les arguments nécessaires seraient visibles à tous. (Ce qui est la « voie normale » de faire des choses comme ça à mon humble avis)
Alors que je vois depuis les implémenteurs d'interface sont assez nombreux, j'ai plusieurs choix:
Essayez de changer l'interface et réécriture tous les appels de l'opération pour utiliser des objets au lieu de cartes. Cela semble le plus propre, mais je pense que puisque les opérations sont nombreuses, cela peut être trop de travail dans la pratique. (~ 2 semaines avec des tests probablement)
Ajouter une méthode supplémentaire à l'interface comme ceci:
public interface RepositoryOperation { public OperationResult execute(Map<String, Object> params); public OperationResult execute(OperationParam params); }
et fixent les appels carte à chaque fois que je tombe sur eux pendant la mise en œuvre de la fonctionnalité.
Vivez avec (s'il vous plaît non!).
Donc ma question est.
Quelqu'un trouve-t-il une meilleure approche pour 'corriger' les cartes et si vous le faites, corrigez-les avec la méthode 1 ou 2 ou ne les corrigez pas du tout.
EDIT: Merci pour les bonnes réponses. J'accepterais les réponses de Max et de Riduidel si je le pouvais, mais puisque je ne peux pas, je me penche un peu plus vers Riduidel.
Une solution géniale, merci beaucoup. Je vais laisser cela pour "s'attarder" dans mon esprit pendant quelques heures :) – Simeon