Supposons que vous ayez un grand projet pris en charge par une base d'API. Le projet fournit également une API publique que les utilisateurs finaux (ish) peuvent utiliser.
Parfois, vous devez apporter des modifications à la base d'API qui prend en charge votre projet. Par exemple, vous devez ajouter une fonctionnalité nécessitant une modification de l'API, une nouvelle méthode ou nécessitant la modification de l'un des objets ou du format de l'un de ces objets, transmis vers ou depuis l'API.
En supposant que vous utilisez également ces objets dans votre API publique, les objets publics changeront également chaque fois que vous le ferez, ce qui n'est pas souhaitable car vos clients peuvent compter sur les objets API restant identiques pour que leur code d'analyse fonctionne. (tousser les clients C ++ WSDL ...)
Une solution potentielle consiste donc à mettre à jour l'API. Mais lorsque nous disons «version» de l'API, il semble que cela doit également signifier la version des objets API ainsi que la fourniture d'appels de méthode en double pour chaque signature de méthode modifiée. J'aurais donc un simple vieil objet clr pour chaque version de mon api, ce qui semble encore une fois indésirable. Et même si je fais cela, je ne construirai sûrement pas chaque objet à partir de zéro, car cela aboutirait à de grandes quantités de code dupliqué. Au contraire, l'API est susceptible d'étendre les objets privés que nous utilisons pour notre API de base, mais nous rencontrons ensuite le même problème car des propriétés ajoutées seraient également disponibles dans l'API publique lorsqu'elles ne sont pas censées l'être.
Alors, quel est le bon sens qui est généralement appliqué à cette situation? Je connais de nombreux services publics tels que Git pour Windows maintient une API versionnée, mais j'ai du mal à imaginer une architecture qui prend en charge cela sans de grandes quantités de code en double couvrant les différentes méthodes versionnées et les objets d'entrée / sortie.
Je suis conscient que des processus tels que le versioning sémantique tentent de mettre un certain sens sur le moment où des ruptures d'API publiques devraient se produire. Le problème est plus qu'il semble que beaucoup ou la plupart des changements nécessitent de casser l'API publique si les objets ne sont pas plus séparés, mais je ne vois pas un bon moyen de le faire sans dupliquer le code.
I don't see a good way to do that without duplicating code
- Votre nouvelle API peut toujours appeler des méthodes dans votre ancienne API, ou vice versa.