Mayoritas GUI Toolkit saat ini menggunakan model Sinyal + Slot. Itu Qt dan GTK +, kalau saya tidak salah, yang memelopori itu.
Anda tahu, widget atau objek grafis (kadang-kadang bahkan yang tidak ditampilkan) mengirim sinyal ke pengendali loop utama. Handler loop utama kemudian memanggil peristiwa , callback atau slot yang ditetapkan untuk widget / objek grafis. Biasanya ada virtual
pengendali event default (dan dalam kebanyakan kasus ) sudah disediakan oleh toolkit untuk menangani semua sinyal yang telah ditentukan, oleh karena itu, tidak seperti desain sebelumnya di mana pengembang harus menulis seluruh loop-utama dan handler untuk masing-masing dan setiap pesan sendiri (pikirkan WINAPI), pengembang hanya perlu khawatir tentang sinyal yang ia butuhkan untuk mengimplementasikan fungsionalitas baru.
Sekarang desain ini digunakan di sebagian besar toolkit modern sejauh yang saya tahu. Ada Qt, GTK +, FLTK dll. Ada Java Swing. C # bahkan memiliki fitur bahasa untuknya (acara dan delegasi), dan Formulir Windows telah dikembangkan pada desain ini. Bahkan, selama dekade terakhir, desain untuk pemrograman GUI ini telah menjadi semacam standar tidak tertulis. Karena meningkatkan produktivitas dan memberikan abstraksi yang lebih besar.
Namun, pertanyaan saya adalah:
Apakah ada desain alternatif, yang paralel atau praktis untuk pemrograman GUI modern?
yaitu apakah desain Sinyal + Slot, satu-satunya yang praktis di kota? Apakah layak untuk melakukan Pemrograman GUI dengan desain lain ? Apakah ada toolkit GUI modern (lebih disukai sukses dan populer) yang dibangun berdasarkan desain alternatif?
sumber
std::function
, bukan sinyal asinkron. Selain itu, WinAPI tidak memberikanDefWindowProc
yang memproses pesan Windows sebagai implementasi standar. Jadi saya akan berpendapat bahwa pertanyaan Anda didasarkan pada logika yang salah.Jawaban:
Meskipun saya tidak akan menyebutnya semua yang populer, selalu ada pemrograman reaktif untuk GUI, terutama pemrograman reaktif fungsional , seperti yang diterapkan, misalnya, oleh NET Rx Kerangka , serta oleh beberapa toolkit di agak lebih esoteris bahasa / platform , seperti pisang reaktif atau FrTime , masing-masing untuk Haskell dan Racket .
sumber
Itu subjek favorit saya, dan selama sekitar satu dekade ('70 -an hingga '86) saya berpikir bahwa memiliki GUI yang terdiri dari objek yang merespons peristiwa adalah cara yang tepat untuk melakukannya.
Kemudian saya menemukan cara lain untuk melakukannya dijelaskan di sini dan dengan proyek sourceforge di sini .
Singkatnya, masalah dengan objek adalah bahwa mereka bertahan, dan jika Anda menulis kode untuk membuatnya, Anda juga harus menulis kode untuk memodifikasinya secara bertahap jika diperlukan perubahan, dan entah bagaimana mengirim pesan ke dan dari mereka. Bukankah lebih baik jika Anda bisa melukis apa yang Anda inginkan, dan mengecatnya kembali jika Anda menginginkan sesuatu yang berbeda, dan tidak perlu khawatir tentang kegigihan objek sebelumnya? Bukankah lebih baik jika Anda tidak pernah menulis kode untuk penanganan pesan, karena semuanya dilakukan di bawah tenda?
Itulah yang dilakukan paket itu. Untuk dialog sederhana, ini menyimpan urutan besarnya dalam kode. Untuk dialog dinamis yang berubah secara kompleks, itu memungkinkan.
PS Saya hanya melakukan ini untuk UI desktop dan UI terminal jarak jauh, bukan UI browser web. Saya yakin itu mungkin, tetapi saya belum memiliki kesempatan untuk mencobanya.
sumber
Nah, ada dua cara berbeda untuk melakukannya:
Berikut ini contoh untuk pendekatan kedua:
Dan sekarang Anda dapat membangun sebuah
LabelButton
melawanLabledAction
dan kode klien hanya dapat mengimplementasikannya atau menggunakan beberapa implementasi standar generik, jika tersedia dan cocok.Di satu sisi pendekatan kedua kurang fleksibel, tetapi lebih kaku. Anda tidak hanya entah bagaimana menyatukan pandangan dengan model melalui cara yang relatif atom. Anda merancang GUI yang sesuai berdasarkan kebutuhan Anda dan kemudian Anda mengimplementasikan adaptor antara GUI itu dan logika domain / aplikasi Anda.
sumber
Beberapa jenis sistem kontrol menggunakan pendekatan basis data - setiap kendali gui ditautkan ke arsip dalam basis data sehingga Gui selalu mencerminkan keadaan basis data. DB hooks digunakan untuk memicu fungsi ketika suatu nilai berubah.
sumber