Come posso imparare a scrivere C ++ idiomatico?


27

Sono uno studente di informatica e, di conseguenza, mi è stato insegnato C ++ come una versione migliore di C con le classi. Finisco per provare a reinventare la ruota ogni volta che è necessaria una soluzione a un problema complesso, solo per trovare dopo qualche tempo, alcune funzionalità linguistiche o alcune routine di libreria standard potrebbero averlo fatto per me.

Mi sento a mio agio con il mio char*e gli *(int*)(someVoidPointer)idiomi, ma recentemente, dopo aver dato un (minore) contributo a un progetto open source, sento che non è così che si dovrebbe pensare quando si scrive codice C ++. È molto diverso da quello di C.

Considerando che conosco abbastanza bene la programmazione orientata agli oggetti e che sto bene con una curva di apprendimento ripida, cosa mi suggeriresti di farmi concentrare sulla traccia C ++ quando sto codificando C ++?


7
Sulla base dei tuoi commenti conosci la sintassi C ++ e questo è tutto. Non stai codificando in C ++. Il tag C ++ su stackoverflow è un buon punto di partenza, include un elenco di lettura e domande frequenti . L'unico vero modo per imparare è scrivere codice e far commentare l'utente esperto. Puoi mettere il tuo codice qui per la revisione. Un buon esempio
Martin York,

1
Insieme al consiglio di @ LokiAstari (con il quale sono d'accordo), direi che i tuoi amici hanno ragione, e probabilmente farti strada attraverso il C ++ accelerato sarebbe una buona idea. Ho il sospetto che scoprirai che c'è bisogno di molto meno scrematura che ti aspetti: è destinato alle persone nella tua posizione, che conoscono già la programmazione e che hanno principalmente bisogno di imparare i modi di dire del C ++ moderno.
Jerry Coffin,

sì, in realtà ho completato i primi due capitoli, ma il materiale era principalmente quello che già sapevo - capisco che un autore non uscirà e scriverà un libro per me , però :) @LokiAstari grazie per il commento superinformativo :)
yati sagade,

3
@yatisagade Non aspettarti che un libro ti insegni la mentalità della lingua in un paio di capitoli. Potrebbe essere estremamente noioso, come già conosci la sintassi, ma dovresti impegnarti a leggere un paio di libri in C ++, leggere tutto e fare ogni esercizio dato che eri un principiante assoluto nella lingua. Essere insegnato nel modo sbagliato significa che devi raddoppiare i tuoi sforzi, poiché devi dimenticare i torti e apprendere i diritti (o qualcosa del genere).
yannis,

1
Sono a mio agio con [...] - (int) (someVoidPointer) Hai mai eseguito il debug di una build a 64 bit prima?
Ed S.

Risposte:


12

Sulla base dei tuoi commenti conosci la sintassi C ++.
Non stai codificando in C ++ ma quello che viene spesso definito come C con le classi.

Il tag C ++ su stackoverflow è un buon punto di partenza, include un elenco di lettura e domande frequenti .

L'unico vero modo per imparare è scrivere codice e far commentare l'utente esperto. Puoi mettere il tuo codice qui per la revisione. Un buon esempio

Sono a mio agio con i miei "char *"

Smetti di usarli, passa a std :: string.

e idiomi (int) (someVoidPointer).

Smetti di usarli (a parte l'interfaccia con il codice C). L'uso del concetto di funzione offre numerosi vantaggi (inclusa l'idea di incapsulare lo stato).

Ma recentemente, dopo aver dato un contributo (minore) a un progetto OSS, penso che non sia così che pensi in C ++. È molto diverso, sebbene C abbia un suo posto.

Sì. C e C ++ sono divergenti come lingue. Sebbene sia possibile utilizzare praticamente la stessa sintassi, ciò che è considerato un buon codice C generalmente non è considerato un buon codice C ++ (o viceversa).

Alcuni amici hanno suggerito C ++ accelerato, ma ancora una volta so quali sono i tipi, quali sono le classi e quali sono i sovraccarichi.

Hai le basi in fondo.

Come può un programmatore C ++ (mutilato), che sembra essere solido con i concetti OO, scrivere programmi idiomatici nella lingua.

Con molto lavoro :-)


Questo non è l'unico modo. Puoi imparare molto dai buoni libri.
Dima,

1
@Dima: assolutamente. Puoi imparare molto dai libri. Ma nulla potrà battere l'esperienza e usare la lingua con rabbia, fallendo a riprovare a fallire di nuovo e trovare il modo migliore per farlo. Suppongo che tu possa imparare il francese da un libro, ma dubito che il francese ti considererebbe fluente.
Martin York,

6
IMHO, il modo più efficace per imparare è iniziare con i libri, imparare il modo giusto di fare le cose, provarlo in pratica e quindi fare in modo che qualcuno critichi il tuo codice.
Dima,

@Dima: non ho dubbi su questo.
Martin York,

12

Il libro C ++ efficace insegna una serie di cose interessanti e ti farà apprezzare le funzionalità del C ++. C'è anche un efficace STL : non l'ho letto, ma sono sicuro che sarebbe un'ottima lettura se non si ha familiarità con lo STD.

La cosa importante da imparare è che dovresti usare la lingua e non reinventare costantemente la ruota . Hai già imparato a realizzarli, quindi rendi tutto più semplice per te (e gli altri!) E usa gli strumenti per tutto il loro potenziale.

Come nota a margine, incontrerai molte persone che richiedono l'uso dell'STD. Questo è altrettanto brutto della mentalità come solo usando char*- a volte non è lo strumento corretto e ce ne sono molti altri là fuori. Allo stesso modo, non scoraggiarti dal creare le tue classi container - se stai usando char*il posto migliore per farlo, è avvolto in modo sicuro all'interno di una classe.


Conosco le serie efficaci, (non le ho lette) - Ma credo che siano per problemi di buone pratiche, giusto?
Yati Sagade,

3
@yati sagade: no, quei libri sono esattamente ciò di cui hai bisogno per passare da "C con classi" a C ++ completo.
Dima,

Vedo - in realtà avevo un c ++ efficace di Meyers schierato dopo il C ++ accelerato.
Yati Sagade,

1
@Dima "Lo scopo di questo libro è di mostrarti come usare il C ++ in modo efficace. Presumo che tu conosca già il C ++ come linguaggio e che tu abbia una certa esperienza nel suo uso. Ciò che fornisco qui è una guida all'uso del linguaggio in modo che il tuo software è comprensibile, gestibile, portatile, estensibile, efficiente e probabilmente si comporterà come previsto. "- C ++ efficace. Copre anche una serie di "gotchas" che lo rendono interessante da leggere.
Pubblicazione

1
@Dima: attento qui. La seconda edizione era rivolta ai nuovi programmatori C ++ provenienti da C. La (più recente) terza edizione è più rivolta ai programmatori provenienti da lingue come Java, C # ecc.
sbi,

6

Posso consigliare la recente interpretazione di BUILD fornita da Herb Sutter. Quello chiamato " Scrivere codice C ++ moderno: come il C ++ si è evoluto negli anni ":

Molte persone pensano al C ++ come la stessa lingua che hanno sperimentato al college o semplicemente come "C con classi", ma il linguaggio C ++ si è ampiamente evoluto nel corso degli anni. In questa sessione, vedremo come utilizzare C ++ per scrivere app innovative, espressive e belle che offrono app di potenza e prestazioni. Unisciti a noi per vedere come lo standard C ++ 0x appena finito può rendere la scrittura di C ++ produttiva come molte altre lingue.

Non è una cattiva presentazione, non troppo lunga, ha alcuni suggerimenti sulle nuove funzionalità dell'ultimo standard che potrebbero darti alcuni suggerimenti su come aggiornare il tuo vecchio stile C / C ++.

Oltre a questo, devi imparare l'STL - non è complicato e ci sono molti libri, ad esempio, l'Efficace STL, o semplicemente Google per i tutorial STL per iniziare.


+1 Grazie. È stato meraviglioso. Sono felice di aver fatto questa domanda. Così tanti link meravigliosi :)
yati sagade

4

Ho letto C ++ accelerato di Andrew Koenig e Barbara Moo per aiutarmi a insegnare C ++, dopo aver lavorato con C ++ per quasi un decennio. (In effetti, stavo iniziando a armeggiare con la meta-programmazione di modelli in quel momento.) Ho ancora trovato che si trattava di una rivelazione, anche se non credo che mi abbia insegnato alcun nuovo fatto sulla lingua. 1

Ciò che mi ha insegnato, però, era guardare e usare il C ++ come linguaggio di alto livello. Non armeggiare con puntatori non elaborati deletee usare la libreria standard ove possibile.

Ho la sensazione che questo sia esattamente ciò che stai cercando.

1 Non che all'epoca non fosse rimasto nulla da insegnarmi (ce ne sono molti anche adesso, un decennio dopo), ma c'è così tanta conoscenza che puoi spremere in un libro introduttivo di 250 pagine.


1

Prima di rispondere - una nota: Idiomatic C ++ è un bersaglio mobile. Come la lingua cambia, così fanno i suoi modi di dire. In effetti, alcune funzionalità del linguaggio hanno lo scopo di permetterci di eliminare il codice idiomatico che potrebbe essere semplificato o migliorato con un po 'di supporto dal linguaggio stesso, o almeno dalla libreria standard. Quindi tieni presente che qualsiasi fonte può solo informarti su ciò che era idiomatico al momento della scrittura .

Detto questo, faresti bene a dare un'occhiata:

Il sito codereview.SX

La rete StackExchange ha un sito chiamato codereview.stackexchange.com . Se hai scritto un pezzo di codice C ++ - una classe, una parte di una libreria, qualcosa di non eccessivamente grande - puoi pubblicarlo lì e chiedere alla community di esaminarlo. Si noti che il codice deve essere compilato ed essere sostanzialmente funzionale - quel sito non è per il debug.

Inoltre, puoi cercare un po 'di codice C ++ lì, correlato a ciò su cui stai lavorando, e vedere cosa sottolineano i revisori. Potresti anche provare a rivedere tu stesso il codice pubblicato senza pubblicare una risposta, quindi a leggere ciò che gli altri hanno pensato.

Presentazioni video conferenza C ++

Esistono diverse conferenze degli sviluppatori incentrate sul C ++ ogni anno:

e quelli non sono nemmeno i soli ... comunque, ognuno di questi post video di molte / tutte le presentazioni. Ti insegneranno molto , compresi alcuni codici idiomatici e principi con i quali puoi decidere cosa dovrebbe o non dovrebbe essere idiomatico.

A volte puoi persino ottenere i deck slide degli altoparlanti.


0

Bene, i progetti open source sono un ottimo inizio. Non aspettarti di diventare un programmatore professionista in base alle tue lezioni universitarie, non sono destinate a questo (come ho scritto nella mia risposta qui ).

Sembra che tu sia consapevole della sintassi, va bene. Ora vai a leggere il codice degli altri e dai il tuo contributo per le revisioni tra pari. Imparerai molto leggendo il codice e provando a capirlo, eseguirne il debug e risolverlo e, naturalmente, aggiungendo ad esso aderendo alle convenzioni di codifica che sono già lì.

Anche i libri professionali sono un'ottima idea, come detto, e la navigazione tra le domande e le risposte su StackOverflow ti insegnerà molto (sicuramente mi insegna molto, e mi considero un professionista del C ++).


-1

Leggere molto buon codice C ++ probabilmente aiuterà. Devi vedere il codice per iniziare a farne un'idea. Inoltre, la maggior parte del codice C ++ è errata.


"la maggior parte del codice C ++ è errata" - puoi chiarire? Ho visto che la maggior parte dei progetti OSS mantiene in realtà elevati standard di qualità.
Yati Sagade,

1
I progetti, sì, ma cercare su Google come fare le cose spesso porta a cattivi esempi.
Coder

1
@yati: la mia esperienza sui progetti OSS è l'opposto.
sabato

@sbi forse - Sono stato coinvolto con il progetto Mozilla e Google Chrome (non coinvolto qui in realtà, ma tipo di apprendimento). Ho trovato la loro disciplina eccezionale!
Yati Sagade,

@yatisagade: Almeno, la maggior parte del codice C ++ esistente è stato scritto quando il linguaggio aveva caratteristiche che sono oggi essenziali per scrivere un buon codice; e la maggior parte del resto è stata scritta usando librerie scritte per funzionare con un codice così vecchio, quindi questo nuovo codice deve essere adattato a loro, in una certa misura. E tutto questo indipendentemente dal fatto che i programmatori investano il tempo e lo sforzo necessari per una progettazione e un'implementazione decenti ...
einpoklum - reintegrare Monica
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.