Adakah Alternatif Praktis dari model Sinyal + Slot untuk Pemrograman GUI?


9

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 virtualpengendali 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?


Paradigma antrian pesan yang Anda temukan di Windows API tidak seperti acara dan delegasi. Delegasi dipanggil secara sinkron dan segera, seperti std::function, bukan sinyal asinkron. Selain itu, WinAPI tidak memberikan DefWindowProcyang memproses pesan Windows sebagai implementasi standar. Jadi saya akan berpendapat bahwa pertanyaan Anda didasarkan pada logika yang salah.
DeadMG

2
QT dan GTK + masih jauh dari kerangka GUI pertama yang menggunakan pendekatan event-driven. Konsep ini kembali ke Smalltalk-80 ( en.wikipedia.org/wiki/Smalltalk ).
Doc Brown

Pertanyaan menarik, saya ingin tahu apakah model ini banyak berubah dengan antarmuka multi-sentuh.
Ben DeMott

Saya akan bermurah hati dan menganggap dia tahu tentang SendMessage yang sinkron, bukan hanya PostMessage. Namun, dia masih salah karena Anda tidak perlu menulis seluruh loop penanganan pesan untuk setiap pesan.
gbjbaanb

JavaFx menyediakan mekanisme serupa melalui API Bindings-nya.
Eng.Fouad

Jawaban:



5

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.


+1, Tetapi bagaimana mungkin untuk mencapai fungsionalitas tambahan, seperti input yang ditentukan pengguna?
ApprenticeHacker

@IntermediateHacker: Saya tidak yakin apa yang Anda maksud dengan input yang ditentukan pengguna. Maksud Anda memiliki aplikasi perancang formulir?
Mike Dunlavey

2

Nah, ada dua cara berbeda untuk melakukannya:

  1. Mintalah setiap widget membuka mekanisme berlangganan granular (Signal / Slot, Observer / Observable, Event / Delegate) dan minta kode klien berlangganan dan mengambil tindakan yang sesuai.
  2. Bangun widget terhadap abstraksi data yang disajikannya dan minta kode klien mengimplementasikan abstraksi itu.

Berikut ini contoh untuk pendekatan kedua:

interface Action {
     void execute();
     Bool isEnabled();
     Null<String> description();//used for tooltip
}
interface LabledAction extends Action {
     String getName();
}

Dan sekarang Anda dapat membangun sebuah LabelButtonmelawan LabledActiondan 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.


Model / View / Controller itu bagus, tapi itu hanya perpanjangan dari pola pengamat, karena bagian pengontrol hanya pengamat dari widget dan di bagian model widget adalah pengamat dari model, jadi itu adalah mekanisme yang sama dengan cara sebaliknya .
Jan Hudec

1

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.


4
bukankah ini masih slot sinyal hanya dengan lapisan DB tambahan?
ratchet freak

Pada akhirnya di bawahnya itu semua interupsi atau panggilan balik - mereka adalah satu-satunya operasi tingkat rendah yang rendah
Martin Beckett
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.