Menggunakan C ++ tetapi tidak menggunakan fitur spesifik bahasa, haruskah beralih ke C?


16

Saya sedang mengembangkan emulator NES sebagai hobi, di waktu senggang saya. Saya menggunakan C ++ karena bahasa yang saya gunakan kebanyakan, tahu sebagian besar dan suka kebanyakan.

Tapi sekarang saya membuat beberapa kemajuan dalam proyek saya menyadari saya tidak menggunakan hampir semua fitur spesifik C ++, dan bisa melakukannya di C polos dan mendapatkan hasil yang sama. Saya tidak menggunakan templat, kelebihan operator, polimorfisme, pewarisan. Jadi, apa yang akan Anda katakan? saya harus tetap di C ++ atau menulis ulang di C?

Saya tidak akan melakukan ini untuk mendapatkan kinerja, itu bisa datang sebagai efek samping, tetapi idenya adalah mengapa saya harus menggunakan C ++ jika saya tidak membutuhkannya?

Satu-satunya fitur C ++ yang saya gunakan adalah kelas untuk merangkum data dan metode, tetapi itu bisa dilakukan juga dengan struct dan fungsi, saya menggunakan baru dan menghapus, tetapi bisa juga menggunakan malloc dan gratis, dan saya menggunakan warisan hanya untuk panggilan balik, yang bisa dicapai dengan pointer ke fungsi.

Ingat, ini adalah proyek hobi, saya tidak punya tenggat waktu, jadi waktu overhead dan pekerjaan yang memerlukan penulisan ulang tidak masalah, mungkin menyenangkan juga. Jadi, pertanyaannya adalah C atau C ++?


3
Sepertinya saya sudah menjawab sendiri: mengapa menggunakan C ++ jika Anda hanya perlu C? Ada banyak situasi di mana C baik-baik saja.
Giorgio

3
@Iorgio: Dan mereka semua menguap setelah enam puluh detik pertama dan Anda perlu mempertahankan kode Anda.
DeadMG

7
I use C++ because is the language I use mostly, know mostly and like mostly.Dan itulah jawaban untuk pertanyaan Anda. Anda seharusnya hanya beralih bahasa di tengah proyek ketika ada masalah yang tidak dapat diselesaikan oleh bahasa Anda saat ini. I don't use templates, operator overloading, polymorphism, inheritance.Akan jauh lebih berharga untuk belajar dan menggunakan konsep, daripada beralih ke C. Karena ini adalah proyek hobi, mengapa tidak menggunakan beberapa hal yang belum pernah Anda gunakan sebelumnya? Anda selalu dapat memulai proyek lain dalam C dan mempelajari bahasa, tetapi untuk proyek Anda saat ini, tidak masuk akal untuk beralih.
yannis

4
Saya tidak menggunakan 100% bahasa dalam setiap proyek yang saya tulis. Anda tahu C ++ yang terbaik, Anda mungkin menemukan alasan bagus untuk menggunakan fitur yang belum Anda temukan sebelumnya. Anda dapat mulai memperlakukan C ++ sebagai jauh lebih aman C, setelah Anda mulai menggunakan hal-hal standar perpustakaan dan konstruksi dorongan seperti std::shared_ptr, std::unique_ptr, boost::scoped_ptr, std::vector, std::deque, std::map, dll Untuk fungsi callback, melihat ke dalam penggunaan functors, dan di C ++ 11, Anda dapat juga mulai menggunakan hal-hal seperti fungsi lambda.
wkl

3
@Iorgio: Yap. Menggulirkan daftar tertaut tak terhingga terikat untuk menghasilkan kesalahan yang tidak perlu.
DeadMG

Jawaban:


40

Anda tidak menggunakannya sekarang, tetapi pada saat Anda membocorkan memori atau mendapatkan penghapusan ganda, Anda akan memohon untuk kembali std::vector<T>, std::unique_ptr<T, Del>dan std::shared_ptr<T>, yang dapat memecahkan masalah itu dengan mudah - hampir sepele. Itulah yang terjadi pada semua orang yang menggunakan C lebih dari C ++, pada akhirnya, dan yang lebih pintar tidak menunggu bug muncul sebelum pindah.

Kode yang menggunakan newdan deletesecara langsung tidak benar-benar termasuk dalam C ++, itu termasuk dalam semacam setengah rumah yang kita sebut sebagai "C dengan Kelas". Di situlah bahasa itu sekitar tahun 1985. Ini tidak terlalu mirip dengan C ++, sekitar tahun 2011. Kemungkinan besar, di mana pun Anda belajar C ++ tidak mengajarkannya dengan sangat baik - sesuatu yang sayangnya agak umum - dan dengan pendidikan yang lebih baik, Anda harus temukan penggunaan fitur-fitur ini.

Secara khusus, seperti yang saya sebutkan di atas, struktur data generik C ++ dan kelas-kelas pengelola sumber daya secara mendasar jauh lebih unggul daripada apa pun yang ditawarkan C. Jika Anda menginginkan array yang dialokasikan secara dinamis, gunakan std::vector<T>. Itu kasus penggunaan yang cukup umum. Jika Anda tidak menggunakannya, maka kode Anda beresiko besar mengalami kesalahan yang tidak perlu - terutama terkait pengelolaan sumber daya. C ++ dapat menjamin keamanan dan penggunaan kembali kode dengan cara yang tidak pernah dapat disentuh C.

Namun, saya pikir Anda juga mungkin berharap terlalu banyak. Templat penulisan dan kelebihan operator tidak umum bagi konsumen perpustakaan. Jika kode Anda digunakan std::vector<T>, Anda tidak perlu menulis templat untuk mewujudkannya. Jika kode Anda digunakan std::string, tidak ada yang memaksa Anda untuk membebani operator Anda. Anda hanya perlu melakukan hal-hal itu untuk menulis std::vector<T> dan std::string- tetapi Anda masih dapat memanfaatkannya sepenuhnya.

Polimorfisme / warisan juga hanya memiliki kasus penggunaan khusus. Jika kode Anda tidak mengharuskan Anda untuk menulis templat apa pun atau menggunakan fungsi virtual, maka tidak, dan ada program atau segmen program di mana Anda tidak perlu menulis templat Anda sendiri.

Juga, tidak ada keuntungan dalam kinerja di C lebih dari C ++.


1
@Iorgio: make_sharedada, dan Anda dapat menulis make_uniquetemplat sepele yang melakukan pekerjaan yang sama. Lebih aman.
DeadMG

4
Jawaban yang bagus Kuku di kepala. C ++ paling berharga untuk perpustakaan kecil ini yang harus selalu kita gunakan.
Andres Jaan Tack

2
@Iorgio: Ini tidak aman karena ketika memanggil beberapa argumen seperti itu, Anda bisa mendapatkan kebocoran memori dalam kasus pengecualian, dan make_sharedlebih efisien. Hanya fungsi pabrik yang dapat menawarkan keamanan pengecualian yang dijamin.
DeadMG

6
@ tp1: WTF? Tolong gunakan bahasa inggris.
DeadMG

2
@ Lohoris Anda tidak perlu kutipan untuk akal sehat. Dengan cara apa C harus lebih berkinerja daripada C ++?
Chris berkata Reinstate Monica

7

Bahkan jika Anda tidak menggunakan fitur khusus C ++, kompiler C ++ akan menangkap lebih banyak masalah daripada yang C karena sistem tipe yang lebih ketat dari C ++.


6

Saya akan melihatnya dari arah lain. Apakah Anda mendapatkan sesuatu dengan menulis ulang kode dalam C? Bahkan pada proyek murni penghobi, ada biaya yang terkait dengan penulisan ulang seperti itu. Jika tidak ada lagi yang saya kira akan disebut biaya peluang - yaitu, hal-hal lain yang dapat Anda lakukan pada saat itu jika Anda tidak membuang waktu untuk menulis ulang dalam C.

Intinya: kecuali jika Anda berpikir kode tersebut benar-benar mungkin digunakan di beberapa lingkungan di mana akses ke C ++ benar-benar terbatas (atau tidak ada), itu akan menjadi pemborosan waktu yang sia-sia pada waktu terbaik. Setidaknya dalam pengalaman saya, biasanya melampaui yang sangat cepat - memikirkan kembali kode yang telah saya tulis dalam C ++ yang harus dikonversi ke C, saya dapat dengan jelas mengingat bahwa bahkan dalam beberapa kasus di mana sepertinya seharusnya sepele, saya menggunakan lebih banyak fitur khusus untuk C ++ daripada yang saya sadari. Untuk memiliki banyak harapan berguna sama sekali, Anda harus menargetkan C89 / 90, dalam hal ini Anda dengan cepat diingatkan tentang hal-hal seperti harus mendefinisikan semua variabel di awal blok bukannya di mana mereka sebenarnya bekas.

Singkatnya, kecuali Anda cukup yakin menulis ulang dalam C akan memberikan manfaat nyata, hampir pasti ada banyak hal yang lebih baik untuk dilakukan.


+1 Beberapa waktu yang lalu saya harus menulis perpustakaan untuk digunakan dalam proyek C lain dan saya pikir itu ide yang baik untuk juga mengimplementasikannya di C, man betapa bodohnya saya saat itu.
Chris berkata Reinstate Monica

1

Sebagai jawaban yang lebih umum:

Jangan beralih ke C ++ hanya karena Anda menggunakan beberapa fitur yang lebih unik. Suatu hari Anda mungkin memerlukan fitur-fitur itu, dan hanya akan menumbuk kepala Anda karena Anda menggunakan C.


1

Untuk pengembangan hobi, saya akan mempertimbangkan beralih kembali ke bahasa C.C dan C-like lebih cenderung didukung pada modul pengembangan hobi kecil.

Banyak jawaban di sini mungkin dari jenis perangkat lunak profesional. Sebagai seorang penghobi, Anda tidak akan dapat mengkode secara terus-menerus atau penuh waktu. Jadi pertimbangkan bahasa mana yang lebih Anda ingat atau lupakan quirks di dalamnya, jika Anda membuat tabel proyek Anda selama satu tahun dan kemudian kembali dan mencoba membaca kode Anda setelah Anda berkarat dalam pengkodean. C ++, memiliki set fitur yang lebih kaya, mungkin membutuhkan waktu lebih atau kurang untuk memperoleh kembali, tergantung pada gaya pengkodean Anda.


1

Tidak mudah untuk menjawab pertanyaan Anda, karena kami tidak tahu apakah Anda sedang mengerjakan proyek untuk meningkatkan keterampilan spesifik bahasa Anda (C vs C ++) atau untuk meningkatkan keterampilan pemrograman lainnya (desain, pemecahan masalah, dll.).

"Satu-satunya fitur C ++ yang saya gunakan adalah kelas untuk merangkum data dan metode, tetapi itu dapat dilakukan juga dengan struct dan fungsi,". Ini tidak benar. structsdi C tidak mendukung enkapsulasi dan tidak dapat berisi fungsi (metode) - setidaknya tidak tanpa menggunakan teknik seperti pointer ke fungsi. Juga, fungsi dalam C lebih lemah karena mereka tidak dapat kelebihan beban.

"Saya menggunakan baru dan menghapus, tetapi bisa juga menggunakan malloc dan gratis, dan saya menggunakan warisan hanya untuk panggilan balik, yang dapat dicapai dengan pointer ke fungsi." Seperti deadmg yang disebutkan, menggunakan secara langsung newdan deletedalam C ++ tidak dianjurkan. Juga, warisan IMHO (dan GoF) dalam OOP harus lebih disukai daripada komposisi hanya ketika polimorfisme diperlukan. Dan saya tidak berpikir bahwa itu sepele untuk mencapai polimorfisme (pengikatan lanjut) dalam C menggunakan pointer ke fungsi.

Selain itu, saya tidak akan mencoba meyakinkan Anda bahwa C ++ "lebih baik" daripada C karena itu masalah preferensi dan selalu tergantung pada masalah yang Anda coba selesaikan (menggunakan fitur OOP untuk mengembangkan emulator NES Anda mungkin sebuah ide bagus).


1
structsdalam C dapat, pada kenyataannya, digunakan untuk merangkum metode. Anda cukup membuat struct pointer fungsi, dan menginisialisasi mereka untuk menunjuk ke fungsi mana pun yang Anda inginkan. Lihatlah lxr.linux.no/linux+v3.3/include/linux/fs.h#L1598 untuk contoh.
Robert Martin

Betul. Terima kasih atas komentarnya, saya memberikan jawabannya.
sakisk

Bagus. Satu lagi nit: fungsi dalam C dapat kelebihan beban (berpikir printf), tetapi dengan melakukan itu Anda kehilangan semua pemeriksaan jenis. Tidak ada cara untuk memiliki deklarasi terbatas yang dapat diterima: itu adalah 1 (dan Anda mendapatkan pengecekan tipe) atau "banyak" (dan kehilangan semua pengecekan tipe, dengan risiko pribadi yang besar). Seperti kebanyakan hal dalam C, itu mungkin tetapi seringkali tidak nyaman.
Robert Martin

Pointer ke fungsi adalah teknik C canggih? Betulkah?
Donal Fellows

@DonalFellows Anda benar, saya melebih-lebihkan. Dihapus lanjutan ... :)
sakisk

0

Saya seorang pemula, jadi inilah 2 bit saya.

Saya belajar C dan C ++ di Wibit.net dengan beberapa videotutorial dasar yang bagus, mungkin mereka dapat banyak membantu Anda untuk mengambil gambaran tentang "situasi" (bukan iklan!)

Saya menyarankan Anda untuk beralih ke C, hanya untuk belajar, karena Anda seorang hobi, ini akan menyenangkan, bukan masalah.

Saya menyarankan lebih banyak. Lakukan dalam kedua bahasa. Bandingkan cara dan solusi yang akan Anda temukan dan gunakan. Saya yakin itu tidak akan "semudah" seperti yang Anda harapkan ... tetapi Anda pasti akan belajar banyak!


1
Terima kasih banyak, tapi saya tidak belajar, saya sudah tahu C dan C ++, saya bertanya yang mana yang akan digunakan untuk proyek khusus ini.
Petruza

oops, waktuku untuk belajar! = P
H_7

1
Juga, saya akan menyarankan bahwa alih-alih tutorial video, Anda mendapatkan buku-buku Kernigan dan Stroustrup, sebuah IDE yang bagus (Visual Studio, Eclipse, Xcode) dan belajar dengan mengkodekan contoh, coba-coba dan kesalahan dan beralih ke stackoverflow.
Petruza

-1

Inilah pro dan kontra dari C ++ vs. C:

  1. Pindah ke C akan membuatnya lebih mudah untuk tetap berada di dalam subset C ++ yang dipilih, karena kompiler kemudian akan memberikan kesalahan ketika Anda keluar dari itu. Jika masalah utama adalah tetap berada dalam subset yang ditentukan, alternatif ini harus dipilih. (mengapa kita tidak memiliki dukungan kompiler untuk ini?)
  2. Setelah Anda dapat tetap berada dalam subset fitur c ++ yang dipilih, maka hal berikutnya adalah mencoba mengubah subset untuk menyingkirkan konvensi buruk yang melanggar kode. Ini membutuhkan penggunaan seluruh c ++.
  3. Setelah Anda berdua "tetap di dalam subset" dan "itu adalah subset yang baik", kemudian pindah ke luar fitur c ++, dan mulai memikirkan persyaratan.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.