C ++ Library API Design

12

Saya sedang mencari sumber yang bagus untuk belajar tentang desain API yang baik untuk pustaka C ++, melihat objek bersama / dll. Ada banyak sumber daya untuk menulis API yang bagus, kelas yang bagus, templat dan sebagainya di tingkat sumber, tetapi hampir tidak ada apa-apa tentang menempatkan hal-hal bersama dalam lib dan shared executables. Buku-buku seperti Desain Perangkat Lunak C ++ Skala Besar oleh John Lakos menarik tetapi sudah ketinggalan zaman.

Apa yang saya cari adalah saran yaitu tentang penanganan template. Dengan templat di API saya, saya sering berakhir dengan kode pustaka di executable saya (atau pustaka lainnya) jadi jika saya memperbaiki bug di sana, saya tidak bisa begitu saja meluncurkan pustaka baru tetapi harus mengkompilasi ulang dan mendistribusikan kembali semua klien dari kode itu. (dan ya, saya tahu beberapa solusi seperti mencoba instantiate setidaknya versi paling umum di dalam perpustakaan dll.)

Saya juga mencari peringatan dan hal lain yang perlu diingat untuk menjaga kompatibilitas biner saat bekerja di perpustakaan C ++.

Apakah ada situs web atau buku yang bagus tentang hal-hal seperti itu?

johannes
sumber
Saya menanganinya dengan cara ini: sivut.koti.soon.fi/~terop/GameApi.html - yaitu ketika ada template di dalam lib, tidak ada yang ada di api ...
tp1
1
std::unique_ptradalah hal yang cukup baru. Apa sebenarnya yang menurut Anda lebih cocok tentang API yang Anda usulkan? Misalnya, Anda harus mengelola semua sumber daya secara manual, misalnya menjamin kebocoran dan penghapusan ganda, misalnya? Atau cara di mana banyak dari tipe Anda memiliki satu atau dua nama huruf, membuat meramalkan tujuannya tidak mungkin?
DeadMG
1
@ tp1: Tapi Anda tidak peduli untuk memastikan bahwa saya memang menangani mereka. Anda baru saja mengatakan "HANDLE MEREKA" tanpa melakukan apa-apa. Saya tidak menanganinya dan sekarang bagaimana? Alih-alih menggunakan kelas RAII yang tidak mengizinkan kesalahan seperti itu. Jika Anda pernah menggunakannya unique_ptr, tidak mungkin menulis kode seperti itu.
DeadMG
1
@ tp1: Saya perhatikan bahwa Env dapat dihancurkan. Cukup banyak. Tampaknya tidak ada fungsi untuk mengelola objek, sama sekali. Jika saya ingin mengelola memori lebih berbutir daripada "Semua yang pernah saya buat" atau "Tidak ada", akan tampak bahwa saya kacau.
DeadMG
3
Silakan perbincangkan lebih lanjut ke Obrolan Rekayasa Perangkat Lunak . Dapatkah informasi yang berguna dimasukkan dalam pertanyaan atau jawaban?
ChrisF

Jawaban:

12

Sebenarnya ada sebuah buku yang persis apa yang Anda cari. Itu panggilan, cukup tepat, Desain API untuk C ++. Situs web buku memiliki kode sumber dari buku dan Errata juga.

Insinyur Dunia
sumber
1
Pasti memberi +1 untuk buku ini! Saya datang untuk menyarankan ini tetapi ternyata Anda mengalahkan saya untuk itu.
zxcdw
+1: Saya selesai membaca buku ini dan ini adalah sumber yang bagus. Sangat dianjurkan.
Korchkidu
3

Ini sangat tidak mungkin. Fakta sederhananya adalah bahwa kadang-kadang, Anda memerlukan kompiler untuk melakukan pekerjaan, dan Anda tidak bisa begitu saja merapikan kebutuhan itu. Tidak ada fungsi yang bisa membuat std::vectorperpustakaan bukan hanya header. Kompiler dapat membuat banyak sihir bekerja, tetapi Anda tidak dapat memilikinya tanpa memohonnya, dan itu adalah fakta kehidupan.

Inilah yang dapat Anda lakukan: jangan gunakan template di mana Anda tidak membutuhkannya. Inilah yang tidak bisa Anda lakukan: apa pun.

Fakta sederhananya adalah bahwa kompilasi ulang dengan versi baru sebenarnya tidak terlalu berat dibandingkan dengan keuntungan kinerja, keamanan, dan fungsionalitas yang bisa Anda dapatkan dengan perpustakaan yang diketik secara statis.

DeadMG
sumber
2
Saya menyebutkan itu sebagai contoh untuk dipikirkan. apa yang saya cari adalah panduan tentang masalah serupa lainnya yang harus saya persiapkan, dan praktik terbaik untuk mengatasinya.
johannes
Nah, jika semua versi baru yang melanggar kompatibilitas ABI dimasukkan ke inline-namespace baru, apa bedanya apakah itu hanya header-header atau tidak?
Deduplicator