Duplicaté possible: strong>
Ajout de la méthode supplémentaire à l'interface P> blockQuote>Il y a un scénario où j'ai
interface x code>, qui a été implémenté avec mes milliers de classes. Maintenant, je veux ajouter une nouvelle méthode dans cette interfacex code>. 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 p>
3 Réponses :
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. P>
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! P>
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. P>
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! ;-)
Je créerais une extension de votre interface pour que les classes qui nécessitent les méthodes supplémentaires ... Les milliers de classes implémentent déjà si vos objets sont stockés dans une collection telle qu'un Par exemple, c'est toujours parfaitement valide ... p> Toutefois, si vous devez accéder à la nouvelle méthode du Baseinterface code>. Pour les classes qui ont besoin de la méthode supplémentaire, vous les modifiez pour implémenter extendextinterface code>. P> 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> 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
}
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.
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.] P>
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: p> si vous avez besoin de passer de vieux Objets d'interface vers de nouvelles consommateurs d'interface avec une version nulle de Ce n'est pas joli, mais gros systèmes croît généralement des bords rugueux comme ceci comme ils vieillissent. p> p> NewMethod () Code>, vous pouvez faire quelque chose comme: p>
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!
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 i> et fournissez une implémentation par défaut pour cela.