Como resolver o problema de comentários aninhados

23

Aparece em não apenas um idioma que os comentários não podem ser aninhados. Você tem uma boa solução para este problema? Uma solução alternativa em C / C ++ e Java é usar apenas o comentário de linha única, mas torna-se impossível comentar um bloco maior. Estou enfrentando algo assim:

</li><!--
                <li><!-- Save -->

Então, eu devo passar manualmente e editar os comentários. Você pode aconselhar como devemos lidar com isso, em vários idiomas? Não tenho certeza, mas talvez o python tenha uma solução para isso com a '''maneira que possa incluir um #comentário no python? `

Niklas
fonte
4
Eu acho que apenas editores podem ajudá-lo lá. O IDLE bloqueará comentários para você no Python IIRC.
Erik Reppen
7
Python não tem comentários de bloqueio . Os literais''' e """são strings . Acontece que o intérprete os avaliará durante a compilação (para o bytecode) e reconhecerá os literais da string como no-ops (portanto, eles não diminuem o tempo de execução / carregamento do bytecode). Docstrings, isto é, literais de string logo após um defmas antes do corpo, não são removidos, pois o intérprete assume que eles fornecem documentação para a função.
Bakuriu
7
No C / C ++, se você deseja remover seções grandes, use #if 0<code> #endif. Portanto, isso não é realmente um problema. Usar comentários para fazer isso é a ferramenta errada.
Martin York
1
Eu mudei para usar apenas comentários de linha há muito tempo (desde que não seja forçado, por exemplo, Javadoc). Obviamente, você precisa de suporte ao editor (ou pelo menos no modo coluna).
ziggystar

Respostas:

46

A melhor solução é, obviamente, não apenas aninhar seus comentários. Comentários aninhados geralmente são um sinal de que você está usando comentários incorretos. O exemplo mais comum é o código comentado que contém comentários em si, e a correção é remover o código em vez de comentá-lo.

Dito isto, muitas linguagens de programação têm mais de um tipo de sintaxe de comentário, e você pode usar esse fato para aninhar pelo menos um nível de profundidade. Por exemplo, em Java:

/* This is commented out!
Foo.bar.baz();
// And now for something completely different...
Quux.runWith(theMoney);
*/

Além disso, em muitos idiomas, pelo menos um tipo de comentário pode ser aninhado; nos idiomas do tipo C, os comentários de linha dentro dos comentários de linha são ignorados:

// some_commented_out(code);
// // This is a comment inside the comment!
// // Still inside the nested comment.
// some_more_code_in(outer_comment);

A maioria dos IDEs suporta comentar blocos inteiros de código com comentários de linha em uma ação e eles lidam com esse tipo de estilo de comentário corretamente. O mesmo exemplo em Python:

# some_commented_out(code)
# # This is a comment inside the comment!
# # Still inside the nested comment.
# some_more_code_in(outer_comment)

Frequentemente, os padrões de codificação para um projeto específico têm regras sobre qual estilo de comentário usar quando; uma convenção comum é usar comentários em bloco ( /* */) para documentação de métodos e classes, e comentários em linha ( //) para observações dentro dos corpos dos métodos e, por exemplo:

/**
 * Helper class to store Foo objects inside a bar.
 */
public class Foobar {
    /**
     * Stores a Foo in this Foobar's bar, unless the bar already contains
     * an equivalent Foo.
     * Returns the number of Foos added (always 0 or 1).
     */
    public int storeFoo(Foo foo) {
        // Don't add a foo we already have!
        if (this.bar.contains(foo)) {
            return 0;
        }
        // OK, we don't have this foo yet, so we'll add it.
        this.bar.append(foo);
        return 1;
    }
}

Com esse estilo, é improvável que você precise aninhar /* */comentários (se precisar desativar temporariamente métodos ou classes inteiros, renomeá-los funcionará da mesma maneira, se não for melhor); e //comentários são aninhados, pelo menos com uma pequena ajuda do seu IDE.

Por fim, para desativar o código, você tem outras opções em várias linguagens de programação; por exemplo, em C, você pode aproveitar o pré-processador:

this_is(activated);
#if 0
this_is(!activated);
/* Comments inside this block don't really nest, they are simply removed
   along with the rest of the block! */
#endif

Em idiomas dinâmicos, geralmente você pode usar apenas ifdeclarações regulares :

<?php

if (0) {
   // This should never run... 
   some_stuff_that_should_never_run();
}

No entanto, ao contrário do exemplo do CPP, essa estratégia exige que o arquivo de origem como um todo seja sintaticamente válido, portanto, não é de longe tão flexível.

E, finalmente, existem pelo menos alguns idiomas que permitem comentários aninhados. Caso você esteja interessado, a wikipedia possui um bom gráfico de comparação .

tdammers
fonte
2
alguma variante do SQL permite comentários aninhados?
Xavier Combelle
3
+1 para// And now for something completely different...
Vorac
1
@Vorac: que bom que você gostou da referência: D
tdammers
18

C e C ++ têm comentários de bloco aninhados:

#if 0
#endif

Muitos editores de destaque entendem isso como um comentário e muitos outros pelo menos o destacam como qualquer outro código condicionalmente desabilitado.

Em muitos outros idiomas, você precisa contar com o suporte do editor. Para idiomas que possuem apenas comentários baseados em linhas (perl, python, ruby, shell ...), é bastante simples acrescentar o caractere de comentário a todas as linhas em um intervalo, para que a maioria dos editores possa fazer isso. Você ainda pode dizer o que eram comentários antes de comentar todo o bloco, porque o caractere do comentário é dobrado - fazê-lo simplesmente é uma vantagem aqui.

XML e SGML é provavelmente a maior dor, sua definição de comentário é simplesmente estúpida. Os comentários teriam sido triviais para aninhar, mas não apenas não são, é completamente proibido ter --comentários internos. Infelizmente, não sei quais editores têm um bom suporte para comentar em SGML / XML.

Jan Hudec
fonte
2
Nunca pensei em usar essas diretivas de pré-processador como comentários reais. Interessante, também para C #, mas nesse caso, você teria que fazer algo como o #if _que funciona bem e fica acinzentado no meu VS com Re #. Boa dica!
Careta do Desespero
2

Embora não seja uma solução geral, e certamente não seja ideal, uma maneira de resolver esse problema específico é usar a linguagem de processamento de modelos do lado do servidor para bloquear comentários para elementos de comentários de código aninhados. Isso deixa o conteúdo essencialmente intacto, mas impede o envio ao navegador do cliente.

Isso não ajuda muito se o arquivo for de conteúdo puro e puro que não requer outro processamento no servidor. Nesse caso e no caso mais geral de comentários aninhados, pergunte por que você deseja fazer isso. Na maioria dos casos, pode-se achar que a melhor maneira de lidar com isso é não lidar com tudo. Em outras palavras, se você deseja eliminar uma seção, elimine-a e deixe que o controle de versão lembre-se das diferenças se essa seção como um artefato precisar ressuscitar.

JustinC
fonte
0

No caso de HTML / XML, você pode usar uma instrução de processamento inexistente: veja minha resposta em SO

<?ignore
  <band height="20">
    <staticText>
      <reportElement x="180" y="0" width="200" height="20"/>
      <text><![CDATA[Hello World!]]></text>
    </staticText>
  </band>
?>
</detail>
Kasper van den Berg
fonte
0

O Swift suporta comentários aninhados para que "apareça não apenas em um idioma em que os comentários não possam ser aninhados" não seja mais uma afirmação verdadeira. Se você está insatisfeito com a falta de suporte para comentários aninhados em sua linguagem de programação, sugiro que tente o Swift.

/* This is the start of the first multiline comment.
 /* This is the second, nested multiline comment. */
 This is the end of the first multiline comment. */

Linguagem de Programação Rápida: O Básico

mbonness
fonte
0

A linguagem de programação D aninhou comentários incorporados em:

/+ This is a nested comment 
  /+ This is part of that a comment +/
  /* So is this */
+/
/+ /* This is another nested comment */ +/
/* /* This is not a nested comment */

Em outras palavras, /+e +/comentários ninho.

noɥʇʎԀʎzɐɹƆ
fonte