2011-01-21 11 views
10

Si bien me doy cuenta de que cada idioma tiene su propia convención para la sangría, no puedo evitar estar molesto con algo que he descubierto recientemente. Tenga en cuenta este código del manual de PHP:PHP versus JavaScript cambiar indentación

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

Observe que cada caso está sangrado de la instrucción de cambio. Esto tiene sentido, ya que el código es más fácil de leer y el cuerpo del bloque está contenido en un nivel dentro de él.

Sin embargo, cuando pruebo la sentencia switch JavaScript equivalente en JSLint:

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

... se muestra un error que me dice que debería aparecer como esto en su lugar:

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

Parece contraintuitivo, ya que cada caso ahora está en línea con el bloque del interruptor en sí mismo. No puedo imaginar ninguna razón por la que esto se considere mejor, mucho menos desencadenar un error.

¿JSLint está equivocado, o simplemente está siguiendo la convención? Si esto último es cierto, ¿por qué la convención no debería guiar por claridad?

+8

JSLint en realidad se queja de este tipo de cosas? * -dies- * – BoltClock

+0

JS y PHP no son Python, use la sangría que desee. – Shikiryu

+8

Usaría 'if ([" manzana "," barra "," torta "]. IndexOf (i)! = -1) alerta (" i es un "+ i);';) – Gumbo

Respuesta

6

Es su código. Dale formato como quieras. Use jsLint, pero si no está de acuerdo con que sus recomendaciones mejoren su código, no impleméntelos. jsLint hiere tus sentimientos.

+2

Exactamente. Crockford no es un Dios JS cuyas reglas debes obedecer, aunque estoy bastante seguro de que hay algunas casillas que puedes marcar/desmarcar para no tener advertencias/errores estrictos en el espacio en blanco. –

+2

Estoy de acuerdo con esto también, pero en este caso mis sentimientos no son tan dolorosos como molestos. De ninguna manera lo consideraría un "error". Además, ninguna de las opciones parece suprimirlo. La razón por la cual este es un problema es porque la herramienta descubre muchos problemas potenciales (que no es uno de ellos) y tener un montón de "errores" no erróneos dificultan ver los válidos. – claviska

2

Siempre que su sangría pueda justificarse lógicamente, debe sangrar en el estilo que prefiera. Si JSLint realmente se queja de esto, es demasiado pedante.

+0

Estoy de acuerdo. JSLint es una gran herramienta, pero teniendo en cuenta una preferencia de sangría, un "error" parece un poco quisquilloso, especialmente cuando el código resultante es menos claro. – claviska

+0

En realidad _no es una gran herramienta. Es excesivamente pedante sobre cosas que no lo hacen diferente (solo estilo, no errores); sin embargo, las cosas que _ causarán errores (es decir, cierto tipo de fugas globales), simplemente ignoran. JSLint es aceite de serpiente. –

0

Es solo una convención para JS (como JSLint define la convención). Personalmente, creo que PHP estaría equivocado aquí (no sé si el manual sigue algún tipo de convención, sé que la biblioteca estándar no lo hace). Prefiero el estilo JS porque puede ser realmente desagradable si estás en unos pocos bloques anidados. Por ejemplo (código PHP):

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

En última instancia, su elección. No usaría el manual de PHP como una guía de estilo; si no puede usar diferentes estilos para diferentes idiomas, use el estilo JS bien definido.

+0

Simplemente configure sus pestañas en 2 espacios si tiene limitaciones en espacio horizontal. – erjiang

+0

Olvidó el if (is_array ($ arr)) si está tratando de obtener niveles tontos de sangría :) – GordonM

+0

@Gordon dispárame ahora –

1

Si bien el formateo es importante, al final es su formateo. Hazlo como quieras El estilo particular que elija es una opción personal y muchos estilos pueden ser "buenos". Sin embargo, cualquier estilo de formato "bueno" debe ser coherente: seleccione las reglas que desee y consérvelas.

Es muy gracioso para mí ver cómo los debates se intensifican sobre cosas como colocar {en la misma línea que el código anterior o no, o "abrazar a las llaves" alrededor de un else. Creo que solo los comunistas colocan un {en la misma línea que su declaración if. :)

+0

Supongo que soy un comunista: P Una vez más, el problema es que desencadenar falsos errores hace es difícil ver los potencialmente válidos. – claviska

+0

Mientras seas commie constante, estás bien conmigo. Un formateador inconsistente de cualquier persuasión, simplemente no es genial. –

+0

Lo suficientemente justo para mí :) – claviska

0

Espacio en blanco adicional se analiza en JavaScript y PHP cuando se interpretan, por lo que puede hacer que su código sea tan feo como desee. Personalmente prefiero añadir llaves adicionales para mis instrucciones switch para que no echo de menos errores de paso al siguiente:

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; 
} 

escaneado el código de las llaves de fin me permite comprobar si he añadido las sentencias break correctas . Puede ver que el caso 'something' falta una declaración de interrupción (tal vez a propósito, tal vez un error).

Algunos estarán en desacuerdo con este formato, pero eso es exactamente lo que quiero decir. El formato no importa mucho. Los analizadores son bastante indulgentes. Encuentre algo que funcione para usted y cúmplalo.

4

En el libro de Crockford, afirma que los bloques no introducen un nuevo alcance. "JSLint espera bloques con instrucciones de función, si, cambiar, mientras, para, hacer y probar y en ninguna otra parte".

también que

if (condition){ 
    statements; 
} 

es el método recomendado de hacer bloques; ya que es "más resistente". Dudo mucho que haya sido estructurado de esa manera por error.

0

También me pareció muy confuso, y encontramos este motivo en convenios Código de Douglas Crockford para el lenguaje de programación JavaScript en http://javascript.crockford.com/code.html

cláusulas (caso, captura, por defecto, de lo contrario, por fin) no son declaraciones y , por lo que no deberían sangrarse como enunciados.