Classes de estilo Java em c ++

8

Me deparei com este artigo propondo um estilo de codificação em c ++ que parece um pouco estranho no começo. Mas depois de ler e refletir um pouco, estou realmente pensando em tentar.

O benefício mais atraente é a facilidade dos métodos de refatoração. Eu me pego constantemente alterando nomes de métodos, parâmetros e assim por diante enquanto escrevia uma nova classe e em c ++ é muito irritante ter que alterar o nome de um método em dois arquivos (.h, .cpp).

Tentei encontrar algo errado com esse estilo, mas, além do fato de o código parecer e parecer realmente estranho para programadores experientes em c ++, não consigo identificar nenhuma falha importante. Mas, como sou um programador c ++ inexperiente, espero que alguém aqui possa me alertar sobre possíveis perigos.

Então, minha pergunta é:

Existem sérias desvantagens de usar esse estilo de codificação?

bughi
fonte
2
Você provavelmente terá problemas com os modelos.
Thomas Eding
1
e nome mangling
catraca aberração
@ThomasEding você poderia elaborar? Mudei struct Bno exemplo para um modelo e ele compilou muito bem.
bughi
1
Eu não entendo o objetivo do artigo. Ele vai agains tudo considerado bom código moderno em C ++ ...
Klaim
1
Eu gosto da separação da interface da implementação. É muito fácil ler o arquivo * .h e ver a interface rapidamente (porque é compacta). Eu provavelmente nunca preciso olhar para o arquivo de origem, a menos que seja o código que estou editando. Reunir tudo em um único arquivo destruirá um dos recursos do idioma que acho mais útil (então não, obrigado).
Martin York

Respostas:

13

Sim, você vai confundir outros programadores de C ++ se escrever todo o seu código assim. Eu nunca vi código C ++ fora do modelo escrito dessa maneira, com tudo no arquivo de cabeçalho. Isso foi discutido em profundidade em uma questão de Stack Overflow .

Quanto a problemas técnicos reais , algumas coisas vêm à mente.

  • Todo o seu código se torna efetivamente inline. Seus tempos de compilação provavelmente aumentarão.
  • Toda recompilação compilará o mundo simplesmente porque é necessário.
  • Você terá que tomar cuidado para não colidir com a Regra de Uma Definição . Os nomes de variáveis ​​terão que ser únicos em todos os arquivos de origem, pois se tornam efetivamente um arquivo gigante.

Você também pode querer verificar a linguagem de programação D , que eu ouço resolve muitos desses problemas. O compilador D foi projetado com esse estilo em mente e não tem 30 anos de compatibilidade com versões anteriores em C para dar suporte.

Michael Kristofik
fonte
Na verdade, escrevemos C ++ dessa maneira (tudo em .h) nos meus estudos de graduação. Não sei por que. Eu tive que aprender a separar as coisas e vinculá-las adequadamente por conta própria.
KChaloux
9

Não é exatamente uma ideia nova. Programadores iniciantes evitam declarações como a praga e geralmente se safam porque seus programas são muito pequenos. A conseqüência é que agora você precisa se preocupar com a ordem em que define suas funções. A consequência de se preocupar com a ordem de definição é uma tentação de minimizar o problema, tornando suas funções muito grandes.

Você também perde a boa separação entre interface e implementação. O próprio autor lamenta que os membros particulares façam parte do arquivo de cabeçalho e, em seguida, "resolva" o problema, tornando todos os detalhes da implementação parte do arquivo de cabeçalho.

Karl Bielefeldt
fonte
7

Se você deseja classes no estilo Java, programe em Java !

Ele faz muitas conjecturas em seu artigo que são totalmente erradas. Em nenhuma ordem particular:

Tempo de compilação

Isso também não é problema. Supondo que você tenha todos os cabeçalhos do sistema operacional e contêineres usados ​​com freqüência (STL) ou bibliotecas matemáticas em cabeçalhos pré-compilados, e assumindo que se o seu programa for realmente grande, você o tenha separado em componentes conforme descrito acima, a quantidade restante de código será absolutamente insignificante para um compilador C ++ moderno.

Isso está errado e mostra que ele nunca trabalhou em um programa C ++ em larga escala. Faça o download de qualquer grande programa C ++ de código aberto, compile o programa e diga-me se você deseja esperar tanto tempo toda vez que esquecer um ponto e vírgula.

Declarar antes de usar

Há um recurso C ++ que poucos programadores parecem conhecer (ou pelo menos exploraram): e é isso que dentro de uma classe, declara antes que o uso não seja válido (!). Claramente, Bjarne estava ciente desse problema legado em C ++ e o corrigiu para o interior das classes, mas não pôde fazer o mesmo para as declarações de nível superior devido à compatibilidade com versões anteriores com C (por quê? Deve haver alguma complexidade que estou perdendo aqui) .

[... muito mais, cada linha mais dolorosa que a anterior ...]

Ok, primeiro, não é um recurso que "muito poucos programadores parecem conhecer". Segundo, este é um completo mal-entendido da declaração direta e para que ela é usada. O guia de estilo de codificação do Google tem uma introdução decente: http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Forward_Declarations

Eles destinam-se a simplificar o compilador e reduzem substancialmente o tempo de compilação.

riwalk
fonte
1
Você sabe, eu apenas tive que votar para esse link no Google Style Guide. É uma pilha gigantesca de erros. Deveríamos colocá-lo na lista negra, não vinculando a ele.
DeadMG
0

Parece-me que estou apenas dando um nome pateta para fazer declarações avançadas em vez de #include <blah>.

Os benefícios para as declarações avançadas são que seus tempos de compilação podem ser significativamente mais rápidos, mas a principal desvantagem da IMO é que você deve estar ciente de quando pode e não pode se safar com uma declaração direta e, quando você estraga tudo, pode obter mensagens de erro aparentemente incompreensíveis para um erro trivial.

whatsisname
fonte