Saya memiliki kode yang ada ini di mana mereka memiliki kelas dan metode inisialisasi di kelas itu. Diharapkan setelah objek kelas dibuat, mereka perlu memanggil inisialisasi di atasnya.
Alasan mengapa metode inisialisasi ada Objek akan dibuat lebih awal untuk memiliki cakupan global dan kemudian metode inisialisasi dipanggil nanti setelah memuat dll yang tergantung padanya.
Masalah dengan memiliki inisialisasi Kelas sekarang memiliki bool ini diinisialisasi yang perlu diperiksa di setiap metode sebelum melanjutkan dan mengembalikan kesalahan jika tidak diinisialisasi. Sederhananya, itu adalah rasa sakit yang besar.
Salah satu solusi yang mungkin Inisialisasi dalam konstruktor. Hanya memiliki pointer ke objek dalam lingkup global. Buat objek yang sebenarnya setelah dll dimuat.
Masalah dengan solusi di atas Siapa pun yang membuat objek dari kelas ini perlu tahu bahwa itu perlu dibuat hanya setelah dll dimuat atau yang lain itu akan gagal.
Apakah ini dapat diterima?
call_once
di C ++ 11 . Proyek-proyek yang belum menggunakan C ++ 11 harus mempelajari bagaimana call_once diimplementasikan dalam C ++ 11 (fokus pada masalah apa yang dipecahkannya, dan kemudian bagaimana), dan kemudian mengimplementasikannya kembali dalam rasa C ++ mereka (basi). Dibutuhkan sinkronisasi primitif multi-utas yang aman, yang kondisinya perlu diinisialisasi secara statis (dengan nilai konstan). Perhatikan bahwa kompiler pra-C ++ 11 mungkin memiliki keistimewaan lain yang perlu dipenuhi.Jawaban:
Kedengarannya seperti pekerjaan untuk proxy virtual.
Anda bisa membuat proxy virtual yang berisi referensi ke objek yang dimaksud. Meskipun DLL tidak dimuat, Proxy dapat menawarkan perilaku default tertentu kepada klien, setelah DLL dimuat, proksi hanya akan meneruskan semua permintaan ke subjek yang sebenarnya.
Proxy virtual akan bertanggung jawab untuk memeriksa inisialisasi DLL dan berdasarkan ini memutuskan apakah permintaan tersebut harus didelegasikan ke subjek nyata.
Pola Proxy di Wikipedia
Bagaimana Anda menyukai ide ini?
sumber
Tidak ada yang berguna terjadi jika DLL belum dimuat; objek hanya menghasilkan kesalahan. Apakah ini kesalahan fatal? Bagaimana cara mengatasi kesalahan?
Apakah metodologi pengujian Anda memastikan bahwa kesalahan ini tidak pernah terjadi pada produk jadi?
Kedengarannya seperti pekerjaan untuk pengujian, bukan untuk desain arsitektur. Jangan hanya mengembalikan kesalahan,
assert
bahwa itu tidak pernah terjadi.Perbaiki setiap klien dari kelas yang saat ini menangkap dan mengabaikan kesalahan untuk tidak mencoba dan menyebabkannya di tempat pertama.
Pola multithreaded mungkin untuk menetapkan variabel kondisi bersama setelah memuat DLL, dan meminta konstruktor objek menunggu (dan memblokir utas lainnya) hingga DLL dimuat.
sumber
Hal pertama: hindari objek global sebagai hama, kecuali kondisinya tidak pernah berubah (konfigurasi).
Sekarang, jika Anda terjebak dengan itu, untuk alasan apa pun, ada beberapa desain yang mungkin bisa membantu Anda.
Saya datang dengan dua ide:
Gunakan Facade untuk memuat DLL. Objek hanya dapat diakses melalui Fasad, Fasad memuat DLL saat membuat dan membuat Instansiate objek pada saat yang sama.
Gunakan Proxy, tapi yang pintar;)
Izinkan saya menguraikan poin kedua, karena saya khawatir jawaban @edalorzo mungkin menakutkan Anda:
Sekarang Anda hanya memiliki satu cek.
Ini juga dapat dilakukan melalui beberapa jenis penunjuk pintar:
Di sini Anda hanya menyediakan ruang untuk penunjuk, awalnya nol, dan hanya ketika DLL dimuat Anda benar-benar akan mengalokasikan objek. Semua akses sebelumnya harus meningkatkan pengecualian (NullException: p?) Atau menghentikan program (bersih).
sumber
Ini pertanyaan yang sulit. Saya merasa bahwa arsitektur dapat membantu masalah ini.
Dari buktinya, sepertinya .dll tidak dimuat saat program dimuat. Hampir terdengar seperti plugin.
Satu hal yang terlintas dalam pikiran adalah bahwa Anda harus menginisialisasi .dll. Pemrogram harus berasumsi bahwa objek tidak akan kembali dengan andal, lagipula. Anda mungkin dapat mengambil keuntungan dari ini (
bool isObjectLoaded() { return isInitialized; }
), tetapi Anda pasti akan mendapatkan lebih banyak laporan bug dari cek Anda.Saya sedang memikirkan seorang singleton.
Jika Anda memanggil singleton, itu harus mengembalikan objek yang benar jika dapat mengambil satu. Jika tidak dapat mengembalikan objek yang benar, maka Anda harus mendapatkan beberapa nilai kesalahan / nullptr / objek dasar kosong. Ini tidak akan berhasil jika benda itu bisa mati pada Anda.
Selain itu, jika Anda membutuhkan beberapa instance objek, Anda dapat menggunakan sesuatu seperti Factory.
sumber