Come migliorare il codice frontend di futureproof in quanto la risposta del server si evolve?

2

Trovo che nelle prime fasi di un progetto la struttura dei dati restituiti dal server possa cambiare abbastanza frequentemente quando il modello di dati cambia.

Ad esempio, se sto creando un'applicazione che traccia le posizioni dei punti di interesse locali, potrei iniziare restituendo JSON che assomiglia a questo:

[{"name" : "Odeon", "poiType" : "cinema", "lat" : 34.4, "lon" : 10.3}, 
 {"name" : "McDonalds", "poiType" : "restaurant", "lat" : 34.5", "lon" : "10.5"}, ...]

Sul client potrei avere diversi componenti che hanno bisogno delle informazioni lat / lon e in genere accedono ai dati come segue:

function showPointsOfInterest(pois) {
    pois.forEach(function (poi) {
         var icon = getIcon(poi.poiType); 
         addToMap(poi.lon, poi.lat, icon);
     })
}

function listPointsOfInterest(pois) {
     pois.forEach(function (poi) { 
         var icon = getIcon(poi.poiType); 
         addToList(poi.lon, poi.lat, icon);
     })
}

Quindi decido che mi piacerebbe cambiare la struttura dei dati in modo che ora assomigli a

[
{
    "name": "Odeon",
    "type": "cinema",
    "location": {
        "coordinates": {
            "lat": 34.4,
            "lon": 10.3
        },
        "address": "Main St, 54"
    }
},
{
    "name": "McDonalds",
    "type": "restaurant",
    "location": {
        "coordinates": {
            "lat": 34.5,
            "lon": 10.5
        },
        "address": "Main St, 154"
    }
}, ... ]

Le modifiche sono che poiType ora è type , e lat e lon ora sono figli di location.coordinates .

Ora devo cambiare il mio codice lato client in

function showPointsOfInterest(pois) {
    pois.forEach(function (poi) {
     var icon = getIcon(poi.type);
      var coords = poi.location.coordinates; 
      addToMap(coords.lon, coords.lat, icon);
   })
}

function listPointsOfInterest(pois) {
    pois.forEach(function (poi) { 
        var icon = getIcon(poi.type);
        var coords = poi.location.coordinates;  
        addToList(coords.lon, coords.lat, icon);
    })
}

Dovendo passare attraverso il codice e trovare dove sto accedendo poiType , lat e lon può essere un dolore.

Quindi mi chiedo se sia una buona pratica creare alcune funzioni di utilità come

function getLon(poi) {
    return poi.location.coordinates.lon;
}

function getLat(poi) {
    return poi.location.coordinates.lat;
}

function getType(poi) {
    return poi.type;
}

e poi avere

function showPointsOfInterest(pois) {
    pois.forEach(function (poi) {
     var icon = getIcon(getType(poi)); 
     addToMap(getLon(poi), getLat(poi), icon);
   })
}

function listPointsOfInterest(pois) {
    pois.forEach(function (poi) { 
        var icon = getIcon(getType(poi)); 
        addToList(getLon(poi), getLat(poi), icon);
    })
}

Il vantaggio di questo approccio è che se il mio modello di dati cambia, ho solo bisogno di apportare modifiche alle mie funzioni di utilità.

È questo l'approccio migliore? Ci sono degli svantaggi nel fare questo?

    
posta user5325596 05.10.2015 - 12:00
fonte

1 risposta

2

Il solito modo è quello di eseguire la versione dell'API. La tua API risponde ancora con la vecchia struttura dati al vecchio URI. Quindi aggiungi un altro URI alla tua API con la nuova struttura dati. Quindi il codice client continua a funzionare sui vecchi dati fino a quando non si riesce a cambiarli. Questo è il modo in cui devi farlo quando hai clienti esterni a seconda della tua API.

Se sei solo un perfezionista, e quindi tieni il codice cliente in sincronia con le modifiche, puoi utilizzare qualsiasi strategia che funzioni per te. Ricorda che i dati restituiti dall'API non devono essere la versione canonica dei dati. Potrebbe essere una rappresentazione dei dati che meglio si adatta al caso d'uso. In questo caso, un oggetto piatto sembra altrettanto buono se non migliore della versione più organizzata.

    
risposta data 05.10.2015 - 17:38
fonte

Leggi altre domande sui tag