Dovrebbe / Quando creare un oggetto javascript per serializzare i dati?

0

Sto lavorando su un'applicazione React / Redux. Ricevo un oggetto dati dall'api che assomiglia a questo:

const dataObj = [
  {
    id: 1,
    name: "Filo",
    activity: 9,
    info: {
      statusCode: 4
    }
  },
  {
    id: 2,
    name: "Spot",
    activity: 8,
    info: {
      statusCode: 2
   }
 }
];

Devo eseguire i dati attraverso una serie di funzioni condizionali per creare elementi dom in diversi punti come questo:

const getElementsIcons = dog => {
    const elementData = []

    elementData.push({...})

    if (dog.info.statusCode === ADOPTED_ID) {
        elementData.push({...})
    }
    if (dog.info.statusCode === PENDINGID) {
        elementData.push({...})
    }
    if (dog.info.statusCode === PENDING_ID && dog.activity === OTHER_VALUE) {
        elementData.push({...})
    }

    return elementData
}

Tuttavia, ha senso avere questa logica condizionale in linea sopra, o dovrei creare una "classe" in questo modo:

function Dog(data) {
  this.name = data.name;
  this.isAdopted = data.statusCode === ADOPTED_ID;
  this.otherCondition =
    data.statusCode === PENDING_ID && data.activity === OTHER_VALUE;
}

Quindi gestisci i dati modificati in tutta l'applicazione?

Se ha senso creare una classe, dovrei farlo quando normalizzo i dati dalla chiamata api dove li memorizzo in redux, o più tardi quando lo passo al componente react che consuma i dati?

    
posta mtmoran 12.12.2018 - 20:10
fonte

2 risposte

1

Se javascript fosse un puro linguaggio di programmazione orientato agli oggetti, ti avrei raccomandato di creare un oggetto per incapsulare i dati con il comportamento, poiché è lo scopo stesso di OOP. In questo modo, tieni isolate le mutazioni applicate ai tuoi oggetti.

Tuttavia, javascript è anche un linguaggio di programmazione funzionale. Nel linguaggio di programmazione funzionale, facciamo l'opposto, separiamo i dati dai comportamenti per favorire la composizione delle funzioni. Ma per evitare le insidie di un modello di dominio anemico , dovresti assicurarti l'immutabilità dei tuoi oggetti, per evitare mutazioni accidentali .

Tutto sommato, non ti consiglierei di creare una classe specifica come meccanismo di incapsulamento, ma di usare invece un modulo, qualcosa del genere:

// in /some/path/dog.js

const Dog = (theDogData) => {
  const isAdopted = data.statusCode === ADOPTED_ID;
  const otherCondition = data.statusCode === PENDING_ID && data.activity === OTHER_VALUE;
  return Object.freeze({
    isAdopted,
    otherCondition,
  });
}

module.exports = {
  Dog,
};

L'uso del modulo al posto di Class ti lascia solo require metodo individuale senza essere legato a un oggetto reale. Quindi se vuoi che Dog sia in grado di fare qualcosa che molti Animal s possono fare (come mangiare), puoi richiedere questa funzione dal modulo Animal . Facendo così, se in seguito hai bisogno di un animale che, per qualsiasi motivo, non ti serva per poter "mangiare", non devi richiedere questo metodo. Questo ti protegge dal problema Gorilla / Banana e dal problema della classe base fragile. Posso solo suggerirti di saperne di più su questo eccellente post Composizione sull'eredità da Mattias Petter Johansson. È molto ben spiegato!

    
risposta data 17.12.2018 - 11:57
fonte
0

Generalmente, date due o più cose che funzionano insieme, pensate di creare un oggetto per incapsulare quell'interazione. Penso che sia il caso qui - dataObj oggetti producono Dog oggetti che sono usati per creare elementData (elementi DOM).

should I do this when I normalize the data from the api call where I store it in redux, or later on when I pass it to the react component that consumes the data?

Generalmente i dati grezzi vengono meglio convertiti in primo piano in oggetti "contesto dominio problematico". Pertanto il codice dell'applicazione è totalmente inconsapevole dei dati grezzi di per sé.

La conversione dei dati dovrebbe idealmente essere un oggetto e, a seconda della complessità di tale conversione, utilizza uno o più altri oggetti (come Dog ).

Stai creando Dog oggetti per contenere tutte delle informazioni di un dato cane come derivate dal% raw di% co_de. Quindi calcola anche "quale elemento DOM".

    
risposta data 13.12.2018 - 08:33
fonte

Leggi altre domande sui tag