Desain pola dalam menulis perangkat lunak numerik dalam C ++

13

Saya mencari sumber daya pada pola desain dan prinsip - prinsip untuk perangkat lunak numerik, berpotensi tetapi tidak harus dengan fokus pada pendekatan berorientasi objek untuk kode numerik.

Saya mengetahui teksnya, Menulis Perangkat Lunak Ilmiah: Panduan untuk Gaya yang Baik , tetapi ini masih banyak berhubungan dengan hal-hal seperti masalah titik apung, bagaimana dan kapan mengoptimalkan, dll.

Saya mencari informasi tentang gambar yang lebih besar dalam merancang kode numerik, bukan pada apa pun yang berkaitan dengan algoritma dan sejenisnya.

Saya berharap ada sumber daya untuk ini, dan orang tidak boleh hanya pergi melalui perpustakaan setelah perpustakaan, terutama karena tidak ada panduan yang melakukan hal-hal yang dirancang dengan bijak, terlepas dari pengetahuan saya sendiri tentang idiom dan praktik yang baik dalam C ++.

(Ini bukan khusus bahasa, tetapi jika ada konten khusus bahasa, saya lebih suka C ++.)

pengguna1997744
sumber
Saya sering berpikir untuk menulis buku seperti itu; tetapi jangkauan pendekatan yang mungkin sangat besar (dan sangat bergantung pada teknik numerik utama + domain masalah) dan yang dibutuhkan lebih seperti ensiklopedia. Juga, tidak ada satu orang pun yang dapat memahami semua kemungkinan. Yang terbaik dapat dilakukan jika mengikuti praktik perangkat lunak tradisional mengingat perkembangan perangkat keras. Apa teknik dan domain yang Anda minati?
Biswajit Banerjee
2
Referensi lain yang bermanfaat yang tidak tepat sasaran adalah "Penghitungan Efektif dalam Fisika" oleh Anthony Scopatz dan Kathryn Huff.
Brian Borchers
@BrianBorchers Hm, tampaknya setengah dari itu dalam pengantar Python dan kemudian berfokus pada alat pengembangan.
user1997744

Jawaban:

8

Setelah mengembangkan perangkat lunak numerik selama 20 tahun sekarang, saya menemukan bahwa kami mungkin telah menggunakan sebagian besar pola desain yang dijelaskan dalam Buku oleh Geng Empat ( lihat di sini ). Pada akhirnya, perangkat lunak numerik hanyalah perangkat lunak berskala besar dan kompleks, jadi mungkin tidak mengherankan jika pertimbangan desain yang sama berlaku seperti pada perangkat lunak lain.

Tentu saja ada sejumlah kasus yang benar-benar spesifik untuk algoritme numerik (lihat, misalnya, di sini ) tetapi mengetahui serangkaian pola desain "tradisional" sebenarnya sudah merupakan awal yang baik.

Wolfgang Bangerth
sumber
Saya ingin menambahkan bahwa, untuk perhitungan numerik pada perangkat keras yang lebih baru, kita harus berusaha untuk meminimalkan pengejaran pointer (yang banyak digunakan oleh pola Gang of Four). Titik awal yang baik untuk desain C ++ adalah github.com/isocpp/CppCoreGuidelines/blob/master/…
Biswajit Banerjee
@BiswajitBanerjee Ya, pedoman inti C ++ adalah pengetahuan dasar bagi siapa saja yang menggunakan C ++ modern. Herb Sutter adalah salah satu editor dan Anda selalu dapat mempercayai nasihatnya.
user1997744
@ user1997744 Apakah maksud Anda Bjarne? Herb Sutter juga terkenal dengan idenya "selalu otomatis" yang mengarah pada kode hanya menulis (tidak yakin seberapa besar saya akan mempercayai penilaiannya). Juga, pedoman inti C ++ jauh dari pengetahuan dasar. Anda akan terkejut.
Biswajit Banerjee
@BiswajitBanerjee Ya, jika tidak, saya bisa mengatakan saya tidak akan pernah membiarkan kemajuan pengembang melampaui satu wawancara jika mereka tidak terbiasa dengan sebagian besar pedoman dan menggunakannya (tidak termasuk di mana kode warisan mungkin membuat itu rumit).
user1997744
6

Saya merekomendasikan Matthew G Knepley ini. Bahasa pemrograman untuk komputasi ilmiah. arXiv preprint arXiv: 1209.1711, 2012 ( https://arxiv.org/pdf/1209.1711.pdf )

Saya juga menyarankan untuk melihat dan membaca kode lain, misalnya, segitiga, PETSc, MoAB, deal.II, fenics dan banyak lainnya. Tidak semua solusi akan bekerja untuk Anda, tetapi pada akhirnya, mengatasi dan belajar dari orang lain (pengembang berpengalaman dan kode sukses) adalah pelajaran terbaik cara merancang kode.

Selain itu, saya pikir lebih baik bergabung dengan proyek yang ada dan menjadi kontributor atau pengembang. Terkadang Anda suka memulai sesuatu yang baru, tetapi Anda harus memiliki argumen yang kuat untuk melakukan itu.

likask
sumber
Argumen saya untuk memulai sesuatu yang baru adalah pengalaman belajar darinya dan rasa keberhasilan :)
user1997744
1
Saya mengerti argumen ini. Saya telah melakukan hal yang sama sejak lama. Sekarang saya pikir itu terlalu dini. Bisa jadi pada awalnya kita semua harus melakukan kesalahan yang sama. Untuk mempelajari cara berjalan terlebih dahulu, Anda harus jatuh. Menulis kode sendiri, jika ini pertama kalinya, Anda kemungkinan besar akan menjadi satu-satunya pengguna kode Anda. Berkontribusi pada kode yang dikembangkan masyarakat, pekerjaan Anda mungkin akan digunakan oleh orang lain dan ini akan memberi Anda rasa prestasi dan penghargaan. Anda akan menerima komentar / ulasan pada permintaan tarik, dari situ Anda akan belajar dan meningkatkan keterampilan Anda.
likask
Yah, tidak ada perpustakaan untuk perhitungan esoteris ultra spesifik yang perlu saya lakukan, jadi pada akhirnya saya benar-benar harus menulis sendiri meskipun tentu saja tidak perlu menemukan kembali semuanya.
user1997744
Saran bagus untuk bergabung dengan proyek open source yang ada. Saya ditarik ke jaringan pemrogram jauh lebih baik daripada saya dengan melakukan itu.
user14717