Pada pertanyaan terkait , telah diklarifikasi mengapa C ++ tidak kompatibel dengan C dalam banyak aspek. Namun C ++ masih merupakan bahasa "hybrid" *. Dan sayangnya, banyak programmer masih menganggap C ++ sebagai "C dengan stream dan string bawaan". Yang menghasilkan kode tertulis yang benar-benar buruk, bahwa itu bukan C ++ atau C. IMHO, akan lebih baik jika bahasa / kompiler dipaksa sampai batas tertentu programmer untuk menulis kode yang lebih elegan. Jadi, apakah ada alasan untuk mempertahankan hibrida C ++ modern (misalnya C ++ 0x dan versi mendatang)?
* Dengan hibrid yang saya maksudkan adalah tergantung pada programmer untuk memutuskan apakah dia akan menggunakan: string dan stream standar, kelas, ruang nama selain dari default, dll.
sumber
Object
dan nilai penyalinan biner dan susunan asosiatif yang diramalkan bahasa (mengapa ...) bersama dengan keputusan desain lainnya yang dipertanyakan dari miliknya sendiri. Selain itu, secara efektif juga memiliki paradigma GC yang sama dengan yang lain, jadi saya akan mempertanyakan penggunaan memori yang rendah.Jawaban:
Ya, ada alasan kuat: kode C ++ hampir selalu harus memanggil kode C yang ada. Yang terbaik yang bisa kita lakukan adalah membuatnya mudah untuk menulis kode yang baik. Tidak ada yang bisa dilakukan oleh perancang bahasa untuk membuatnya tidak mungkin menulis kode yang buruk.
sumber
The best we can do is make it easy to write good code.
- Apakah kita berbicara tentang C ++ yang sama?Tidak, tidak akan. Sama sekali. Sebagai demonstrasi sepele tentang mengapa, jelaskan anggun, dan kemudian saya bertaruh bahwa sepuluh orang akan datang untuk tidak setuju dengan Anda.
Gaya pengkodean yang didukung bahasa benar-benar buruk. Belum lagi semua kode lawas yang akan rusak.
Khususnya, standar string dan aliran sebenarnya menyedot .
std::string
tidak memiliki dukungan Unicode dan antarmuka kembung terburuk yang dapat Anda bayangkan. Streaming memiliki overhead yang mengerikan dan desain yang buruk, bahkan beralih ke warisan virtual, dan pointer fungsi, danconst char*
dan uglies seperti itu. Saya tidak akan menghukum siapa pun karena sepenuhnya mengganti kedua kelas / grup kelas dengan yang kustom.Tidak menggunakan kelas dan ruang nama tidak masalah untuk kode gaya papan tulis, dan ada banyak, banyak perpustakaan yang menyediakan fungsi yang tidak ada di kelas. Kelas paksa adalah ide yang sangat buruk.
sumber
C ++ adalah hibrid bukan karena memungkinkan seseorang untuk menulis kode gaya-C, tetapi karena mendukung beberapa paradigma pemrograman, seperti prosedural, berorientasi objek, dan generik. C ++ tidak memaksa Anda menjadi satu cara melakukan sesuatu, dan itulah kekuatannya, karena masalah yang berbeda dapat diselesaikan dengan lebih mudah menggunakan paradigma yang berbeda.
Maka pertama-tama Anda harus mendefinisikan apa arti elegan . Maka Anda harus melihat apakah definisi Anda tentang elegan sesuai untuk semua domain masalah dan platform yang digunakan C ++. Gaya pengkodean yang elegan untuk menulis pengolah kata untuk Windows mungkin sama sekali tidak cocok untuk menulis sistem tertanam.
Pertimbangkan untuk menulis kode C ++ untuk dijalankan pada DSP. Pertama, kompiler C ++ untuk DSP itu mungkin tidak mendukung fitur C ++ tertentu, seperti stream. Kedua, Anda sangat dibatasi oleh kecepatan CPU, dan mungkin memori, sehingga beberapa fitur C ++ hanya dapat membunuh kinerja Anda. Misalnya Anda mungkin harus menghindari fungsi virtual demi kecepatan. Pertimbangan seperti itu akan secara radikal mengubah gaya pemrograman Anda, dibandingkan dengan apa yang akan Anda gunakan pada PC, dan C ++ memungkinkan itu.
Sebagai rangkuman, C ++ adalah bahasa yang besar dan rumit dengan banyak fitur. Ada banyak alasan mengapa setiap himpunan bagian dari fitur-fitur itu mungkin tidak dapat diterapkan pada proyek tertentu: kecepatan, portabilitas, dukungan kompiler, atau bahkan pengalaman programmer dan keakraban. Untuk alasan itu bahasa memaksa pengembang untuk menggunakan fitur tertentu sebagai lawan dari yang lain untuk tugas yang diberikan adalah ide yang buruk. Pikirkan Java, di mana bahasa mengamanatkan bahwa setiap fungsi harus menjadi metode kelas. Ada begitu banyak kasus ketika membuat kelas hanya untuk membungkus metode adalah canggung dan tidak perlu, namun Anda harus melakukannya karena bahasa memaksa Anda untuk melakukannya.
sumber
Tidak ada satupun memaksa siapa pun untuk menggunakan C ++ sejak awal. Jika bahasa tidak sesuai dengan Anda, maka gunakan yang berbeda - ada banyak bahasa yang ditagih sebagai "C ++ tanpa C".
Filosofi desain C ++ adalah membiarkan programmer memutuskan. Jika mereka ingin menembak diri mereka sendiri di kaki kemudian biarkan mereka. Ini memungkinkan banyak hal buruk untuk dilakukan, tetapi juga memungkinkan banyak fleksibilitas. Misalnya, tidak mungkin Boost dapat ditulis dalam bahasa seperti Java karena memanfaatkan fitur bahasa dan praktik yang biasanya dihindari. Ini juga tidak mungkin bahwa C ++ akan tumbuh sebesar sekarang ini - memiliki akses ke pustaka C yang luas merupakan nilai tambah yang besar, ambil atau tinggalkan.
Kompatibilitas C ++ dengan C jelas merupakan salah satu poin terlemahnya, tetapi juga perlu diingat bahwa itu adalah salah satu yang terhebat.
Saya akan menambahkan kutipan indah dari Jon Purdy yang menurut saya sangat relevan:
Menghapus hibrida dapat meningkatkan keanggunan, tetapi menghambat kemampuan.
sumber
Jika komite berusaha memaksa orang untuk menggunakan (anggapan seseorang) bahasa yang lebih elegan, itu mungkin akan diabaikan. Orang akan terus melakukan apa yang mereka inginkan, dan vendor kompiler akan mengikuti pasar (tetapi vendor kompiler memiliki cukup perwakilan di komite untuk mencegah hal ini).
Sebagian besar dari apa yang Anda anjurkan sebenarnya masalah penilaian, berdasarkan pada domain masalah. Ada banyak program kecil yang tidak perlu (misalnya) ruang nama. Mencoba memaksa saya untuk menggunakan namespace ketika saya sedang menulis filter teks 30-baris akan menjadi bodoh dan sombong. Bahkan jika Anda memutuskan itu hanya akan berlaku ketika lebih dari X baris kode, atau fungsi Y, atau apa pun yang terlibat, itu umumnya masih kontraproduktif. Ruang nama dirancang karena suatu alasan, untuk mencegah / menyembuhkan masalah tertentu. Mencoba memaksakan penggunaannya tanpa adanya masalah itu tidak menghasilkan apa-apa yang berguna bagi siapa pun.
Pada saat yang sama, saya pikir perlu dicatat bahwa beberapa orang benar-benar menghabiskan banyak waktu dan usaha untuk tidak hanya mengaktifkan keanggunan dalam C ++, tetapi untuk mengajar dan mengarahkan orang untuk menggunakan kemampuan tersebut untuk menulis kode yang lebih baik (misalnya, banyak Meningkatkan kontributor). Dengan demikian, orang-orang yang terus bersikeras menulis kode mereka sebagai "C dengan kelas" cukup banyak mengabaikan apa yang ada di luar sana. Saya pikir mereka akan sama nyamannya mengabaikan kompiler baru karena mereka mengabaikan semua yang telah dipelajari tentang cara menggunakan C ++ selama dekade terakhir atau lebih (misalnya, Desain C ++ Modern diterbitkan 11 tahun yang lalu sekarang - tetapi sebagian besar orang Anda sedang berbicara tentang rupanya belum pernah mendengarnya, apalagi membaca atau memahami bahkan bagian yang paling sederhana).
sumber
Gagasan Anda merupakan dasar pemikiran desain di balik Jawa. Java memaksa Anda untuk menggunakan kelas, mengatur hierarki file sesuai dengan hierarki paket, menangkap pengecualian, dll. Orang-orang masih berhasil menulis kode mirip-C di dalamnya.
Sebagai programmer, kita kadang lupa solusi terbaik mungkin bukan solusi teknis. Peer reviews adalah solusi paling dikenal dalam hal ini.
sumber
C ++ tidak memiliki "satu cara yang benar"; setiap pendekatan memiliki kelebihan dan kekurangan. Solusinya dapat ditulis dengan seratus cara berbeda.
Anda sebagai pengembang perangkat lunak harus memutuskan pendekatan mana yang terbaik untuk tugas yang dihadapi.
sumber
Saya pikir fakta bahwa semua hal yang Anda daftarkan adalah opsional menciptakan potensi untuk lebih elegan, bukan lebih sedikit. Fitur yang digunakan secara tidak perlu tidak tepat bagi saya.
Masalah yang perlu kita pecahkan menggunakan pemrograman sangat berbeda.
Beberapa diselesaikan dengan baik menggunakan prinsip-prinsip OO (misalnya GUI), beberapa meminjamkan diri mereka lebih baik untuk perawatan murni fungsional (misalnya hal-hal numerik), sementara beberapa yang terbaik dinyatakan dalam bahasa "dekat dengan silikon" tingkat rendah.
Banyak perangkat lunak perlu menyelesaikan submasalah yang paling baik diselesaikan dengan salah satu cara itu. Memaksa solusi ke dalam bentuk tertentu hanya akan mengarah pada kode yang kurang sesuai dengan tujuannya (Anda bahkan mungkin mengatakan "kurang elegan").
Inilah sebabnya mengapa hibriditas dari C ++ adalah hal yang baik - ini memungkinkan kita memecahkan berbagai masalah dengan cara yang sesuai dengan masalah , bukan dogma saat ini.
Tentu saja itu dapat disalahgunakan - setiap kali Anda memiliki hal yang fleksibel ada risiko Anda menekuknya dengan cara yang buruk - tetapi keanggunan berasal dari pemikiran dan pengalaman yang hati-hati, bukan dari kepatuhan terhadap apa pun yang menjadi tren.
sumber