web-dev-qa-db-fra.com

Question d'entrevue - Ajout de la méthode à l'interface mise en œuvre par des milliers de classe

Il y a un scénario où j'ai une interface X, qui a été mise en œuvre avec mes milliers de cours. Maintenant, je veux ajouter une nouvelle méthode dans cette interface X. Donc, comment apporter les changements de manière minimale pour résoudre le problème de la transmission des méthodes de toutes mes classes.

Veuillez ne pas ajouter de méthodes par défaut de Java 8 dans les réponses.

3
Atul

La première chose que j'essaierais dans cette situation est d'éviter un changement d'interface. Vous pouvez ajouter une interface étendue, dérivée de l'original, avec la nouvelle méthode ajoutée et rendre le code qui tilise cette interface associée à la nouvelle méthode qui s'attend à obtenir un objet de type "extendinterinterface" .

Si cela n'est pas possible, par exemple parce que le code en jeu est en dehors de votre contrôle, vous pouvez ajouter une classe abstraite avec une implémentation par défaut pour la nouvelle méthode dans la hiérarchie d'héritage entre l'interface et toutes les dérivations. Même pour des milliers de classes, les modifications nécessaires dans la base de code peuvent probablement être fabriquées dans quelques heures avec une recherche/remplacement globale, ou en créant un petit programme de script ou d'assistant, avec un faible risque de rupture de quelque chose.

Laquelle de ces approches dépend mieux de la partie de la base de code que vous êtes effectivement autorisée à changer et de quoi signifie réellement "une manière minimale".

12
Doc Brown

Le commentaire est correct si vous avez vraiment des milliers de classes et aucune classe de base commune, c'est une odeur de code qui devrait être résolue en premier. Classes qui partagent une interface commune mais aucun code que ce soit devrait être rare.

Sinon, utilisez un outil. Resharper pour C # Par exemple vous donnera une option pour mettre en œuvre cette méthode dans toutes les classes qui implémentent l'interface. Ce n'est évidemment qu'une partie du travail à faire, mais au moins elle compile toujours. Pour les milliers de cours, je suppose que la rédaction de votre propre outil viendrait toujours en avant de le faire manuellement.

2
nvoigt

C'est une pratique que j'ai vue dans l'industrie.

  • Ils créent une nouvelle interface avec un numéro ajouté, par exemple Interface2 et faire cela contient des méthodes dans l'ancienne interface.
  • Rendre l'ancienne interface obsolète
  • Lorsqu'il y a une refonte majeure, un nouveau paquet sera probablement ajouté dans (réfléchissez à la refonte lorsque Java JDK introduit le nouveau mécanisme de fichier et IO= en Nio). C'est le moment de supprimer le numéro de l'interface, avec une nouvelle interface dans un autre paquet

Cette approche permet de nouvelles méthodes dans l'interface, vous pouvez avoir une solution très flexible de manière à mettre en œuvre la nouvelle interface.

  • Il ne casse pas aux utilisateurs existants.
  • Il fournit une période de mémoire tampon lorsque les modifications peuvent se consolider et/ou être expérimentées avant que l'ancienne interface ne soit effectivement supprimée après une dépréciation.
1
InformedA

Il y a plusieurs problèmes à prendre en compte avant de décider de la modification du code.

Considérez le cas lorsque des tiers ont écrit du code qui utilise ou implémente cette interface. Cela augmenterait considérablement la complexité de la gestion des changements de code requis, ainsi que d'ajouter un élément politique au processus - créant des travaux (et des coûts) pour d'autres sociétés.

Comme cette interface a déjà été mise en œuvre dans de nombreuses classes est un indicateur solide contre la modification de l'interface actuelle. La conséquence sur toutes les implémentations de cette nouvelle méthode d'interface doit être prise en compte.

Le fait que toutes ces implémentations aient été achevées sans avoir besoin de cette nouvelle méthode est un indicateur d'avertissement que cela n'est peut-être pas vraiment noyau de ce but de l'interface et que cela devrait être mis en œuvre comme une nouvelle interface distincte sur la base du fait qu'il s'agit d'une nouvelle ( mais associé) utilisation de l'objet et nécessite sa propre interface.


Cela dit, en supposant que nous contrôlions tout le code qui utilise cette interface, je mettrai la nouvelle méthode dans toutes les classes de la mise en œuvre de la nouvelle méthode explicitement.

par exemple.

public class MyObject : ITheInterface
{
    public void ITheInterface.NewMethod(int age)
    {
        throw new NotImplemented("NewMethod needs to be implemented on MyObject");
    }
}

En mettant en œuvre explicitement la méthode, le code n'appelle que la nouvelle implémentation lorsqu'elle utilise une référence saisie comme Itheinterface pour l'objet.

1
Michael Shaw

Le moindre de deux maux, si vous n'êtes pas autorisé à refactuer les classes de mise en œuvre, ne doit pas ajouter la méthode à l'interface. Il n'y a pas de situation raisonnable dans laquelle vous devriez casser la compatibilité avec l'interface existante. La nouvelle méthode appartient à une nouvelle interface et toute classe à utiliser qui doit être utilisée devra mettre en œuvre la nouvelle interface. Les chances sont, pas toutes les 1 000 classes qui implémentent l'interface existante auront besoin de la nouvelle méthode, et si vous les forcez à vous retrouverez avec des tonnes de mise en œuvre vide, ce qui sera une perte de temps et d'un espace d'écran pour toute personne impliquée dans le maintien de la code.

Indépendamment de la réponse que vous finissez par donner à cette question, je voudrais sérieusement vous demander si vous souhaitez ou non travailler pour cette société. S'il s'agit d'une préoccupation commune pour eux, alors ils ne savent clairement pas ce qu'ils font. S'ils ne disposent pas de ces types de problèmes, ils gaspillent votre temps avec une question d'entretien inutile. Rien de bon ne peut venir de cela.

0
computerGuyCJ