8

Qualunque compressore si occupa della rimozione dei casi di interruttori che non vengono richiamati da nessuna parte nell'applicazione?Eliminazione del codice guasto da casi di commutazione in JavaScript

function execute_case(id) { 
    switch(id) { 
    case 0: 
     console.log("0"); 
     break; 
    case 1: 
     console.log("1"); 
     break; 
    case 2: 
     console.log("2"); 
     break; 
    case 3: 
     console.log("3"); 
     break; 
    default: 
     console.log("default"); 
     break; 
    } 
} 

execute_case(1); 

Se quanto sopra è tutto quello che ho, quindi teoricamente casi 0,2,3 sono codice morto e non verrà mai eseguita. Qualche compressore ha l'intelligenza di rimuovere questo codice quando si minimizza il codice?

Sto dando un'occhiata a un pezzo di codice che contiene oltre 200.000 casi in un'istruzione switch e quindi la domanda.

Grazie, -Vikrant

+0

per questo devi sporcarti le mani con la roba per la raccolta dei rifiuti. Direi ... goditi la codifica –

+5

Ho esitato a chiedere, ma, 200K case statement? WTF? –

+0

Non c'è modo per il compilatore di sapere che la linea in basso è l'unico posto in cui la funzione verrà mai chiamata. Potresti caricare qualche altro file JS in un secondo momento e potrebbe avere una chiamata alla funzione, con un parametro diverso. – Barmar

risposta

3

No Sir,

Come id è una variabile, senza compressore saranno "sapere" che questo non può accadere. I compressori non analizzano i valori delle variabili nelle istruzioni switch e sanno come rimuoverli.

Se "conosci" questi casi non succederanno, rimuovili da soli.

+0

infatti, troppi "what-ifs" per garantire che un caso non venga colpito (cosa succede se ha passato una variabile, cosa succede se quella variabile proviene da una chiamata AJAX, cosa succede se la matematica è implicata, cosa succede se ...) –

+0

Una istruzione di comando, Brad. Spero che l'OP ascolti. –

+1

Penso che si aspetti che il compilatore si accorga che la funzione viene richiamata da un unico punto e che il luogo ha un parametro costante, quindi può fare propagazione costante nella definizione della funzione. – Barmar

3

Nulla ti fornirà definitivamente un elenco di dichiarazioni di casi morti. Se dice che può o non c'è possibilità di un altro valore (branching di codice finito) o sta mentendo. Quindi, se non conosci tutti i possibili valori che possono essere passati a execute_case, sarai al buio. (E presumo che tu non abbia dato la domanda).

Cosa si può do è inserire un piccolo logger in quel codice che emette/registra i valori passati a tale interruttore. Quindi, oltre [una buona quantità di] tempo e/o diverse migliaia di esecuzioni, traccia quali sono stati colpiti e quali no. Non rimuoverò necessariamente quelli che non vengono colpiti, ma forse cercherò di deprecarli e aspettare una durata più lunga/più esecuzioni finché non giungerai alla conclusione che non è più necessario.

+0

beh, in questo caso, ho un modo per trovare tutte le chiamate possibili. Nessuna chiamata dinamica qui. Tutti sono invocazioni dirette con lo switch ID esplicitamente un numero. Quindi, mi costerà un grep | uniq per ottenere tutti i casi validi. Ma il set è ancora molto grande (200K) da rimuovere manualmente. e c'è anche il pericolo che se qualcosa che non viene usato oggi venga usato domani a causa di qualcosa di nuovo che aggiungiamo, allora dovremo rifarlo. il minificatore si sarebbe preso cura di tutto questo. può essere un minificatore con un caso speciale (--strict_case_minification per tali casi) – v2b