Javascript: utilizzando le chiavi degli oggetti magici

3

Ho appena scritto una funzione e non sono sicuro se sia una buona idea.

La motivazione è, mi piacerebbe memorizzare alcuni dati di contabilità interna insieme con i miei dati aziendali in un grande oggetto javascript felice. Quando quell'oggetto è consumato, vorrei togliere le variabili interne. Come convenzione, le mie variabili interne assumono la forma _internalNotes mentre le variabili aziendali non iniziano con un carattere di sottolineatura.

In ogni caso, questa è la funzione. Funziona come previsto, ma è un modello terribile?

export const stripInternals = (obj) => {
  const props = {}
  Object.keys(obj).forEach(key => {
    if (key.slice(0,1) !== '_') props[key] = obj[key]
  })
  return props
}
    
posta prauchfuss 28.01.2017 - 00:59
fonte

2 risposte

4

Per prima cosa, dichiarerò la mia opinione. Questa è una cattiva idea. Molte lingue non supportano l'aggiunta / rimozione di campi come questo, e vanno d'accordo perfettamente. Ci sono anche cattive prestazioni in questo modo. In realtà, però, per me questo è solo molto hacky e si basa su regole implicite che, se violate (e possono essere facilmente violate), si tradurranno in comportamenti completamente bizzarri.

Quindi cosa dovresti fare invece?

Vuoi alcuni metadati "interni" attorno ad alcuni dati aziendali. Quindi, basta farlo: basta "convertire" i dati aziendali in un oggetto { internals: ..., business_data: ... } (oppure puoi avere i campi "interni" direttamente). La tua funzione stripInternals può quindi essere semplicemente sostituita da (obj) => obj.business_data . Questo sarà molto più esplicito e semplice e probabilmente funzionerà meglio. Se gestisci tutto il wrapping / unwrapping, questo non causerà mai sorprese, cioè funzionerà correttamente indipendentemente dai "dati aziendali".

    
risposta data 29.01.2017 - 01:02
fonte
1

Se applicato a un framework, il pattern che stai utilizzando viene generalmente chiamato Convention over Configuration . È comunemente accettato come un utile approccio per semplificare l'interazione tra il codice quadro e il codice utente (sebbene ci siano alcuni dissidenti ).

La domanda che dovresti porci, però, è se il tuo compito è veramente difficile che scrivere un codice simile a quello del framework sia effettivamente appropriato. Non c'è una cosa più semplice che potresti fare che funzionerebbe invece? Perché hai bisogno di questo codice?

    
risposta data 28.01.2017 - 06:17
fonte

Leggi altre domande sui tag