Sangría en un archivo multilingüe [cerrado]

8

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.

Celos
fuente
1
+1: pregunta interesante. Veré si puedo escribir mi opinión (basada en la experiencia) más tarde hoy.
Sjoerd Job Postmus
@SjoerdJobPostmus No, no lo es. El estándar de codificación debe indicar qué ideación usar.
B 15овић
Sí lo es. Debe responderse antes de definir los estándares de codificación al respecto.
Florian F
1
@ BЈовић, ¿qué pasa si no hay un estándar de codificación? ¿Qué pasa si usted es el que crea el estándar de codificación? Alguien tiene que pensar en esto y decidir una solución. En cualquier caso, la cuestión de si es "interesante" es completamente subjetiva.
1
La pregunta es sobre las mejores prácticas. ¿Qué hacen las personas con experiencia en este asunto? ¿Cuáles son los pros y los contras de las diferentes opciones? De hecho, es subjetivo, no hay correcto ni incorrecto, las personas siguen sus gustos, pero es probable que las buenas ideas se difundan.
Florian F

Respuestas:

11

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:

<div>
    IF FOO
        <div someattribute>
    ELSE
        <div otherattribute>
    END FOO
        <p>content</p>
    </div> 
</div>

Podría implementarse mejor como

<div>
    <div [FOO_ATTRIBUTE]>
        <p>content</p>
    </div> 
</div>

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
5

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.

Jules
fuente
3

(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:

<div>
    IF FOO
        <div someattribute>
    ELSE
        <div otherattribute>
    END FOO
        <p>content</p>
    </div>
</div>

¿Por qué? Porque el contenido del IFno es un HTML bien formateado. ¿Qué aspecto debería tener?

<div>
    <div
        IF FOO
            someattribute
        ELSE
            otherattribute
        END FOO
    >
        <p>Content</p>
    </div>
</div>

(Debido a que su lenguaje de plantilla no tiene una buena sintaxis analizable, necesitamos las nuevas líneas. En Django, escribiría)

<div>
    <div {% if foo %}someattribute{% else %}otherattribute{% endif %}>
        <p>Content</p>
    </div>
</div>

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:

<ul>
    <li>This is something <a href="http://programmers.stackexchange.com">Usefull</a>
    </i>
</ul>

En cambio, prefiera

<ul>
    <li>This is something <a href="http://programmers.stackexchange.com">Usefull</a></li>
</ul>

o

<ul>
    <li>
        This is something <a href="http://programmers.stackexchange.com">Usefull</a>
    </li>
</ul>

(Advertencia: uso avanzado): a veces tiene varias etiquetas de ajuste, puede (no debe) considerar esto como una etiqueta:

<ul>
    <li><div id="something"><span class="like this">
        Something like this
    </span></div></li>
</ul>

Sin embargo, preferiblemente no mezcle idiomas (host / invitado) al hacer esto. Y preferiblemente no hagas esto con forbucles. Y no hagas esto con.

TL; DR para su pregunta específica.

  • Tiene un 'host' (por ejemplo, plantillas Django) y un lenguaje 'invitado' (por ejemplo, HTML). Asegúrese de que los bloques de idioma del host siempre contengan bloques de idioma invitados correctamente formateados.
  • La apertura de cada bloque debe incrementar la sangría, el cierre de cada bloque debe alinearse con la apertura.

Y la nota general que debo agregar (como siempre): usa tu propio juicio. Sepa cuándo desviarse.

Sjoerd Job Postmus
fuente