Bagaimana saya bisa belajar menulis C ++ idiomatik?

27

Saya seorang mahasiswa ilmu komputer, dan sebagai hasilnya, saya diajari C ++ sebagai versi yang lebih baik dari C dengan kelas-kelas. Saya akhirnya mencoba menemukan kembali roda setiap kali solusi untuk masalah yang kompleks diperlukan, hanya untuk menemukan beberapa saat setelah itu, beberapa fitur bahasa atau rutin perpustakaan standar berpotensi dapat melakukan itu untuk saya.

Saya semua merasa nyaman dengan idiom char*dan *(int*)(someVoidPointer)idiom saya , tetapi baru-baru ini, setelah memberikan kontribusi (kecil) untuk proyek open-source, saya merasa itu bukan cara yang seharusnya dipikirkan seseorang ketika menulis kode C ++. Ini jauh berbeda dari C.

Menimbang bahwa saya tahu pemrograman berorientasi keberatan dengan cukup baik, dan saya baik-baik saja dengan kurva belajar yang curam, apa yang akan Anda sarankan bagi saya untuk mendapatkan pikiran saya pada jalur C ++ ketika saya sedang mengkode C ++?

yati sagade
sumber
7
Berdasarkan komentar Anda, Anda tahu sintaks C ++ dan itu saja. Anda tidak mengkode dalam C ++. The C ++ tag pada stackoverflow adalah tempat yang baik untuk memulai, itu termasuk daftar bacaan dan FAQ . Satu-satunya cara nyata untuk belajar adalah menulis kode dan mendapatkan pengguna berpengalaman untuk berkomentar. Anda dapat meletakkan kode Anda di sini untuk ditinjau. Contoh yang baik
Martin York
1
Bersamaan dengan saran @ LokiAstari (yang saya setujui), saya akan mengatakan teman-teman Anda benar, dan bekerja dengan Anda melalui Accelerated C ++ mungkin merupakan ide yang bagus. Saya menduga Anda akan menemukan bahwa skimming yang dibutuhkan jauh lebih sedikit daripada yang Anda harapkan - ini ditujukan untuk orang-orang di posisi Anda, sudah mengetahui pemrograman, dan terutama perlu mempelajari idiom C ++ modern.
Jerry Coffin
ya sebenarnya saya telah menyelesaikan dua bab pertama, tetapi hal-hal di sana sebagian besar adalah apa yang sudah saya ketahui - saya mengerti seorang penulis tidak akan hanya keluar dan menulis buku untuk saya , meskipun :) @LokiAstari terima kasih atas komentarnya yang superinformatif :)
yati sagade
3
@yatisagade Jangan berharap buku akan mengajarkan Anda mentalitas bahasa dalam beberapa bab. Ini mungkin sangat membosankan, karena Anda sudah tahu sintaksisnya, tetapi Anda harus berkomitmen untuk membaca beberapa buku C ++, membaca semuanya dan melakukan setiap latihan karena Anda benar-benar pemula dalam bahasa ini. Diajar dengan cara yang salah berarti Anda harus melipatgandakan upaya Anda, karena Anda perlu melupakan kesalahan dan mempelajari hak-hak (atau sesuatu seperti itu).
yannis
1
Saya semua merasa nyaman dengan [...] - (int) (someVoidPointer) Pernah men- debug build 64-bit sebelumnya?
Ed S.

Jawaban:

12

Berdasarkan komentar Anda, Anda tahu sintaks C ++.
Anda tidak mengkodekan dalam C ++ tetapi apa yang sering disebut sebagai C dengan kelas.

Tag C ++ pada stackoverflow adalah tempat yang baik untuk memulai, termasuk daftar bacaan dan FAQ .

Satu-satunya cara nyata untuk belajar adalah menulis kode dan mendapatkan pengguna berpengalaman untuk berkomentar. Anda dapat meletakkan kode Anda di sini untuk ditinjau. Sebuah contoh yang baik

Saya merasa nyaman dengan "char *" saya

Berhenti menggunakannya, beralih ke std :: string.

dan idiom (int) (someVoidPointer).

Hentikan penggunaannya (terpisah dari antarmuka dengan kode C). Menggunakan konsep functor memberikan beberapa keuntungan (termasuk ide encapsulating state).

Tetapi baru-baru ini, setelah memberikan kontribusi (kecil) untuk proyek OSS, saya merasa itu bukan bagaimana Anda berpikir dalam C ++. Ini jauh berbeda, meskipun C memiliki tempat sendiri.

Iya nih. C dan C ++ telah berbeda sebagai bahasa. Meskipun Anda dapat menggunakan sintaksis yang sama, apa yang dianggap sebagai kode C yang baik umumnya tidak dianggap sebagai kode C ++ yang baik (atau sebaliknya).

Beberapa teman menyarankan Accelerated C ++, tapi sekali lagi saya tahu tipe apa, dan kelas apa dan apa kelebihannya.

Anda memiliki dasar-dasar yang sangat bawah.

Bagaimana seorang programmer C ++ (termutilasi), yang kebetulan bersuara dengan konsep OO menulis program idiomatis dalam bahasa tersebut.

Dengan banyak pekerjaan :-)

Martin York
sumber
Ini bukan satu-satunya cara. Anda bisa belajar banyak dari buku-buku bagus.
Dima
1
@Dima: Tentu saja. Anda bisa belajar banyak dari buku. Tetapi tidak ada yang mengalahkan pengalaman dan menggunakan bahasa dalam kemarahan, gagal mencoba kembali gagal lagi dan mencari cara terbaik untuk melakukannya. Saya kira Anda bisa belajar bahasa Prancis dari sebuah buku tetapi saya ragu orang Prancis akan menganggap Anda fasih.
Martin York
6
IMHO, cara paling efisien untuk belajar adalah mulai dengan buku-buku, belajar cara yang benar untuk melakukan berbagai hal, mencobanya dalam praktik, dan kemudian minta seseorang mengkritik kode Anda.
Dima
@Dima: Saya tidak punya argumen dengan itu.
Martin York
12

Buku C ++ Efektif mengajarkan sejumlah hal menarik dan akan membawa Anda untuk menghargai fitur-fitur C ++. Ada juga STL Efektif - saya belum membacanya tetapi saya yakin ini akan menjadi bacaan yang bagus jika Anda tidak terbiasa dengan STD.

Hal yang penting untuk dipelajari adalah Anda harus menggunakan bahasa itu dan tidak menemukan kembali roda secara konstan . Anda telah belajar cara membuatnya, jadi buatlah mudah untuk diri Anda (dan orang lain!) Dan gunakan alat untuk semua potensi mereka.

Sebagai catatan tambahan, Anda akan bertemu dengan banyak orang yang meminta STD digunakan. Ini sama buruknya dengan pola pikir hanya dengan menggunakan char*- kadang-kadang itu bukan alat yang benar dan ada banyak lainnya di luar sana. Dalam hal yang sama, jangan berkecil hati untuk membuat kelas kontainer Anda sendiri - jika Anda akan menggunakan char*tempat terbaik untuk melakukannya, wadah itu dibungkus dengan aman di dalam kelas.

Pubby
sumber
Saya tahu tentang seri yang efektif, (belum membacanya) - Tapi saya kira mereka untuk masalah praktik terbaik, kan?
yati sagade
3
@yati sagade: tidak, buku-buku itu persis seperti apa yang Anda perlukan dari "C dengan kelas" hingga C ++ yang lengkap.
Dima
Saya mengerti - sebenarnya saya telah menggunakan c ++ yang efektif oleh Meyers setelah C ++ yang dipercepat.
yati sagade
1
@Dima "Tujuan buku ini adalah untuk menunjukkan kepada Anda cara menggunakan C ++ secara efektif. Saya berasumsi Anda sudah tahu C ++ sebagai bahasa dan bahwa Anda memiliki pengalaman dalam penggunaannya. Apa yang saya berikan di sini adalah panduan untuk menggunakan bahasa tersebut sehingga perangkat lunak Anda dapat dipahami, dipelihara, portabel, dapat dikembangkan, efisien, dan cenderung berperilaku seperti yang Anda harapkan. "- C ++ yang Efektif. Ini juga mencakup sejumlah "gotcha" yang membuatnya menarik untuk dibaca.
Pubby
1
@Dima: Hati-hati di sini. Edisi ke-2 ditujukan untuk programmer C ++ baru yang berasal dari C. Edisi ke-3 (terbaru) lebih ditujukan untuk programmer yang berasal dari bahasa-bahasa seperti Java, C # dll.
sbi
6

Saya dapat merekomendasikan BUILD baru-baru ini yang diberikan oleh Herb Sutter. Yang disebut " Menulis kode C ++ modern: bagaimana C ++ telah berkembang selama bertahun-tahun ":

Banyak orang menganggap C ++ sebagai bahasa yang sama yang mereka alami di perguruan tinggi atau hanya sebagai "C dengan kelas", tetapi bahasa C ++ telah berkembang secara luas selama bertahun-tahun. Dalam sesi ini, kita akan membahas bagaimana Anda dapat menggunakan C ++ untuk menulis aplikasi yang inovatif, ekspresif dan indah yang menghasilkan aplikasi daya dan kinerja. Bergabunglah bersama kami untuk melihat bagaimana standar C ++ 0x yang baru selesai dapat membuat penulisan C ++ sama produktifnya dengan banyak bahasa lainnya.

Ini bukan presentasi yang buruk, tidak terlalu lama, memiliki beberapa petunjuk bagus untuk fitur-fitur baru dalam standar terbaru yang akan memberi Anda beberapa petunjuk untuk memperbarui gaya C / C ++ lama Anda.

Selain itu, Anda perlu mempelajari STL - itu tidak rumit dan ada banyak buku, misalnya, STL Efektif, atau hanya google untuk tutorial STL untuk membuat Anda maju.

gbjbaanb
sumber
+1 Terima kasih. Itu luar biasa. Saya senang saya menanyakan pertanyaan ini. Begitu banyak tautan indah :)
yati sagade
4

Saya membaca Accelerated C ++ oleh Andrew Koenig dan Barbara Moo untuk membantu saya mengajar C ++, setelah bekerja dengan C ++ selama hampir satu dekade. (Bahkan, saya mulai bermain-main dengan template meta-pemrograman pada waktu itu.) Saya masih menemukan itu sebagai wahyu, meskipun saya tidak berpikir itu mengajari saya fakta baru tentang bahasa. 1

Apa yang diajarkannya kepada saya adalah melihat, dan menggunakan, C ++ sebagai bahasa tingkat tinggi. Untuk tidak bermain-main dengan pointer mentah dan deletedan menggunakan perpustakaan standar sedapat mungkin.

Saya merasa bahwa inilah yang Anda cari.

1 Bukan berarti tidak ada yang tersisa untuk mengajar saya saat itu (ada banyak bahkan sekarang, satu dekade kemudian), tetapi hanya ada begitu banyak pengetahuan yang dapat Anda peras ke dalam buku pengantar 250 halaman.

sbi
sumber
1

Sebelum menjawab - catatan: Idiomatic C ++ adalah target yang bergerak. Saat bahasa berubah, demikian juga idiom-idiomnya. Bahkan, beberapa fitur bahasa dimaksudkan untuk memungkinkan kita menghilangkan kode idiomatik yang mungkin disederhanakan atau ditingkatkan dengan beberapa dukungan dari bahasa itu sendiri, atau setidaknya perpustakaan standar. Jadi ingatlah bahwa sumber apa pun hanya dapat memberi tahu Anda tentang apa yang idiomatis pada saat penulisan .

Karena itu, Anda sebaiknya memeriksa:

Situs codereview.SX

Jaringan StackExchange memiliki situs bernama codereview.stackexchange.com . Jika Anda telah menulis sepotong kode C ++ - kelas, bagian dari perpustakaan, sesuatu yang tidak terlalu besar - Anda dapat mempostingnya di sana dan meminta komunitas untuk memeriksanya. Perhatikan bahwa kode harus dikompilasi dan pada dasarnya berfungsi - situs itu bukan untuk debugging.

Anda juga dapat mencari beberapa kode C ++ di sana, terkait dengan apa yang sedang Anda kerjakan, dan melihat apa yang ditekankan pengulas. Anda bahkan dapat mencoba meninjau sendiri kode yang diposting tanpa memposting jawaban, lalu membaca apa yang dipikirkan orang lain.

Presentasi video konferensi C ++

Ada beberapa konferensi pengembang yang berfokus pada C ++ yang diadakan setiap tahun:

dan itu bahkan bukan satu-satunya ... lagipula, masing-masing memposting video dari banyak / semua presentasi. Ini akan mengajarkan Anda banyak hal , termasuk beberapa kode idiomatis, dan prinsip yang dengannya Anda dapat memutuskan apa yang seharusnya atau tidak seharusnya idiomatik.

Kadang-kadang Anda bahkan bisa mendapatkan slide deck speaker.

einpoklum - mengembalikan Monica
sumber
0

Yah, proyek open source adalah awal yang sangat bagus. Jangan berharap untuk menjadi programmer profesional berdasarkan kelas universitas Anda, mereka tidak dimaksudkan untuk itu (seperti yang saya tulis dalam jawaban saya di sini ).

Anda tampaknya menyadari sintaks, itu bagus. Sekarang buka dan baca kode orang lain, dan kontribusikan sendiri untuk ulasan rekan. Anda akan belajar banyak dari membaca kode dan mencoba memahaminya, men-debug-nya dan memperbaikinya, dan tentu saja - menambahkannya dengan mematuhi aturan-aturan pengkodean yang sudah ada.

Buku-buku profesional juga merupakan ide yang sangat bagus, seperti yang disebutkan, dan menjelajah melalui pertanyaan dan jawaban di StackOverflow akan banyak mengajarkan Anda (pasti banyak mengajari saya, dan saya menganggap diri saya seorang profesional C ++).

littleadv
sumber
-1

Membaca banyak kode C ++ yang baik mungkin akan membantu. Anda harus melihat kode untuk mulai merasakannya. Kemudian lagi, sebagian besar kode C ++ salah.

Coder
sumber
"sebagian besar kode C ++ salah" - bisakah Anda mengklarifikasi? Saya telah melihat bahwa sebagian besar proyek OSS sebenarnya mempertahankan standar kualitas tinggi.
yati sagade
1
Proyek, ya, tetapi mencari informasi tentang cara melakukan hal-hal di Google sering kali mengarah pada contoh-contoh buruk.
Coder
1
@yati: Pengalaman saya tentang proyek OSS adalah kebalikannya.
sbi
@sbi mungkin - saya terlibat dengan proyek Mozilla dan Google Chrome (sebenarnya tidak terlibat di sini, tetapi jenis pembelajaran). Menemukan kedisiplinan mereka luar biasa!
yati sagade
@yatisagade: Paling tidak, sebagian besar kode C ++ yang ada ditulis ketika bahasa memang memiliki fitur yang saat ini penting untuk menulis kode yang baik; dan sebagian besar sisanya ditulis harus menggunakan perpustakaan yang ditulis untuk bekerja dengan kode yang lebih tua, sehingga kode yang lebih baru ini harus disesuaikan dengan mereka, sampai batas tertentu. Dan semua ini terlepas dari apakah coders menginvestasikan waktu dan upaya yang diperlukan untuk desain dan implementasi yang layak ...
einpoklum - mengembalikan Monica