2011-01-21 2 views
10

Mentre mi rendo conto che ogni lingua ha una propria convenzione per l'indentazione, non posso fare a meno di essere infastidita da qualcosa che ho scoperto di recente. Considera questo codice dal manuale PHP:Ritorno dell'indice PHP vs JavaScript

Si noti che ogni caso è rientrato dall'istruzione switch. Questo ha senso, poiché il codice è più facile da leggere e il corpo del blocco è contenuto un livello al suo interno.

Tuttavia, quando prova la dichiarazione equivalente JavaScript interruttore nella JSLint:

switch (i) { 
    case "apple": 
     alert("i is apple"); 
     break; 
    case "bar": 
     alert("i is bar"); 
     break; 
    case "cake": 
     alert("i is cake"); 
     break; 
} 

... visualizza un errore che mi diceva che dovrebbe apparire come questo, invece:

switch (i) { 
case "apple": 
    alert("i is apple"); 
    break; 
case "bar": 
    alert("i is bar"); 
    break; 
case "cake": 
    alert("i is cake"); 
    break; 
} 

Sembra controintuitivo, poiché ogni caso è ora in linea con il blocco dell'interruttore stesso. Non riesco a immaginare alcun motivo per cui ciò sarebbe considerato migliore, tanto meno che si innesca un errore.

JSLint è errato o segue solo la convenzione? Se quest'ultimo è vero, perché la convenzione non dovrebbe essere indentata per chiarezza?

+8

JSLint in realtà si lamenta di questo genere di cose? * -dies- * – BoltClock

+0

JS e PHP non sono Python, usa l'indentazione che ti piace. – Shikiryu

+8

Vorrei usare 'if ([" mela "," bar "," torta "]. IndexOf (i)! = -1) avviso (" i is a "+ i);';) – Gumbo

risposta

6

È il tuo codice. Formatta come vuoi. Utilizza jsLint, ma se non sei d'accordo sul fatto che i suoi consigli migliorano il tuo codice, non implementarli. jsLint ferisce i tuoi sentimenti.

+2

Esattamente. Crockford non è un Dio JS le cui regole devi obbedire, anche se sono abbastanza sicuro che ci siano alcune caselle di controllo che puoi selezionare/deselezionare per non avere avvisi/errori di spazi ristretti. –

+2

Sono d'accordo anche con questo, ma in questo caso i miei sentimenti non sono così male come sono infastiditi. Non lo considererei affatto un "errore". Inoltre, nessuna delle opzioni sembra sopprimerla. Il motivo per cui questo è un problema è dovuto al fatto che lo strumento scopre molti potenziali problemi (non essendo uno di questi) e avere un sacco di "errori" non errati rende difficile vedere quelli validi. – claviska

2

Fintanto che il tuo rientro può essere logicamente giustificato, devi indentare lo stile che preferisci. Se JSLint si lamenta davvero di ciò, è troppo pedante.

+0

Sono d'accordo. JSLint è un ottimo strumento, ma considerando una preferenza di indentazione un "errore" sembra un po 'schizzinoso, specialmente quando il codice risultante è meno chiaro. – claviska

+0

In realtà non è un ottimo strumento. È eccessivamente pazzo di cose che non fanno una differenza (solo stile, non errori); tuttavia, le cose che causano errori (ad esempio un certo tipo di perdite globali), semplicemente ignorano. JSLint è olio di serpente. –

0

È solo convenzione per JS (come JSLint definisce convenzione). Personalmente, penso che PHP sarebbe nel torto qui (non so se il manuale segue qualsiasi tipo di convenzione, so che la libreria standard non lo fa). Preferisco lo stile JS perché può diventare davvero cattivo se ci si trova in alcuni blocchi annidati. Ad esempio (codice PHP):

class Foo{ 
     function Bar($arr) { 
      foreach($arr as $item) { 
       switch ($item) { 
        case "foo": 
         // Do something 
         break; 
         // You get the idea 

In definitiva, la vostra scelta. Non userei il manuale PHP come guida di stile; se non puoi usare stili diversi per lingue diverse, usa lo stile JS ben definito.

+0

Basta impostare le schede in 2 spazi se lo spazio è limitato. – erjiang

+0

Hai dimenticato il se (is_array ($ arr)) se stai cercando di ottenere livelli stupidi di indentazione :) – GordonM

+0

@Gordon sparami ora –

1

Mentre la formattazione è importante, alla fine è la tua formattazione. Fallo come ti piace Lo stile particolare che scegli è una scelta personale e molti stili possono essere "buoni". Tuttavia, qualsiasi stile di formattazione "buono" deve essere coerente: scegli le regole che ti piacciono e rispondi a loro.

È un po 'strano per me come si dibattono i dibattiti su cose come collocare {sulla stessa riga del codice precedente o no, o "stringere parentesi graffe" attorno a uno else. Penso che solo i comunisti pongono un {sulla stessa linea della loro dichiarazione if. :)

+0

Indovina che sono un comunista: P Di nuovo, il problema è che l'attivazione di errori falsi rende è difficile vedere quelli potenzialmente validi. – claviska

+0

Finché sei un commune coerente, sei OK da parte mia. Un formatter incoerente di qualsiasi persuasione, non è bello. –

+0

abbastanza giusto per me :) – claviska

0

Gli spazi bianchi extra vengono analizzati da JavaScript e PHP quando vengono interpretati, quindi è possibile rendere il codice brutto come si desidera. Personalmente preferisco aggiungere parentesi graffe in più per le mie istruzioni switch in modo che non mi manca errori autunno-through:

switch ($someVar) 
{ 
    case 'value': 
    { 
    //your code here 
    } break; 
    case 'something': 
    { 
    //more code here 
    } 
    case 'something else': 
    { 
    //some more code here 
    } break; 
    default: 
    { 
    //default code here 
    } break; 
} 

scansione verso il basso il codice alla parentesi di fine mi permette di controllare se ho aggiunto le istruzioni break corrette . È possibile vedere che nel caso 'something' manca un'istruzione di interruzione (forse di proposito, forse un errore).

Alcuni non saranno d'accordo con questo formato, ma è proprio quello che sto ottenendo. Il formato non è poi così importante. I parser sono piuttosto indulgenti. Trova qualcosa che funzioni per te e atteniti ad esso.

4

Nel libro di Crockford, afferma che i blocchi non introducono un nuovo scopo. "JSLint si aspetta blocchi con funzioni, if, switch, while, for, do e try statements e da nessun'altra parte."

inoltre che

if (condition){ 
    statements; 
} 

è il metodo consigliato di fare blocchi; in quanto è "più resistente". Dubito fortemente che sia stato strutturato in questo modo per errore.

0

Ho trovato anche questo molto confusa, e abbiamo trovato questo motivo in convenzioni Codice di Douglas Crockford per il JavaScript linguaggio di programmazione a http://javascript.crockford.com/code.html

clausole (case, catch, di default, altrimenti, finalmente) non sono dichiarazioni e quindi non dovrebbero essere dichiarazioni come indentate.