pemrograman generik, seberapa sering digunakan dalam industri

11

Saya melakukan pemrograman dalam lingkungan akademik saat ini, sehingga saya dapat menggunakan apa pun yang saya inginkan. Saya menggunakan pustaka grafik boost untuk beberapa hal, dan saya bertanya-tanya apakah upaya investasi dalam memahami GP lebih dalam sepadan.

Saya ingin tahu - apakah pemrograman generik (GP) banyak digunakan dalam industri? Dugaan saya adalah bahwa kebanyakan programmer jauh lebih nyaman dengan OOP atau menggunakan bahasa yang tidak menekankan atau mendukung GP, sehingga di luar memanggil STL struktur data / fungsi di C ++, kesan saya adalah bahwa GP tidak sering digunakan. dalam praktek. Tetapi, karena berada di luar industri saat ini, akan menyenangkan mendengar dari para praktisi mengenai hal ini.

(Saat saya menulis ini, saya melihat pemrograman generik bahkan bukan tag yang valid!)

bd1
sumber
Distribusi tag pada StackOverflow mungkin jauh lebih berguna sebagai bukti statistik daripada yang ada di sini. Lihat stackoverflow.com/questions/tagged/generic-programming , stackoverflow.com/questions/tagged/generics
Péter Török

Jawaban:

7

Saya ingin tahu - apakah pemrograman generik (GP) banyak digunakan dalam industri?

Ini benar-benar sangat tergantung pada konteks tim dan proyek.

Misalnya, dalam permainan video, seringkali kodenya "paling sederhana" yang mungkin (dan bahkan kadang-kadang terlalu sederhana) tetapi dalam arsitektur besar. Itu karena pengembang game memiliki banyak masalah untuk diperbaiki dan tidak ingin repot dengan pemrograman meta (itu adalah bahasa yang terpisah sangat abstrak dan sulit dipahami di dalam C ++).

Pada saat yang sama, penggunaan dasar templat sudah umum bahkan di toko-toko itu dan Anda dapat melihat beberapa optimasi berbasis templat di beberapa fungsi yang sangat spesifik dari beberapa engine.

Tetapi dalam game dev, kebanyakan orang hanya akan menghindari metaprogramming.

Sekarang, di sisi lain yang ekstrim, beberapa aplikasi pemrosesan yang sangat kompleks atau berat, yang tidak umum, memerlukan beberapa jenis pemrograman yang berat karena kinerja dan fleksibilitas (pada waktu kompilasi) persyaratan yang tidak umum. Saya sedang mengerjakan satu sekarang.

Ini tidak umum tetapi ada dan beberapa domain niche (dalam beberapa konteks tertanam ilmiah atau angka-angka) memang membutuhkan orang yang tahu banyak tentang metaprogramming atau ingin belajar.

Di tengah, kebanyakan orang hanya akan menggunakan program-meta sebagai "klien", bukan sebagai "desainer". Sebagian besar kode meta-pemrograman dibundel dalam pustaka karena pustaka adalah alat untuk kode dan apa yang lebih baik dari pustaka yang dapat beradaptasi dengan tipe khusus yang telah Anda kerjakan sampai sekarang?

Boost (http://boost.org) adalah seperangkat perpustakaan, beberapa terbuat dari metaprogramming black magic yang berat, dan digunakan di banyak toko C ++ sebagai "STL ++", perpanjangan dari STL (dan memang demikian). Tidak setiap toko menggunakannya karena beberapa alasan, seperti kompatibilitas kompiler (beberapa dorongan perpustakaan dapat membuat kompiler Anda memaafkan untuk setiap kali dia menyakiti perasaan Anda ...) dan lebih sering karena beberapa pengembang tidak suka tidak dapat memahami bagaimana alat bekerja di dalam (cobalah untuk memahami Boost.Spirit ...)

Apa pun perusahaan tempat Anda akan bekerja, sebagian akan menggunakan paradigma ini, sebagian akan sedikit atau tidak sama sekali atau bahkan melarangnya.

Tidak ada konsensus karena tidak ada yang memiliki kebutuhan, konteks atau tim yang sama.

Tapi tetap, jelas, itu digunakan. Mungkin bertanya siapa yang menggunakan dorongan pada milis mereka untuk memiliki lebih banyak contoh di dunia nyata?

Klaim
sumber
1
+1 untuk klien vs. desainer. Dalam pengalaman saya, beberapa pengembang cukup memahami implementasi mereka sehingga tidak masuk akal untuk membuat kode generik baru dalam suatu aplikasi kecuali itu membuat peningkatan besar dalam pemeliharaan. Perpustakaan yang dirancang untuk digunakan kembali secara luas jatuh dalam kondisi itu jauh lebih sering daripada aplikasi individual.
Karl Bielefeldt
Terima kasih atas jawaban terinci. Saya penggemar Boost sendiri dan mempertimbangkan apakah akan menggali BGL, yang membutuhkan pengetahuan GP lebih banyak daripada perpustakaan Boost lainnya yang mendorong saya untuk menanyakan hal ini. Komentar Anda tentang dunia pengembangan game sangat menarik. Saya kagum pada prestasi pengembangan game modern dan menarik untuk mendengar bahwa mereka mungkin terisolasi dari metodologi pemrograman yang lebih baru daripada di garis depan mereka.
bd1
Nah, pengembang game mengelola kompleksitas tingkat tinggi hanya dengan harus membuat konsep game arsitektur. Menambahkan instruksi meta hanya memperumit semuanya sehingga harus dibenarkan dengan sangat baik. Hal lain adalah bahwa banyak pengembang game bekerja pada konsol yang merupakan perangkat keras yang sangat spesifik dengan kompiler yang sangat spesifik yang tidak memungkinkan semuanya mendorong untuk dilakukan (misalnya, tidak ada pengecualian atau tidak ada pewarisan berganda atau tidak bekerja dengan benar dari dokumen kompiler (kisah nyata)). Jadi, ada alasan bagus.
Klaim
5

Saya ingin tahu - apakah pemrograman generik (GP) banyak digunakan dalam industri?

Pemrograman generik, secara akademis disebut polimorfisme parametrik , sangat sering digunakan di lapangan. Di perusahaan saya, kami menggunakannya sebagian besar untuk membangun tipe editor independen untuk data, apa pun jenisnya. Anda hanya tidak membutuhkannya sesering fitur lainnya, tetapi ini jelas merupakan fitur yang tidak ingin saya lewatkan. Anda menggunakannya saat suatu perilaku cocok dengan sejumlah besar tipe. Ini pertanda jelas bahwa Anda memerlukan obat generik ketika Anda menemukan diri Anda menulis kode yang sama beberapa kali untuk jenis yang berbeda.

Dugaan saya adalah bahwa kebanyakan programmer jauh lebih nyaman dengan OOP atau menggunakan bahasa yang tidak menekankan atau mendukung GP, sehingga di luar memanggil STL struktur data / fungsi di C ++, kesan saya adalah bahwa GP tidak sering digunakan. dalam praktek.

Setidaknya dari pengalaman saya, sudut pandang Anda salah. OOP dan pemrograman generik tidak saling eksklusif. Bahkan, Anda harus menggunakan efek sinergi menggabungkan mereka. Seperti yang saya katakan sebelumnya, alasan Anda tidak melihatnya sesering teknik lainnya adalah karena Anda tidak terlalu membutuhkannya. Tetapi ini adalah fitur yang kuat untuk dimiliki dan sangat membantu Anda menjaga kode Anda KERING . Bahasa mana yang tidak benar-benar menekankan dukungan GP dalam pemrograman tingkat tinggi? 3 dari 5 bahasa dari Tiobe Top 5 mendukung generik / templat. Dan PHP diketik secara dinamis sehingga tidak benar-benar membutuhkannya. Terus?

Elang
sumber
Poin yang diambil, saya tidak bermaksud menyiratkan bahwa OOP dan GP adalah salah satu / atau pilihan. Namun, banyak proyek yang saya lihat tampaknya benar-benar OOP di Jawa. Saya pikir versi Java yang lebih baru mendukung GP, tetapi seberapa kecil programmer Java yang menggunakan fungsi itu? Seperti yang saya katakan, saya tidak bekerja di industri dan sudut pandang saya mungkin miring, itulah sebabnya saya mengajukan pertanyaan.
bd1
@ bd1: Aplikasi lama yang ditulis sebelum Java mendukung generik, atau sebelum toolset tertentu mendukung bahwa versi Java tidak akan memiliki generik, dan pengembang dapat terus menghindari generik pada proyek tertentu, agar kode tetap konsisten. Saya sudah melihatnya, dan itu bervariasi berdasarkan proyek dan pengembang. Setiap proyek yang pernah saya lihat yang dimulai setelah dukungan untuk obat generik Java tersebar luas cenderung sering menggunakannya, jika perlu.
FrustratedWithFormsDesigner
@FrustratedWithFormsDesigner: Generik di Jawa benar-benar berbeda dari template C ++. Java generics adalah 100% gula sintaksis murni, dan tidak mendukung meta-programming.
kevin cline
"OOP dan pemrograman generik tidak saling eksklusif.": Memang, keduanya adalah bentuk polimorfisme, masing-masing ad-hoc dan polimorfisme parametrik. Jadi mereka adalah dua alat berbeda untuk berbagai jenis polimorfisme.
Giorgio
4

Templat C ++ digunakan secara luas untuk barang-barang yang berbeda dari wadah - setidaknya dalam domain masalah saya (keuangan kuantitatif). Saya bahkan berani mengatakan bahwa itu kadang-kadang digunakan terlalu sering, untuk tujuan di mana fungsi virtual biasa sudah cukup (dan tidak akan menambah waktu kompilasi begitu banyak).

Orang-orang menggunakannya untuk menghindari duplikasi kode dan untuk mencapai polimorfisme kompilasi-waktu (tanpa pengiriman virtual).

quant_dev
sumber