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.
Respostas:
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:
Poderia ser melhor implementado como
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
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.
fonte
(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:
Por quê? Porque o conteúdo do
IF
arquivo não é um HTML bem formatado. Como deve ser?(Como a linguagem do seu modelo não possui uma sintaxe agradável de analisar, precisamos das novas linhas. No Django, eu escreveria)
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:
Em vez disso, prefira
ou
(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:
No entanto, de preferência não misture idiomas (host / convidado) ao fazer isso. E de preferência não faça isso com
for
loops. E não faça isso com.TL; DR para sua pergunta específica.
E a nota geral que devo acrescentar (como sempre): use seu próprio julgamento. Saiba quando se desviar.
fonte