Supponiamo di avere un grande progetto supportato da una base API. Il progetto inoltre fornisce un'API pubblica che gli utenti finali possono usare.
A volte è necessario apportare modifiche alla base API che supporta il progetto. Ad esempio, è necessario aggiungere una funzione che richiede una modifica dell'API, un nuovo metodo o che richiede l'alterazione di uno degli oggetti o il formato di uno di quegli oggetti, passati a o dall'API.
Supponendo che si stiano utilizzando anche questi oggetti nell'API pubblica, anche gli oggetti pubblici cambieranno ogni volta che lo si fa, il che è indesiderabile poiché i client possono fare affidamento sugli oggetti API che rimangono identici perché il loro codice di analisi funzioni. (tosse client C ++ WSDL ...)
Quindi una potenziale soluzione è la versione dell'API. Ma quando diciamo "versione" dell'API, sembra che questo significhi anche la versione degli oggetti API oltre a fornire chiamate di metodo duplicate per ogni firma del metodo modificata. Quindi avrei un semplice oggetto clr per ogni versione del mio API, che di nuovo sembra indesiderabile. E anche se lo faccio, sicuramente non costruirò ogni oggetto da zero in quanto ciò finirebbe con enormi quantità di codice duplicato. Piuttosto, è probabile che l'API estenda gli oggetti privati che stiamo usando per la nostra API di base, ma ci imbattiamo nello stesso problema perché le proprietà aggiunte sarebbero anche disponibili nell'API pubblica quando non dovrebbero esserlo.
Quindi qual è la sanità mentale che viene solitamente applicata 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 enormi quantità di codice duplicato che copre i vari metodi con versione e oggetti di input / output.
Sono consapevole del fatto che processi come il controllo delle versioni semantico tentano di migliorare la sanità mentale quando si verificano interruzioni dell'API pubblica. Il problema è più che sembra che molte o la maggior parte delle 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.
I don't see a good way to do that without duplicating code
- La tua nuova API può sempre chiamare metodi nella tua vecchia API o viceversa.