En los archivos que contienen varios idiomas (es decir, archivos de plantilla), ¿existen mejores prácticas con respecto a la sangría?
Principalmente uso esto:
<div>
IF FOO
<div>
<p>contents>
</div>
END FOO
</div>
Sangría para cada bloque nuevo, independientemente del idioma. Sin embargo, esto tiene algunas desventajas. En archivos más complejos puede romper la sangría de cualquier idioma:
<div>
IF FOO
<div someattribute>
ELSE
<div otherattribute>
END FOO
<p>content</p>
</div>
</div>
También he visto esto usado:
<div>
IF FOO
<div>
<p>contents>
</div>
END FOO
</div>
Es decir. sangra solo un idioma. Esto tiene la ventaja de ser siempre coherente, pero en archivos más complejos puede ocultar casi por completo algunos detalles de implementación, como que un bloque sea condicional.
El objetivo aquí es obviamente maximizar la legibilidad.
Respuestas:
En mi opinión, el principio principal para una buena codificación es minimizar la mezcla de código.
Los archivos de dos idiomas son inherentemente un desastre para trabajar. Su prioridad debe ser minimizar el grado en que los dos idiomas están entrelazados.
Por ejemplo, en un archivo de plantilla, la lógica implementada por el lenguaje de plantillas debe mantenerse al mínimo. Siempre que sea posible, mueva la lógica a otra parte y simplemente presente un valor en el archivo de plantillas.
Incluso algo como tu ejemplo:
Podría implementarse mejor como
con el atributo a usar calculado en otra parte. En este caso, entonces, permitiría que la legibilidad del idioma principal del archivo sea el motor de la estrategia de sangría. No sangraría el lenguaje de plantillas, y cualquier código de plantilla lo suficientemente complejo como para necesitar sangría probablemente esté mal diseñado.
fuente
Esta es una de las principales razones para evitar sistemas que mezclan dos idiomas de esta manera. Puede ser realmente difícil verificar cómo el flujo de control del lenguaje externo afecta la estructura de bloques del lenguaje interno, y cuando no puede ver eso, ocurren errores.
Prefiero mantenerlos separados y cuando genere resultados en otro lenguaje estructurado siempre use un sistema de plantillas que respete la estructuración del lenguaje y no requiera bloques de flujo de control para tareas comunes.
fuente
(Como prometí, mi opinión basada en la experiencia).
En primer lugar, si puede evitarlo: no mezcle idiomas, siempre que sea posible.
Según su ejemplo, parece que en su mayoría se está preguntando cómo debería hacerse en un lenguaje de plantillas mezclado con HTML, que cubriré. (Otro caso sería construir SQL usando otro lenguaje de programación, lo que requeriría reglas completamente diferentes).
Como ejemplo, cubriré Django (pero PHP, Twig, etc.) funcionan casi de la misma manera. Django tiene bloques lógicos en las plantillas (abrir
{% tag %}
, cerrar{% endtag %}
). HTML tiene bloques lógicos (abrir<tag>
, cerrar</tag>
). Aquí sigo principalmente esta regla: aumentar después de una etiqueta abierta, disminuir después de una etiqueta de cierre. Otra regla que mantengo: asegúrese de que el contenido de un bloque Django sea HTML bien formateado.Según su ejemplo, en mi opinión esto está muy mal:
¿Por qué? Porque el contenido del
IF
no es un HTML bien formateado. ¿Qué aspecto debería tener?(Debido a que su lenguaje de plantilla no tiene una buena sintaxis analizable, necesitamos las nuevas líneas. En Django, escribiría)
Como beneficio adicional, imagine que
<div>
tiene 7 atributos, 1 de los cuales se decide según una condición específica. O peor: ¿qué pasa si tiene 3 atributos, cada uno de los cuales depende de una condición? Eso le daría 8 etiquetas diferentes.Teniendo en cuenta la "regla" para mantener el contenido de todos los bloques bien formateados dentro de ese alcance, no tiene que preocuparse por romper la sangría de ninguno de los idiomas.
Otro punto que me gustaría cubrir (aunque ligeramente fuera de tema): si las etiquetas de apertura y cierre están en diferentes líneas, deberían ser la única etiqueta en esa línea.
Incorrecto:
En cambio, prefiera
o
(Advertencia: uso avanzado): a veces tiene varias etiquetas de ajuste, puede (no debe) considerar esto como una etiqueta:
Sin embargo, preferiblemente no mezcle idiomas (host / invitado) al hacer esto. Y preferiblemente no hagas esto con
for
bucles. Y no hagas esto con.TL; DR para su pregunta específica.
Y la nota general que debo agregar (como siempre): usa tu propio juicio. Sepa cuándo desviarse.
fuente