2009-02-25 8 views
2

Quelles sont les directives les plus importantes à suivre si vous devez interrompre une interface dans une application .NET? Comment ces directives changent-elles avant et après le déploiement de votre application?Briser une interface

Je sais qu'il y a d'autres questions qui débattent du moment où/où les interfaces devraient être utilisées, mais je ne veux pas entrer dans cela. Je veux juste connaître quelques approches efficaces pour atténuer les effets sur le reste de votre application lorsque vous avez besoin de le faire.

Si j'ajoute juste de nouvelles méthodes à une interface, est-ce que seulement les implémenteurs auront besoin d'une modification/recompilation, alors que tous les clients continueront à fonctionner sans heurts et sans changement?

Qu'en est-il des méthodes de renommage et des variables, est-ce que cela va jamais casser une interface?

Une recommandation forte que j'ai rencontrée dans le passé est "ne jamais casser une interface". Mais cela ne produit-il pas un design désordonné tel que IDocument, IDocument2, IDocument3, IDocument4, IDocument5, IDocument6 etc, comme vu dans la bibliothèque COM mshtml?

Répondre

4

Cela dépend du contrat (implicite ou explicite) avec les consommateurs de votre interface.

Si tous les consommateurs sont recréés lorsque vous reconstruisez l'interface puis gestion change, il est simple, il suffit de changer et corriger toutes les pauses (fixant les pauses se peuvent être complexes). Si vous vous attendez à ce que les consommateurs recompilent à chaque fois que vous libérez une nouvelle bibliothèque/application, vous devrez leur fournir une assistance pour indiquer quels changements sont requis, comment vous gérez cela dépend du moment où le changement peut se produire. maintenir les anciennes fonctions/propriétés. Si vous pouvez alors utiliser judicieusement [Obsolete ("Utiliser la nouvelle méthode Blah à la place", false)] dans au moins une version suivie de [Obsolete ("...", true)] dans la prochaine version, vous obtiendrez une migration propre chemin

Si vous tentez de maintenir la compatibilité binaire, les attributs Obsolète permettent cela tout en empêchant les utilisateurs d'utiliser la fonctionnalité obsolète lors de la recompilation. Si votre contrat implique que la compatibilité binaire et source doit être maintenue pendant, disons 5 ans (une courte période de temps pour les API de plate-forme OS), alors vous n'avez pas d'autre choix que d'aller avec une toute nouvelle interface, en ajoutant des méthodes pour une interface va casser le code en l'implémentant (soit à la compilation, à la validation de type ou à l'invocation de la méthode en fonction de la rigueur du chargeur de type).

1

Cela dépend certainement de la technologie. Dans COM (lorsque vous n'utilisez pas la liaison retardée IDispatch), vous pouvez ajouter de nouvelles méthodes en toute sécurité à la fin de l'interface, mais vous ne pouvez pas supprimer ou permuter des méthodes existantes sans modifier le GUID de l'interface. Même chose pour Microsoft RPC. Les clients plus âgés peuvent toujours être heureux en utilisant l'interface comme si elle avait seulement les méthodes qu'ils connaissent.

+0

Merci pour la réponse. J'ai décidé de me concentrer sur la plate-forme .NET car ma question était probablement un peu trop large. – Ash

Questions connexes