Dire che ho una funzione il cui primo parametro viene utilizzato in modo diverso a seconda di quanti argomenti vengono passati. In questo caso, è più semplice elaborare l'oggetto arguments
nel suo insieme all'interno della definizione della funzione invece di dare al parametro un nome esplicito da trattare che potrebbe essere semanticamente non corretto a seconda di quanti argomenti ci sono, e quindi dover correggilo dopo il fatto. Tuttavia, dopo aver definito la funzione, desidero la sua proprietà length
per indicare che richiede almeno un argomento.
Un punto nel caso la seguente funzione:
function validateSlice() {
const range = [...arguments].map(Number)
if (range.length < 1 || 3 < range.length) {
throw new TypeError('expected between 1 and 3 arguments')
}
if (range.some(isNaN)) {
throw new TypeError('arguments must be numeric')
}
switch (range.length) {
case 1: return [0, ...range, 1]
case 2: return [...range, 1]
case 3:
if (range[2] === 0) {
throw new RangeError('slice step cannot be zero')
}
return range
}
}
Si suppone che restituisca un array di length === 3
contenente [start, stop, step]
, ma il primo argomento potrebbe essere stop
o start
a seconda di quanti argomenti vengono passati.
La mia preoccupazione è che il controllo di validateSlice.length
restituisca 0
poiché nella definizione non ci sono parametri con nome, ma questo è semanticamente scorretto. Nella convenzione JavaScript, questa proprietà indica la quantità minima di argomenti richiesti per la funzione. Tuttavia, è complicato dover fare qualcosa del genere:
Object.defineProperty(validateSlice, 'length', { configurable: true, value: 1 })
E fornire un parametro denominato inutilizzato sembra superfluo o addirittura fuorviante per la manutenzione (e alcune condizioni di sfilacciamento), e per il motivo sopra riportato, dato che il suo utilizzo dipende dalla quantità di argomenti passati.
Come si risolve normalmente questo problema?