Indentazione in un file multilingue [chiuso]

8

Nei file che contengono più lingue (ad es. file modello), esistono delle best practice in merito all'indentazione?

Per lo più uso questo:

<div>
    IF FOO
        <div>
            <p>contents>
        </div>
    END FOO
</div>

Indenta ogni nuovo blocco, indipendentemente dalla lingua. Questo ha alcuni svantaggi, però. Nei file più complessi può rompere il rientro di una delle due lingue:

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

Ho visto anche questo usato:

<div>
    IF FOO
    <div>
       <p>contents>
    </div>
    END FOO
</div>

Ie. indentare solo una lingua Questo ha il vantaggio di essere sempre coerenti, ma in file più complessi può nascondere quasi completamente alcuni dettagli di implementazione, come un blocco condizionale.

L'obiettivo qui è ovviamente quello di massimizzare la leggibilità.

    
posta Celos 15.01.2016 - 09:18
fonte

3 risposte

11

Secondo me, il principio fondamentale per una buona codifica è minimizzare la mescolanza di codice.

I file in due lingue sono intrinsecamente un pasticcio con cui lavorare. La tua priorità dovrebbe essere quella di minimizzare la misura in cui le due lingue sono intrecciate.

Ad esempio, in un file di modello, la logica implementata dal linguaggio dei template dovrebbe essere mantenuta al minimo. Quando possibile, sposta la logica altrove e presenta semplicemente un valore nel file di template.

Anche qualcosa come il tuo esempio:

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

Potrebbe essere implementato meglio come

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

con l'attributo da utilizzare calcolato altrove. In questo caso, quindi, vorrei che la leggibilità della lingua principale del file sia il driver della strategia di indentazione. Non indenterei il linguaggio dei template, e ogni codice di template abbastanza complesso da richiedere il rientro è probabilmente mal progettato.

    
risposta data 15.01.2016 - 10:51
fonte
5

Questo è uno dei motivi principali per evitare sistemi che mescolano due lingue insieme in questo modo. Può diventare davvero difficile controllare come il flusso di controllo della lingua esterna influisce sulla struttura a blocchi del linguaggio interno e, quando non lo si può vedere, si verificano errori.

Preferisco tenerli separati e quando generi output in un'altra lingua strutturata usa sempre un sistema di template che rispetta la strutturazione della lingua e non richiede blocchi di flusso di controllo per attività comuni.

    
risposta data 15.01.2016 - 13:49
fonte
3

(Come promesso, il mio parere basato sull'esperienza.)

Prima di tutto, se puoi impedirlo: fai non mescolare le lingue, quando possibile.

Come per il tuo esempio, sembra che tu ti stia principalmente chiedendo come dovrebbe essere fatto in una lingua di template mista a HTML, che tratterò. (Un altro caso sarebbe costruire SQL usando un altro linguaggio di programmazione, che richiederebbe regole completamente diverse).

Ad esempio, parlerò di Django (ma PHP, Twig, ecc.) funzionano per lo più allo stesso modo. Django ha blocchi logici nei template (aperto {% tag %} , chiudendo {% endtag %} ). L'HTML ha blocchi logici (aperto <tag> , chiuso </tag> ). Qui per lo più seguo questa regola: incrementa dopo un tag aperto, decrementa dopo un tag di chiusura. Un'altra regola che tengo: assicurati che il contenuto di un blocco Django sia HTML ben formattato.

Secondo il tuo esempio, a mio avviso questo è molto sbagliato:

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

Perché? Perché il contenuto di IF non è un HTML ben formattato. Che aspetto dovrebbe essere?

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

(Poiché il tuo linguaggio template non ha una bella sintassi parsable, abbiamo bisogno delle nuove linee. In Django, vorrei scrivere)

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

Come ulteriore vantaggio, immagina che <div> abbia 7 attributi, 1 dei quali è deciso sulla base di una condizione specifica. O peggio: cosa succede se ha 3 attributi ciascuno dei quali dipende da una condizione. Ciò darebbe 8 tag diversi.

Tenendo presente la "regola" per mantenere il contenuto di tutti i blocchi ben formattato all'interno di tale ambito, non devi preoccuparti di rompere il rientro di una delle due lingue.

Un altro punto che vorrei coprire (anche se leggermente fuori tema): se i tag di apertura e chiusura sono su linee diverse, dovrebbero essere l'unico tag su quella linea.

Sbagliato:

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

Invece, preferisci

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

(Avviso: utilizzo avanzato): A volte hai più tag wrapping, potresti (non devi) considerarlo come un tag:

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

Tuttavia, preferibilmente non mescolare le lingue (ospite / ospite) quando si fa questo. E preferibilmente non farlo con for loops. E non farlo con.

TL; DR per la tua domanda specifica.

  • Hai un 'host' (es. Django templating) e un linguaggio 'guest' (ad esempio HTML). Assicurati che i blocchi della lingua host contengano sempre blocchi di lingua ospite formattati correttamente.
  • L'apertura di ogni blocco dovrebbe incrementare il rientro, la chiusura di ogni blocco dovrebbe allinearsi con l'apertura.

E la nota generale che dovrei aggiungere (come sempre): usa il tuo giudizio. Sapere quando deviare.

    
risposta data 15.01.2016 - 20:34
fonte

Leggi altre domande sui tag