Saya sedang mengerjakan aplikasi embedded media dalam C menggunakan teknik mirip OO. "Kelas" saya adalah modul .h / .c menggunakan struct data dan struct pointer fungsi untuk meniru enkapsulasi, polimorfisme, dan injeksi dependensi.
Sekarang, orang akan mengharapkan myModule_create(void)
fungsi untuk datang dengan myModule_destroy(pointer)
rekan. Tetapi proyek yang tertanam, sumber daya yang dipakai secara realistis tidak boleh dirilis.
Maksud saya, jika saya memiliki 4 port serial UART dan saya membuat 4 instance UART dengan pin dan pengaturan yang diperlukan, sama sekali tidak ada alasan untuk ingin menghancurkan UART # 2 di beberapa titik selama runtime.
Jadi mengikuti prinsip YAGNI (Anda tidak akan membutuhkannya), haruskah saya menghilangkan destruktor? Ini tampak sangat aneh bagi saya, tetapi saya tidak bisa memikirkan manfaatnya bagi mereka; sumber daya dibebaskan ketika perangkat mati.
sumber
myModule_create(void)
fungsi? Anda bisa membuat hard-code contoh spesifik yang Anda harapkan untuk digunakan ke antarmuka yang Anda tampilkan.Jawaban:
Glampert benar; tidak perlu untuk destruktor di sini. Mereka hanya akan membuat kode mengasapi dan jebakan bagi pengguna (menggunakan objek setelah destruktornya disebut perilaku tidak terdefinisi).
Namun, Anda harus yakin benar-benar tidak perlu membuang benda-benda itu. Misalnya, apakah Anda perlu memiliki objek untuk UART yang saat ini tidak digunakan?
sumber
Cara termudah yang saya temukan untuk mendeteksi kebocoran memori adalah keluar dari aplikasi Anda dengan bersih. Banyak kompiler / lingkungan menyediakan cara untuk memeriksa memori yang masih dialokasikan ketika aplikasi Anda keluar. Jika salah satu tidak disediakan, biasanya ada cara untuk menambahkan beberapa kode tepat sebelum keluar yang dapat menemukannya.
Jadi, saya pasti akan menyediakan konstruktor, destruktor dan logika shutdown bahkan dalam sistem embedded yang "secara teoritis" tidak boleh keluar untuk kemudahan deteksi kebocoran memori saja. Pada kenyataannya, deteksi kebocoran memori bahkan lebih penting jika kode aplikasi tidak boleh keluar.
sumber
Dalam perkembangan saya, yang banyak menggunakan tipe data buram untuk mendorong pendekatan seperti OO, saya juga bergulat dengan pertanyaan ini. Pada awalnya, saya jelas berada di kubu untuk menghilangkan destruktor dari perspektif YAGNI, serta perspektif "kode mati" MISRA. (Aku punya banyak ruang sumber daya, itu bukan pertimbangan.)
Namun ... kurangnya destruktor dapat membuat pengujian lebih sulit, seperti pada pengujian unit / integrasi otomatis. Secara konvensional, setiap tes harus mendukung pengaturan / teardown sehingga objek dapat dibuat, dimanipulasi, lalu dihancurkan. Mereka dihancurkan untuk memastikan titik awal yang bersih dan tidak ternoda untuk pengujian selanjutnya. Untuk melakukan ini, kelas membutuhkan destruktor.
Oleh karena itu, dalam pengalaman saya, "tidak" di YAGNI ternyata menjadi "adalah" dan saya akhirnya menciptakan destruktor untuk setiap kelas apakah saya pikir saya akan membutuhkannya atau tidak. Bahkan jika saya melewatkan pengujian, setidaknya ada destructor yang dirancang dengan benar ada untuk jorok miskin yang mengikutiku akan memilikinya. (Dan, untuk nilai yang jauh lebih rendah, itu membuat kode lebih dapat digunakan kembali sehingga dapat digunakan di lingkungan di mana ia akan dihancurkan.)
Sementara itu alamat YAGNI, itu tidak membahas kode mati. Untuk itu, saya menemukan bahwa kompilasi makro kondisional seperti #define BUILD_FOR_TESTING memungkinkan destructor dihilangkan dari build produksi akhir.
Melakukannya dengan cara ini: Anda memiliki destructor untuk pengujian / penggunaan kembali di masa depan, dan Anda memenuhi tujuan desain YAGNI dan aturan "no dead code".
sumber
Anda dapat memiliki destruktor no-op, sesuatu seperti
kemudian atur destructor yang
Uart
mungkin digunakan(tambahkan pemeran yang cocok jika diperlukan)
Jangan lupa mendokumentasikan. Mungkin Anda menginginkannya
Atau, kasus khusus dalam kode umum memanggil destruktor kasus ketika fungsi pointer destruktor adalah
NULL
untuk menghindari memanggilnya.sumber