Sto progettando una libreria di terze parti per gli sviluppatori per recuperare i dati da vari endpoint di un altro sistema che a sua volta ha più API. Ognuna di queste API può contenere lo stesso tipo di richiesta, ma restituire dati diversi, che corrispondono a una classe di richiesta con nomi dei nomi nella mia libreria:
- api1.dominio / tipo1 / schedule.json - > %codice%
- api1.dominio / tipo2 / schedule.json - > %codice%
- api2.dominio / tipo3 / schedule.json - > %codice%
Ho creato client per ogni combinazione Api / Tipo, con metodi specifici per ogni singola richiesta:
$api1Type1Client = new APi1Type1Client();
$api1Type1Client->getSchedule(new Api1/Type1/ScheduleRequest());
$api1Type2Client = new APi1Type2Client();
$api1Type2Client->getSchedule(new Api1/Type2/ScheduleRequest());
Queste chiamate racchiudono semplicemente una chiamata globale Api1/Type1/ScheduleRequest
in una classe AbstractClient da cui tutti si estendono, quindi tutti i miei metodi di richiesta sono identici:
public function getSchedule(ScheduleRequest $request, array $config = []) {
return $this->request($request, $config);
}
Questo ha alcuni vantaggi: il completamento automatico IDE, la capacità di iniettare funzionalità specifiche per richiesta se necessario e l'applicazione di suggerimenti tipo. Ho fatto un altro tentativo utilizzando un modello di facciata, con una singola classe ClientManager, in questo modo:
$cm = new ClientManager();
$response = $cm->getClient('api1.type1')->request(new Api1/Type1/ScheduleRequest());
Questo semplifica un po 'le cose per lo sviluppatore del software poiché hanno solo bisogno di conoscere il gestore e, se mai modificherò l'API in un secondo momento (cambiamenti nello spazio dei nomi, ecc.), non si romperà le versioni precedenti. Perdo la possibilità di iniettare funzionalità in richieste specifiche, ma in pratica non è stato necessario, e se necessario potrebbe probabilmente aver luogo nella classe Request stessa.
Ho fatto un tentativo di semplificare ulteriormente e ho creato un singolo client che sapeva cosa fare basandosi unicamente sulla classe di richiesta che gli hai passato:
$client = new Client();
$response = $client->request(new Api1/Type1/ScheduleRequest());
Qui tutto è astratto per lo sviluppatore - conoscono solo un client, un metodo di richiesta, e poi devono semplicemente passare la classe di richieste che vogliono e la mia biblioteca calcola il resto. Quindi due domande, tenendo presente che questa è una libreria di terze parti in corso per gli altri sviluppatori da utilizzare:
- Ha più senso avere metodi individuali per tutte le 250 richieste, o un singolo
Api1/Type2/ScheduleRequest
che sa cosa fare in base alla classe di richiesta che gli è stata passata? - Ha più senso avere un singolo cliente per ogni Api / tipo, un singolo gestore clienti o un singolo cliente?