Recuo em um arquivo multilíngue [fechado]

8

Em arquivos que contêm vários idiomas (por exemplo, arquivos de modelo), existem práticas recomendadas em relação à indentação?

Eu principalmente uso isso:

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

Recuar para cada novo bloco, independentemente do idioma. Isso tem algumas desvantagens, no entanto. Em arquivos mais complexos, pode interromper o recuo de qualquer idioma:

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

Eu também vi isso usado:

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

Ou seja. recuar apenas um idioma. Isso tem a vantagem de sempre ser consistente, mas em arquivos mais complexos pode quase completamente ocultar alguns detalhes de implementação, como um bloco sendo condicional.

O objetivo aqui é obviamente maximizar a legibilidade.

Celos
fonte
1
+1: pergunta interessante. Vou ver se consigo escrever minha opinião (baseada na experiência) ainda hoje.
Sjoerd Job Postmus
@SjoerdJobPostmus Não, não é. O padrão de codificação deve informar qual identificação usar.
BЈовић
Sim, ele é. Ele precisa ser respondido antes de definir os padrões de codificação.
Florian F
1
@ Bћовић, e se não houver um padrão de codificação? E se você é quem criou o padrão de codificação? Alguém tem que pensar sobre isso e decidir uma solução. De qualquer forma, a questão de saber se é "interessante" é inteiramente subjetiva.
1
A questão é sobre as melhores práticas. O que as pessoas experientes fazem nessa questão? Quais são os prós e os contras das várias opções? É realmente subjetivo, não há certo e errado, as pessoas seguem seu gosto, mas é provável que boas idéias se espalhem.
Florian F

Respostas:

11

Na minha opinião, o principal princípio para uma boa codificação é minimizar a mistura de código.

Arquivos em dois idiomas são inerentemente uma bagunça para se trabalhar. Sua prioridade deve ser minimizar a extensão na qual os dois idiomas estão entrelaçados.

Por exemplo, em um arquivo de modelo, a lógica implementada pela linguagem de modelos deve ser mantida no mínimo. Sempre que possível, mova a lógica para outro lugar e apenas apresente um valor no arquivo de modelo.

Até algo como o seu exemplo:

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

Poderia ser melhor implementado como

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

com o atributo a ser calculado em outro lugar. Nesse caso, eu permitiria que a legibilidade da linguagem principal do arquivo seja o driver da estratégia de indentação. Eu não recuaria a linguagem de modelo, e qualquer código de modelo complexo o suficiente para precisar de recuo provavelmente é mal projetado.


fonte
5

Esse é um dos principais motivos para evitar sistemas que misturam dois idiomas como este. Pode ser realmente difícil verificar como o fluxo de controle da linguagem externa afeta a estrutura de blocos da linguagem interna e, quando você não vê isso, ocorrem erros.

Prefiro mantê-los separados e, ao gerar saída em outra linguagem estruturada, sempre use um sistema de modelos que respeite a estrutura da linguagem e não exija blocos de fluxo de controle para tarefas comuns.

Jules
fonte
3

(Como prometido, minha opinião baseada na experiência.)

Primeiro de tudo, se você pode evitá-lo: não misture idiomas, sempre que possível.

Conforme o seu exemplo, parece que você está pensando principalmente sobre como isso deve ser feito em uma linguagem de modelagem misturada com HTML, que abordarei. (Outro caso seria construir o SQL usando outra linguagem de programação, o que exigiria regras completamente diferentes).

Como exemplo, falarei sobre o Django (mas PHP, Twig, etc) funcionam da mesma forma. O Django possui blocos lógicos nos modelos (abrir {% tag %}, fechar {% endtag %}). O HTML possui blocos lógicos (aberto <tag>, fechado </tag>). Aqui, eu principalmente sigo esta regra: incrementar após uma tag aberta, diminuir após uma tag de fechamento. Outra regra que mantenho: verifique se o conteúdo de um bloco Django é HTML bem formatado.

Conforme seu exemplo, na minha opinião, isso é muito errado:

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

Por quê? Porque o conteúdo do IFarquivo não é um HTML bem formatado. Como deve ser?

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

(Como a linguagem do seu modelo não possui uma sintaxe agradável de analisar, precisamos das novas linhas. No Django, eu escreveria)

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

Como um benefício adicional, imagine que ele <div>tenha 7 atributos, 1 dos quais é decidido com base em uma condição específica. Ou pior: e se tiver três atributos, cada um dos quais depende de uma condição. Isso daria 8 tags diferentes.

Tendo em mente a "regra" para manter o conteúdo de todos os blocos bem formatados nesse escopo, você não precisa se preocupar em quebrar o travessão de nenhum idioma.

Outro ponto que eu gostaria de abordar (embora ligeiramente fora de tópico): se as tags de abertura e fechamento estiverem em linhas diferentes, elas deverão ser a única tag nessa linha.

Errado:

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

Em vez disso, prefira

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

ou

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

(Aviso: uso avançado): às vezes você tem várias tags de quebra automática, você pode (não deve) considerar isso como uma tag:

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

No entanto, de preferência não misture idiomas (host / convidado) ao fazer isso. E de preferência não faça isso com forloops. E não faça isso com.

TL; DR para sua pergunta específica.

  • Você tem uma linguagem 'host' (por exemplo, Django templating) e 'guest' (por exemplo, HTML). Verifique se os blocos de idioma do host sempre contêm blocos de idioma do convidado formatados corretamente.
  • A abertura de cada bloco deve incrementar o recuo, o fechamento de cada bloco deve estar alinhado com a abertura.

E a nota geral que devo acrescentar (como sempre): use seu próprio julgamento. Saiba quando se desviar.

Sjoerd Job Postmus
fonte