Como posso aprender a escrever C ++ idiomático?

27

Sou estudante de ciência da computação e, como resultado, fui ensinado C ++ como uma versão melhor do C com aulas. Acabo tentando reinventar a roda sempre que uma solução para um problema complexo é necessária, apenas para descobrir algum tempo depois que algum recurso de linguagem ou alguma rotina de biblioteca padrão poderia ter feito isso por mim.

Estou bem à vontade com meus char*e meus *(int*)(someVoidPointer)idiomas, mas recentemente, depois de fazer uma (menor) contribuição para um projeto de código-fonte aberto, sinto que não é assim que alguém deve pensar ao escrever código C ++. É muito diferente de C.

Considerando que conheço bem a programação orientada a objetos e estou bem com uma curva de aprendizado acentuada, o que você sugeriria para que eu pensasse na pista de C ++ quando codificasse C ++?

yati sagade
fonte
7
Com base nos seus comentários, você conhece a sintaxe C ++ e isso é tudo. Você não está codificando em C ++. A tag C ++ no stackoverflow é um bom ponto de partida, inclui uma lista de leitura e perguntas frequentes . A única maneira real de aprender é escrever código e fazer com que usuários experientes comentem. Você pode colocar seu código aqui para revisão. Um bom exemplo
Martin York
1
Juntamente com os conselhos de @ LokiAstari (com os quais concordo), eu diria que seus amigos estão certos, e trabalhar com o Ac ++ acelerado provavelmente seria uma boa idéia. Eu suspeito que você descobrirá que é necessário muito menos escaneamento do que você espera - ele é destinado a pessoas em sua posição, que já conhecem a programação e precisam principalmente aprender as expressões idiomáticas do C ++ moderno.
Jerry Coffin
sim, na verdade eu completei os dois primeiros capítulos, mas o que eu já sabia era basicamente o que eu já sabia - eu entendo que um autor não vai apenas escrever um livro para mim :) :) @LokiAstari, obrigado pelo comentário superinformativo :)
yati sagade 3/11
3
@yatisagade Não espere que um livro ensine a mentalidade do idioma em alguns capítulos. Pode ser extremamente chato, como você já conhece a sintaxe, mas você deve se comprometer a ler alguns livros em C ++, ler tudo e fazer cada exercício como se fosse um iniciante no idioma. Ser ensinado da maneira errada significa que você deve dobrar seus esforços, pois precisa esquecer os erros e aprender os direitos (ou algo assim).
yannis
1
Estou confortável com [...] - (int) (someVoidPointer)depurou uma compilação de 64 bits antes?
Ed S.

Respostas:

12

Com base nos seus comentários, você conhece a sintaxe C ++.
Você não está codificando em C ++, mas o que geralmente é chamado de C com classes.

A tag C ++ no stackoverflow é um bom ponto de partida, inclui uma lista de leitura e perguntas frequentes .

A única maneira real de aprender é escrever código e fazer com que usuários experientes comentem. Você pode colocar seu código aqui para revisão. Um bom exemplo

Estou confortável com meus "caracteres *"

Pare de usá-los, alterne para std :: string.

e expressões (int) (someVoidPointer).

Pare de usá-los (além de fazer interface com o código C). O uso do conceito de functor oferece várias vantagens (incluindo a idéia de encapsular o estado).

Mas, recentemente, depois de fazer uma (menor) contribuição para um projeto OSS, sinto que não é assim que você pensa em C ++. É muito diferente, embora C tenha seu próprio lugar.

Sim. C e C ++ divergiram como idiomas. Embora você possa usar praticamente a mesma sintaxe, o que é considerado bom código C geralmente não é considerado bom código C ++ (ou vice-versa).

Alguns amigos sugeriram C ++ acelerado, mas, novamente, eu sei o que são tipos e quais classes são e o que é sobrecarga.

Você tem o básico básico.

Como pode um programador de C ++ (mutilado), que por acaso é bom com os conceitos de OO, escrever programas idiomáticos na linguagem.

Com muito trabalho :-)

Martin York
fonte
Este não é o único caminho. Você pode aprender muito com bons livros.
Dima
1
@ Dima: Absolutamente. Você pode aprender muito com os livros. Mas nada supera a experiência e o uso da linguagem com raiva, falhando em tentar novamente e descobrir a melhor maneira de fazê-lo. Suponho que você possa aprender francês com um livro, mas duvido que os franceses o considerem fluente.
Martin York
6
IMHO, a maneira mais eficiente de aprender é começar com os livros, aprender a maneira correta de fazer as coisas, experimentá-lo na prática e pedir a alguém que critique seu código.
Dima
@ Dima: Eu não tenho nenhum argumento com isso.
Martin York
12

O livro Effective C ++ ensina uma série de coisas interessantes e o levará a apreciar os recursos do C ++. Também existe um STL eficaz - eu não o li, mas tenho certeza de que seria uma ótima leitura se você não estiver familiarizado com o STD.

O importante a aprender é que você deve usar o idioma e não reinventar a roda constantemente . Você já aprendeu como fazê-los, facilite para si mesmo (e para os outros!) E use ferramentas para todo o seu potencial.

Como uma observação lateral, você encontrará muitas pessoas que exigem o uso de DST. Isso é tão ruim de mentalidade quanto usar apenas char*- às vezes não é a ferramenta correta e existem muitas outras por aí. No mesmo sentido, não desanime de criar suas próprias classes de contêineres - se você estiver usando char*o melhor lugar para fazê-lo, ele estará envolvido com segurança dentro de uma classe.

Pubby
fonte
Conheço as séries eficazes (não as li) - mas acho que são para problemas de melhores práticas, certo?
você precisa saber é o seguinte
3
@ yati sagade: não, esses livros são exatamente o que você precisa para passar de "C com classes" para C ++ completo.
Dima
Entendo - na verdade, eu tinha efetivo c ++ por Meyers alinhados após C ++ acelerado.
yati sagade
1
@Dima "O objetivo deste livro é mostrar a você como usar o C ++ de maneira eficaz. Suponho que você já conheça o C ++ como uma linguagem e que tenha alguma experiência em seu uso. O que forneço aqui é um guia para usar a linguagem para que seu software é compreensível, sustentável, portátil, extensível, eficiente e provavelmente se comportará conforme o esperado. "- C ++ eficaz. Também abrange uma série de "truques" que tornam interessante a leitura.
Pubby
1
@ Dima: Cuidado aqui. A 2ª edição visava novos programadores C ++ provenientes de C. A (mais recente) 3ª edição é mais dirigido a programadores provenientes de linguagens como Java, C #, etc.
SBI
6

Eu posso recomendar o recente BUILD tomado por Herb Sutter. Aquele chamado " Escrevendo código C ++ moderno: como o C ++ evoluiu ao longo dos anos ":

Muitas pessoas pensam em C ++ como a mesma linguagem que experimentaram na faculdade ou apenas como "C com aulas", mas a linguagem C ++ evoluiu amplamente ao longo dos anos. Nesta sessão, abordaremos como você pode usar o C ++ para escrever aplicativos inovadores, expressivos e bonitos que fornecem aplicativos de energia e desempenho. Junte-se a nós para ver como o padrão C ++ 0x recém-concluído pode tornar a escrita em C ++ tão produtiva quanto muitas outras linguagens.

Não é uma apresentação ruim, nem muito longa, tem algumas dicas interessantes para os novos recursos do padrão mais recente, o que daria algumas dicas para atualizar seu antigo estilo C / C ++.

Além disso, você precisa aprender o STL - não é complicado e há muitos livros, por exemplo, STL eficaz, ou apenas os tutoriais do STL no Google para ajudá-lo.

gbjbaanb
fonte
+1 Obrigado. Isso foi maravilhoso. Estou feliz por ter feito esta pergunta. Assim, muitos links maravilhosos :)
yati sagade
4

Li C ++ acelerado por Andrew Koenig e Barbara Moo para me ajudar a ensinar C ++, depois de trabalhar com C ++ por quase uma década. (Na verdade, eu estava começando a mexer com a meta-programação de modelos naquela época.) Ainda achava que era uma revelação, mesmo que eu não ache que isso tenha me ensinado algum fato novo sobre a linguagem. 1

O que ele me ensinou, porém, foi examinar e usar o C ++ como uma linguagem de alto nível. Para não mexer com ponteiros brutos ee deleteusar a biblioteca padrão sempre que possível.

Tenho a sensação de que é exatamente isso que você procura.

1 Não que não restasse nada para me ensinar naquela época (ainda há muito, uma década depois), mas há tanto conhecimento que você pode espremer em um livro introdutório de 250 páginas.

sbi
fonte
1

Antes de responder - uma observação: Idiomatic C ++ é um alvo em movimento. À medida que o idioma muda, o mesmo acontece com os idiomas. De fato, alguns recursos da linguagem destinam - se a eliminar o código idiomático que pode ser simplificado ou aprimorado com algum suporte da própria linguagem ou, pelo menos, da biblioteca padrão. Portanto, lembre-se de que qualquer fonte só pode informá-lo sobre o que era idiomático no momento da redação .

Dito isto, você faria bem em verificar:

O site codereview.SX

A rede StackExchange possui um site chamado codereview.stackexchange.com . Se você escreveu um pedaço de código C ++ - uma classe, uma parte de uma biblioteca, algo não muito grande - você pode publicá-lo e pedir à comunidade que o revise. Observe que o código precisa compilar e ser basicamente funcional - esse site não é para depuração.

Além disso, você pode procurar por algum código C ++ lá, relacionado ao que está trabalhando, e ver o que os revisores enfatizam. Você pode tentar revisar o código postado sem postar uma resposta e ler o que os outros pensam dele.

Apresentações em vídeo da conferência C ++

Existem várias conferências de desenvolvedores focadas em C ++ realizadas todos os anos:

e esses nem são os únicos ... enfim, cada um desses vídeos postados em muitas / todas as apresentações. Isso o ensinará muito , incluindo alguns códigos idiomáticos e princípios com os quais você pode decidir o que deve ou não ser idiomático.

Às vezes você pode até obter os decks de slides dos alto-falantes.

einpoklum - restabelece Monica
fonte
0

Bem, projetos de código aberto são um começo muito bom. Não espere se tornar um programador profissional com base nas suas aulas na universidade, elas não são destinadas a isso (como escrevi na minha resposta aqui ).

Você parece estar ciente da sintaxe, isso é bom. Agora vá e leia o código de outras pessoas e contribua com o seu próprio para análises por pares. Você aprenderá muito lendo o código e tentando entendê-lo, depurando-o e corrigindo-o e, é claro - adicionando a ele as convenções de codificação que já existem.

Livros profissionais também são uma idéia muito boa, como mencionado, e navegar pelas perguntas e respostas no StackOverflow ensinará muito (certamente me ensina muito e eu me considero um profissional de C ++).

littleadv
fonte
-1

Ler muito bom código C ++ provavelmente ajudará. Você precisa ver o código para começar a sentir isso. Por outro lado, a maior parte do código C ++ está incorreta.

Codificador
fonte
"a maior parte do código C ++ está errada" - você pode esclarecer? Vi que a maioria dos projetos de OSS realmente mantém altos padrões de qualidade.
yati sagade
1
Projetos, sim, mas pesquisar sobre como fazer coisas geralmente leva a maus exemplos.
Coder
1
@ yati: Minha experiência em projetos de OSS é o oposto.
SBI
@sbi talvez - eu estava envolvido no projeto Mozilla e no Google Chrome (na verdade não estou envolvido aqui, mas meio que aprendendo). Acharam sua disciplina excepcional!
você precisa saber é o seguinte
@ yatisagade: No mínimo, a maioria dos códigos C ++ existentes foi escrita quando a linguagem tinha recursos que hoje são essenciais para escrever um bom código; e a maior parte do restante foi escrita tendo que usar bibliotecas que foram escritas para trabalhar com esse código mais antigo, portanto esse código mais recente deve ser adaptado a elas, até certo ponto. E tudo isso é independentemente de codificadores investir tempo e esforço necessário para o projeto decente e implementação ...
einpoklum - Reintegrar Monica