11
votes

Ajout d'une nouvelle méthode dans l'interface Java, ce qui implique des modifications minimales pour hériter des classes

Duplicaté possible:

Ajout de la méthode supplémentaire à l'interface

Il y a un scénario où j'ai interface x , qui a été implémenté avec mes milliers de classes. Maintenant, je veux ajouter une nouvelle méthode dans cette interface x . Donc, comment faire les changements de manière minimale pour résoudre le problème de la norme de méthodes de toutes mes classes


5 commentaires

Modifiez l'interface en une classe abstraite et fournissez une implémentation de base?


Vous avez des milliers de cours? Wow.


@Verisimilitude ne serait-elle pas cette solution créer rapidement un cauchemar de maintenance et introduit de nombreuses interfaces au système?


@verisimilitude est correct: hériter de l'interface est le moyen le plus simple et le plus propre d'aller. A MON HUMBLE AVIS...


Créez la nouvelle méthode dans l'interface comme par défaut et fournissez une implémentation par défaut pour cela.


3 Réponses :


1
votes

Il n'y a pas de moyen facile de le faire. Si vous ajoutez une méthode à l'interface, toutes les classes de mise en œuvre doivent le remplacer. Si vous modifiez l'interface en une classe abstraite, vous devez également refacturer les classes de mise en œuvre.

Mais vous avez une hiérarchie de classe droite? Vous pouvez donc minimiser les travaux en mettant en œuvre cette méthode uniquement dans les classes de base. Mais cela dépend de vos exigences et de vos détails spécifiques, je suppose donc une bonne mise en œuvre!

Et s'il n'y a pas de hiérarchie de classe facile que vous pouvez utiliser pour mettre en œuvre de nouvelles méthodes telles que celles-ci peut-être que vous pensez à une réécriture majeure en faveur de la réduction de l'effort d'entretien futur.


4 commentaires

Avez-vous lu le lien que @verisimilitude a posté dans un commentaire? Si vous ne le faites pas, veuillez le lire, cela changera votre réponse et votre point de vue.


Oui mais ne conduira pas à des problèmes d'entretien plus tôt ou plus tard? En outre, cela dépend du type de méthode introduit, si la méthode en question est quelque chose qui sera utilisé partout l'interface si elle est utilisée comme type, cette solution ne vous aidera pas beaucoup ...


Cela dépend vraiment, si vous avez un groupe, c'est-à-dire 10+, de classes et que vous voulez juste que certains d'entre eux, c'est-à-dire 2, alors il s'agira de 2 classes implémentant la nouvelle méthode et plus de 8 l'avoir sans une implémentation (assez mauvaise conception aussi). Si toutes les classes mettant en œuvre l'interface réelle doivent avoir cette nouvelle méthode, la question de l'Op sera hors de propos et je ne pense pas que l'OP a besoin de cela :).


Oui, mon point est que la solution peut travailler pour certains cas et constitue un mauvais conseil pour certains cas. Donc, la manière appropriée n'est donc pas que, à mon avis, si elle va impliquer une maintenance à long terme car la plupart des projets le font .. mais c'est juste moi .. à chacun leur propre! ;-)



15
votes

Je créerais une extension de votre interface pour que les classes qui nécessitent les méthodes supplémentaires ... xxx pré>

Les milliers de classes implémentent déjà Baseinterface code>. Pour les classes qui ont besoin de la méthode supplémentaire, vous les modifiez pour implémenter extendextinterface code>. P>

si vos objets sont stockés dans une collection telle qu'un Baseinterface [] Code > Array, cela fonctionne toujours parce que les objets de type extenduestinterface code> sont également des objets de type baseinterface code>, afin qu'ils puissent toujours être stockés dans la même collection commune. P>

Par exemple, c'est toujours parfaitement valide ... p> xxx pré>

Toutefois, si vous devez accéder à la nouvelle méthode du extendextinterface code>, mais le L'objet est stocké dans une collection BASEINTORFACE CODE>, vous aurez besoin de la jeter dans un ExtendueTorface code> avant de pouvoir l'utiliser ... p>

BaseInterface[] objects = new BaseInterface[1];
objects[0] = new ClassThatImplementsExtendedInterface();

if (objects[0] instanceof ExtendedInterface){
    // it is an ExtendedInterface, so we can call the method after we cast it
    ((ExtendedInterface)objects[0]).anotherMethod();
}
else {
    // it is a BaseInterface, and not an ExtendedInterface
}


2 commentaires

C'est la même chose que la véritruisité a déjà dit.


D'accord, mais cela est plus spécifique à l'exigence de l'utilisateur, a un exemple de codage, et à mon avis est beaucoup plus facile à comprendre que le poste lié. De plus, je viens d'être d'accord avec l'approche, alors pourquoi ne pas écrire une réponse à cet effet.



3
votes

Si la nouvelle méthode est une véritable extension de l'interface, la bonne chose à faire est d'éditer l'interface et d'utiliser les outils de votre environnement de développement pour trouver tous les endroits où la nouvelle fonctionnalité doit être mise en œuvre. Alors faites le travail. Eclipse et Netbeans feront un bon travail.

[NB Je suis un peu surpris que les outils de refactoring ne prennent pas soin de certains des efforts manuels, mais c'est donc.]

si le La nouvelle méthode ne s'appelle pas la plupart du temps dans le code ancien, considérez la nouvelle interface pour être une extension de l'ancien: xxx

si vous avez besoin de passer de vieux Objets d'interface vers de nouvelles consommateurs d'interface avec une version nulle de NewMethod () , vous pouvez faire quelque chose comme: xxx

Ce n'est pas joli, mais gros systèmes croît généralement des bords rugueux comme ceci comme ils vieillissent.


2 commentaires

Il ressemble à WATTO Studios et j'ai la même idée. Heureux de supprimer si ce n'est pas utile.


Gardez votre message - vous avez une approche différente avec les wrappers - je n'avais pas pensé à cela!