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?


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.


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.


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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.