È una cattiva pratica verificare gli argomenti passati a una funzione? [duplicare]

0

Mi trovo a scrivere un sacco di funzioni per cui le prime poche righe "verificano" gli argomenti, cioè eseguono il typecast, controllano la falsità, l'intervallo, ecc. prima di fare qualsiasi lavoro. Il principale ragionamento per questo è di impedire che idioti, umani o non, passino argomenti non validi o illogici alla funzione. Un esempio in JS sarebbe questo:

function mix(red, grn, blu, anotherColor) {
  // typecast, falseness/presence
  this.red = +red || 0
  this.grn = +red || 0
  this.blu = +red || 0

  // args must be within [0, 255]
  this.red = Math.max(0, Math.min(red, 255))
  this.grn = Math.max(0, Math.min(grn, 255))
  this.blu = Math.max(0, Math.min(blu, 255))

  // if anotherColor is falsy/undefined
  anotherColor = anotherColor || {red:0, grn:0, blu:0}

  // do the actual work here
}

Un altro esempio è quando una funzione ricorsiva chiama se stessa.

function menulist(pages, depth) {
  // do some stuff

  // when done, recurse
  if (depth > 0) {
    // verify pages.sub exists
    pages.sub = pages.sub || []

    return menulist(pages.sub, depth-1)
  }
}

D'altra parte ho sentito l'opinione che questa "verifica" non dovrebbe essere fatta all'interno della funzione stessa, piuttosto, dovrebbe essere delegata ad un altro pezzo del software. In altre parole, la funzione dovrebbe essere "pura" e minima, assumendo che gli argomenti passati siano corretti. (Se questo è il caso, dove dovrebbe essere delegata la procedura di verifica?)

Quale opinione è considerata best practice nella comunità Javascript e / o nella comunità di programmazione nel suo complesso?

    
posta chharvey 29.05.2016 - 14:30
fonte

2 risposte

1

Ciò che hai fatto non è una validazione. Hai praticamente detto "Indovina cosa voleva l'utente". La convalida genererebbe un errore se si trovasse al di fuori dell'intervallo, non forzandolo casualmente all'interno dell'intervallo.

È perfettamente corretto per una funzione convalidare i suoi argomenti. Va anche bene fare ciò che hai fatto, ovvero definirli effettivamente come predefiniti. Ma queste due cose sono non uguali.

    
risposta data 29.05.2016 - 15:13
fonte
1

Passaggio 1: scrivi una specifica su cosa fa la tua funzione. Passaggio 2: lo si implementa in base alle specifiche.

La tua specifica potrebbe dire che argomenti inappropriati portano a comportamenti non definiti, o portano a un errore che viene segnalato, o vengono corretti. Ognuno va bene. Basta scrivere una specifica e seguirla.

    
risposta data 29.05.2016 - 16:15
fonte

Leggi altre domande sui tag