Supponiamo che tu abbia un grande progetto supportato da una base API. Il progetto include anche un'API pubblica che può essere utilizzata dagli utenti finali (ish).
A volte è necessario apportare modifiche alla base dell'API che supporta il tuo progetto. Ad esempio, devi aggiungere una funzione che richiede una modifica dell'API, un nuovo metodo o richiede la modifica di uno degli oggetti o il formato di uno di questi oggetti, passati ao dall'API.
Supponendo che tu stia utilizzando questi oggetti anche nella tua API pubblica, anche gli oggetti pubblici cambieranno ogni volta che lo fai, il che è indesiderabile dato che i tuoi client potrebbero fare affidamento sugli oggetti API che restano identici per il loro codice di analisi. (tossire client C ++ WSDL ...)
Quindi una soluzione potenziale è la versione dell'API. Ma quando diciamo "versione" dell'API, sembra che questo debba significare anche la versione degli oggetti API oltre a fornire chiamate di metodo duplicate per ogni firma di metodo modificata. Quindi avrei quindi un semplice oggetto clr vecchio per ogni versione della mia api, che di nuovo sembra indesiderabile. E anche se lo faccio, sicuramente non costruirò ogni oggetto da zero in quanto finirebbe con grandi quantità di codice duplicato. Piuttosto, è probabile che l'API estenda gli oggetti privati che stiamo usando per la nostra API di base, ma poi ci imbattiamo nello stesso problema perché le proprietà aggiunte sarebbero anche disponibili nell'API pubblica quando non dovrebbero esserlo.
Quindi, qual è il buon senso che viene solitamente applicato a questa situazione? So che molti servizi pubblici come Git per Windows mantengono un'API con versione, ma ho difficoltà a immaginare un'architettura che supporti questo senza grandi quantità di codice duplicato che copre i vari metodi di versione e oggetti di input / output.
Sono a conoscenza del fatto che processi come la versione semantica tentano di mettere un po 'di equilibrio su quando interruzioni API pubbliche dovrebbero verificarsi. Il problema è che sembra che molte o molte modifiche richiedano la rottura dell'API pubblica se gli oggetti non sono più separati, ma non vedo un buon modo per farlo senza duplicare il codice.