Sto sviluppando un'API con una chiamata che accetta un grande oggetto JSON.
In base a questo oggetto, esistono 10 possibili scenari di analisi, ad esempio se il campo xxxx.xxx è presente, andare con lo scenario 5.
Attualmente abbiamo circa 10 se le istruzioni in una funzione di controllo di oltre 200 linee, che decide quale scenario scegliere. La complessità ciclomatica è superiore a 5000 e la complessità di nPath è superiore a 10 milioni
Poiché non è scalabile, ho finalmente trovato il tempo di rifattorizzarlo e renderlo più liberamente abbinato
Quale sarebbe il miglior schema di progettazione possibile per questo caso?
Stavo pensando di avere più classi parser che faccio il ciclo e ognuna di esse ha una funzione chiamata canHandle ($ jsonObject), e se alcuni campi sono presenti, canHandle restituirà true e quella classe può quindi fare la sua logica.
È simile al modello di strategia?
Altro sfondo:
È uno strumento di prenotazione per i viaggi da punto a punto.
Quindi, dire che voglio viaggiare da un aeroporto a una stazione ferroviaria, il JSON avrebbe i seguenti campi:
route.pickuppoint.airport.iata
route.dropoffpoint.trainstation.id
Esistono più entità che possono esistere in pickuppoint
e dropoffpoint
(stazioni / aeroporti / indirizzi / numeri di volo) e devono essere analizzate in modo diverso nel nostro database
Quindi se qualcuno chiama l'API con un aeroporto nel pickup, devo analizzare l'aeroporto e tradurlo in un indirizzo usando alcune API esterne e inserirlo nel DB, lo stesso vale per le altre entità
Esempio di codice:
if (isset($data['Address']['Street'])) {
// Parse address
} elseif (isset($data['Location']['Latitude'])) {
// Parse Location
} elseif (isset($data['Airport']['Id'])) {
// Parse airport
} elseif (isset($data['Flight']['FlightNumber'])) {
// Resolve flight number and parse
} elseif (isset($data['Trainstation']['id'])) {
// Resolve train station
}
Come puoi immaginare, se dovessimo aggiungere più opzioni, questo codice sarebbe solo più brutto