Disclaimer: avvolgo il middleware della mia azienda ...
Ci sono più reclami qui, quindi li affronterò separatamente.
Wrapping also makes it easier to mock out third-party calls when you are testing your own code.
Ci sono molti vantaggi qui, in particolare quando il mocking conteggio aiuta il numero di chiamate. Alcuni sosterranno che il numero di chiamate non è funzionale e quindi non dovrebbe essere testato; tuttavia ho visto persone introdurre modifiche che hanno moltiplicato il numero di chiamate di un fattore di 10x o 100x e le implicazioni sulla performance non sono banali. Questo è particolarmente vero quando ...
... alcune librerie di terze parti sono dotate di molte dipendenze (connessione di rete, complicato file di configurazione) e solo per derisione puoi facilmente inserire errori, tra le altre situazioni specifiche che desideri testare.
Naturalmente, a questo punto, il wrapping è più giù per sbarazzarsi di una dipendenza indesiderata (connessione, file di configurazione) di qualsiasi altra cosa.
..In fact, wrapping third-party APIs is a best practice. When you wrap a third-party API, you minimize your dependencies upon it: You can choose to move to a different library in the future without much penalty.
Questo dovrebbe andare di pari passo con il principio DRY e con l'astrazione.
Quando si chiama una libreria di terze parti per analizzare un documento XML, spostarsi per estrarre alcune parti di dati, il chiamante:
- non è interessato a quale libreria di terze parti utilizzi
- probabilmente non è interessato alla struttura del documento XML
come risultato, lo avvolgeremo in un codice tutto tuo, che ha il duplice vantaggio di elevare il livello di astrazione (non è un documento XML, è una richiesta per comprare 4 gelati alla vaniglia, con caramello in cima) .
Se decodifichi ripetutamente i documenti XML, abbastanza rapidamente naturalmente fonderà parti del codice di decodifica che si presentano ripetutamente. Questo è solo ASCIUTTO.
Di conseguenza, trovo che il wrapping di componenti di terze parti sia naturale: ogni volta che uso la stessa chiamata due volte o tre volte, tendo ad estrarre il codice in una funzione comune, che in qualche modo diventa un wrapper.
(unasked question about boundaries and business model)
Un'API di terze parti è straniera, non parla la tua lingua.
C'è un confine tra il tuo codice e il codice di terze parti: usi oggetti diversi. Ad esempio, è possibile modellare il server come stringa (IPv4) e intero (porta), ma l'API sottostante prevede solo una stringa (IPv4: porta) o viceversa. Di conseguenza, è necessario applicare una trasformazione quando si parla con questa API estera.
Idealmente, vuoi massimizzare la quantità di codice che si occupa dei tuoi dati:
- lo capisci
- tu lo controlli (gli invarianti sono controllati e significativi per la tua app.)
- ...
ciò richiede di spingere i limiti del codice straniero il più lontano possibile.
Inoltre, poiché ogni traduzione comporta il proprio rischio di impedenza di mancata corrispondenza, si desidera ridurre il numero di posizioni nel codice in cui si verifica tale traduzione.
In entrambi i casi, ciò implica un sottile strato tra il codice dell'applicazione e le API di terze parti.