Come gestire gli argomenti extra in una libreria JavaScript?

0

JavaScript è l'unica lingua in cui sono arrivato che consente elenchi di argomenti di lunghezza variabile per impostazione predefinita. Un caso in cui sarebbe utile rilevare troppi argomenti sarebbe Componente aggiuntivo di Mozilla Casi di test dell'SDK .

Per verificare se due valori sono uguali, scrivi

assert.equal(3, 4, "error message");

Se si voleva scrivere uguale, ma invece si è scelta la funzione ok(truthVal, "message") , si testerebbe un valore di verità come

assert.ok(3, 4, "error message");

e questo test sarebbe passato. Se la libreria controllasse automaticamente il numero di argomenti, (come f.ex. Python, Java, C, C ++, ...), potrebbe avvisarti su cosa è un comportamento inatteso il 99% delle volte.

  1. Perché questo non viene eseguito di default? Esiste un uso di varags predefiniti (rispetto a quanto afferma esplicitamente che una funzione richiede un numero variabile di argomenti)?

  2. Avrebbe senso implementarlo nelle librerie comuni in modo che meno utenti si sparino al piede?

posta serv-inc 27.04.2016 - 15:54
fonte

1 risposta

2

Why is this not done by default?

Per qualche ragione, non è stato fatto nelle prime versioni della lingua che ora conosciamo come Javascript. Sfortunatamente, cambiandolo ora si rompono tonnellate di codice esistente, quindi siamo bloccati con esso.

Perché non rendere questo un "errore di attivazione" come una modalità rigorosa? Probabilmente perché la modalità rigorosa si concentra su un piccolo insieme di tipi di errori più insidiosi causati da difetti di progettazione di Javascript, come x = 2 che crea implicitamente proprietà sull'oggetto globale. I bug relativi ai vararg sono fastidiosi, ma non sono mai stati vicini alla parte più fastidiosa della lingua.

Anche perché è molto difficile da implementare. Poiché le funzioni sono valori di prima classe, non c'è nulla che ti impedisca di sostituire una funzione a due argomenti con una funzione a tre argomenti in fase di esecuzione. Se volessimo che il linguaggio imponga il conteggio degli argomenti corretto in tutti i siti di chiamata, dovrebbe iniziare ogni chiamata di funzione in avvio chiedendo alla funzione quanti argomenti attualmente richiede. È probabile che si tratti di un problema di prestazioni e non ti proteggerà da tutto ciò di cui non puoi già proteggerti.

Perché è stato così nei primi tempi? Nessuna idea. Se dovessi indovinare, direi perché questo riduce il numero di cose di cui l'interprete deve tenere traccia.

Is there any use of default varags (in comparison to explicitly stating that a function takes a variable number of arguments)?

Anche "varargs predefiniti" lo sta sottovalutando. Tutte le funzioni sono variadiche, non importa quale. Non puoi nemmeno rinunciarvi. Puoi scegliere di lanciare un errore in fase di esecuzione se non ti piacciono gli argomenti con i quali sei stato chiamato.

Poiché molto meno del 100% delle funzioni del mondo reale richiedono un numero variabile di argomenti, è sicuramente una disfunzione.

Would it make sense to implement this in common libraries so that less users shoot themselves in the foot?

Se ti stai chiedendo se la tua libreria di affermazione debba far valere il conteggio dei suoi argomenti, ciò dipende da molte cose. Ma ce n'è uno in particolare che credo valga nel tuo esempio: assert.ok () potrebbe anche cogliere quell'errore controllando i tipi di argomenti che si aspetta di ottenere (cioè, il secondo argomento dovrebbe essere una stringa), e che probabilmente porterebbe comunque a un messaggio di errore migliore.

In genere preferirei concentrarmi sulla convalida degli argomenti che ti aspetti di ottenere. Anche il controllo esplicito del numero di argomenti non danneggerà, ma sicuramente non è necessario e probabilmente non è mai la priorità assoluta. Se hai diversi argomenti dello stesso tipo o potenzialmente qualsiasi tipo in una riga, in modo tale che i tipi di controllo da soli non lo rilevino, che in genere indica un'API mal progettata piuttosto che una necessità di controllo del conteggio degli argomenti.

    
risposta data 28.04.2016 - 02:17
fonte

Leggi altre domande sui tag