Apakah acara hanya digunakan untuk pemrograman GUI?


57

Apakah acara hanya digunakan untuk pemrograman GUI?

Bagaimana Anda menangani pemrograman backend normal ketika sesuatu terjadi pada hal lain ini?


6
Omong-omong, Sumber Acara adalah konsep yang sepenuhnya ortogonal untuk Acara-Pemrograman. Konsep dasar Pengadaan Acara adalah Anda menyimpan "acara" atau "perubahan" ke sistem Anda, alih-alih menyimpan "keadaan" sistem Anda. Misalnya, Anda dapat memodelkan rekening bank Anda sebagai a) Saldo Anda (NEGARA) atau b) Serangkaian Transaksi (EVENTSOURCE).
ArTs

4
Tergantung pada penggunaan, "acara" biasanya hanya beberapa bentuk panggilan balik yang dibungkus dengan gula. Panggilan balik digunakan di mana-mana - jika Anda tertarik, itu mungkin kata kunci yang baik untuk memulai pencarian.
J ...

10
Saya juga akan menunjukkan bahwa bahkan jika Anda pergi sebagai level rendah sebagai mikrokontroler, Anda akan menemukan perangkat keras mengganggu fitur yang berguna dan dapat diperdebatkan. Bagus untuk sistem kontrol, atau IO dasar seperti pembuat kopi. Interupsi perangkat keras ini pada dasarnya tidak berbeda dari peristiwa.
Dan

Nggak! Contoh praktis: Peristiwa
Nodejs

2
Apakah Anda menggunakan Windows? Lihat Penampil Acara. Selamat bersenang-senang.
Marc.2377

Jawaban:


106

Nggak. Mereka sangat berguna untuk menerapkan Pengamat dan memastikan bahwa kelas tertutup untuk modifikasi.

Katakanlah kita memiliki metode yang mendaftarkan pengguna baru.

public void Register(user) {
    db.Save(user);
}

Kemudian seseorang memutuskan bahwa email harus dikirim. Kita bisa melakukan ini:

public void Register(user) {
    db.Save(user);
    emailClient.Send(new RegistrationEmail(user));
}

Tapi kami baru saja memodifikasi kelas yang seharusnya ditutup dengan modifikasi. Mungkin bagus untuk kode pseudo-sederhana ini, tetapi kemungkinan cara untuk kegilaan dalam kode produksi. Berapa lama sampai metode ini adalah 30 baris kode yang hampir tidak berhubungan dengan tujuan awal untuk menciptakan pengguna baru ??

Jauh lebih baik membiarkan kelas melakukan fungsionalitas intinya dan mengangkat suatu acara yang memberi tahu siapa pun yang mendengarkan bahwa seorang pengguna terdaftar, dan mereka dapat mengambil tindakan apa pun yang perlu mereka ambil (seperti mengirim email).

public void Register(user) {
    db.Save(user);

    RaiseUserRegisteredEvent(user);
}

Ini menjaga kode kami bersih dan fleksibel. Salah satu bagian OOP yang sering diabaikan adalah bahwa kelas mengirim pesan satu sama lain. Acara adalah pesan-pesan ini.


37
Saya membaca ini dan memikirkan kode "buat pemesanan" dan saya menangis untuk sementara waktu dan merindukan tempat yang lebih baik: '(
sara

1
+1, jawaban yang bagus. Hanya pertanyaan tangensial (ini sedikit mengganggu saya): apakah ada alasan khusus bagi Anda untuk memulai nama metode Anda (Daftar, Simpan dan Kirim) dengan huruf kapital? Tentu saja ini tidak mempengaruhi kegunaan dari jawaban ini.
Pedro A

14
@Hamsteriff Saya sebagian besar c # dev dan itulah konvensi yang diterima secara umum. Tidak ada alasan lain.
RubberDuck

6
@Hamsteriffas tambahan, apa yang Anda sebut huruf kecil tetapi berisi huruf besar di tengah sering disebut camelase, karena ada punuk di tengah. Itu membedakannya dari snake_case, di mana kata-kata huruf kecil dipisahkan oleh garis bawah, yang akrab dengan python dan sebagian besar bahasa shell, untuk beberapa nama.
Aaron

5
Acara adalah salah satu jenis pesan ini, saya akan mengatakan. Metode panggilan juga dianggap lewat pesan.
jpmc26

53

Nggak.

Contoh klasik peristiwa yang digunakan dalam logika non-GUI adalah pemicu basis data.

Pemicu adalah kode yang dieksekusi ketika peristiwa tertentu terjadi (INSERT, DELETE, dll). Rasanya seperti acara bagi saya.

Ini adalah definisi acara Wikipedia:

Dalam komputasi, suatu peristiwa adalah suatu tindakan atau kejadian yang dikenali oleh perangkat lunak yang dapat ditangani oleh perangkat lunak tersebut. Peristiwa komputer dapat dihasilkan atau dipicu oleh sistem, oleh pengguna atau dengan cara lain. Biasanya, acara ditangani secara serempak dengan alur program, yaitu, perangkat lunak mungkin memiliki satu atau lebih tempat khusus di mana acara ditangani, sering kali merupakan rangkaian acara. Sumber acara termasuk pengguna, yang dapat berinteraksi dengan perangkat lunak dengan cara, misalnya, penekanan tombol pada keyboard. Sumber lain adalah perangkat perangkat keras seperti timer. Perangkat lunak juga dapat memicu rangkaian acara sendiri ke dalam loop acara, misalnya untuk mengkomunikasikan penyelesaian tugas. Perangkat lunak yang mengubah perilakunya sebagai respons terhadap peristiwa dikatakan didorong oleh peristiwa, seringkali dengan tujuan bersifat interaktif.

Tidak semua acara dibuat oleh pengguna. Beberapa dihasilkan oleh penghitung waktu seperti crontab oleh database INSERT seperti yang saya sebutkan sebelumnya.

Definisi tersebut juga menyatakan bahwa beberapa program atau sistem "didorong oleh peristiwa, seringkali dengan tujuan menjadi interaktif" , yang darinya orang dapat memperoleh bahwa tujuan atau kegunaan acara tidak semata-mata, tetapi lebih sering, untuk menyediakan interaktivitas (seperti GUI) walaupun tidak harus GUI, karena program CLI juga bisa interaktif).


2
Saya selalu memikirkan ini ketika saya mendengar tentang pemicu basis data: thecodelesscode.com/case/42
Almo

Sebagai mantan pengembang DBA sekarang saya merasa ngeri setiap kali saya mendengar orang berbicara tentang menggunakan pemicu tanpa mempertimbangkan kinerja DB yang lebih luas.
Logika Tiga Nilai

27

Pemrograman berbasis event sebenarnya juga digunakan untuk pemrograman server yang sangat performan.

Pada beban kerja server yang khas, sebagian besar waktu memproses hasil sebenarnya berasal dari I / O. Misalnya, menarik data dari hard disk (7200 RPM) dapat memakan waktu hingga 8,3 ms. Untuk prosesor GHz modern, itu sama dengan ~ 1 juta siklus clock. Jika CPU menunggu data setiap kali (tidak melakukan apa-apa), kami akan kehilangan BANYAK siklus jam.

Teknik pemrograman tradisional menyiasati ini dengan memperkenalkan beberapa utas . CPU mencoba menjalankan ratusan utas secara bersamaan. Namun, masalah model ini adalah bahwa, setiap kali CPU berganti thread, itu membutuhkan ratusan siklus clock untuk beralih konteks . Switch konteks adalah ketika CPU menyalin memori thread-local ke dalam register CPU dan juga menyimpan register / state thread lama ke dalam RAM.

Selain itu setiap utas harus menggunakan sejumlah memori untuk menyimpan kondisinya.

Saat ini, ada dorongan untuk server yang memiliki utas tunggal, yang berjalan dalam satu lingkaran. Kemudian potongan-potongan pekerjaan didorong ke pompa pesan , yang bertindak sebagai antrian untuk utas tunggal (seperti pada utas UI). Alih-alih menunggu pekerjaan untuk selesai, CPU menetapkan acara callback, untuk hal-hal seperti akses hard disk drive. Yang mengurangi pengalihan konteks.

Contoh terbaik dari server semacam itu adalah Node.js , yang telah terbukti mampu menangani 1 juta koneksi bersamaan dengan perangkat keras sederhana, sementara server Java / Tomcat akan kesulitan mencapai beberapa ribu.


2
"Perangkat keras sederhana" sedikit menyesatkan. Anda akan membutuhkan 8GB + untuk Node, selain apa pun yang digunakan OS. Dan jika Anda memiliki banyak memori, Tomcat dapat dengan mudah menangani beberapa ribu koneksi. Memang, ada perbedaan besar, tetapi tidak 1000x.
Paul Draper

@ PaulDraper tidak, itu tidak bisa. Dan tidak, tidak. Anda membutuhkan 8GB + hanya untuk tumpukan 8000 utas. Itulah perbedaan besar.
ArTs

3
@ PaulDraper selain 8GB sangat sederhana menurut standar server. Saya telah bekerja pada mesin dengan ram 128GB dan bahkan tidak dimuat sepenuhnya. Tongkat ram harganya lebih mahal dari seluruh mesin Anda.
ArTs

itu tergantung apa ukuran tumpukan Anda. Oracle / OpenJDK default ke 1MB pada kebanyakan platform untuk 64-bit, dan 512K untuk 32-bit. Jika Anda hanya mengambil default, Anda akan benar. Tapi defaultnya bukan bagaimana Anda mendapatkan koneksi Node 1M;) Bagaimanapun, 128K banyak; Anda bisa lolos dengan lebih sedikit lagi. Itu akan menjadi 1GB ruang stack untuk 8000 utas.
Paul Draper

6
Anda salah. Bahkan dengan ukuran tumpukan standar, Anda hanya perlu 8 GiB memori virtual . Memori dilakukan dengan cepat sesuai kebutuhan. Biasanya, Anda hanya perlu satu halaman per tumpukan, kecuali Anda benar-benar menggunakan memori ekstra. Dan dalam praktiknya, sebagian besar utas dalam sistem seperti itu hanya memiliki tumpukan 64-kiB itu. Penggunaan memori virtual adalah masalah besar pada OS 32-bit, tetapi tidak begitu banyak pada 64-bit. Anda menjalankan ke batas lain lebih cepat - seperti kelelahan port TCP, misalnya :) Dan di mana menurut Anda "pseudo-tumpukan" node disimpan? Itu benar, di atas tumpukan.
Luaan

10

Acara juga banyak digunakan dalam pemrograman jaringan (misalnya Nginx) untuk menghindari loop sibuk-menunggu mahal dan sebagai gantinya menyediakan antarmuka yang bersih untuk mengetahui secara tepat kapan operasi tertentu tersedia (I / O, data mendesak dll). Ini juga solusi untuk masalah C10k .

Gagasan dasarnya adalah menyediakan OS satu set soket (mis. Koneksi jaringan) untuk memantau acara, semuanya atau hanya beberapa yang sangat Anda minati (misalnya data yang tersedia untuk dibaca); ketika aktivitas seperti itu terdeteksi oleh sistem operasi pada salah satu soket dalam daftar, Anda akan mendapatkan pemberitahuan tentang peristiwa yang Anda cari oleh API, yang kemudian Anda harus memilah dari mana asalnya dan bertindak sesuai .

Sekarang, ini adalah pandangan tingkat rendah dan abstrak, lebih jauh lagi sulit untuk mencapai skala yang baik. Namun ada banyak kerangka kerja tingkat yang lebih tinggi yang menghadapinya secara lintas platform: Twisted for Python, Boost.Asio untuk C ++ atau libevent untuk C muncul di pikiran saya.


+1 "loop sibuk menunggu mahal": dengan kata lain, ini berguna dalam setiap proses paralel yang melibatkan beberapa tidak aktif (menunggu), serta menyinkronkan antara proses tersebut (pesan atau acara). Karena banyak dari dunia nyata bekerja.
fr13d

Sangat menarik untuk mengetahui bahwa soket pada awalnya dirancang sebagai bentuk IPC pada satu mesin, sebelum jaringan ada.

5

Sistem tertanam hampir selalu inheren didorong oleh peristiwa, bahkan jika mereka tidak diprogram secara eksplisit.

Peristiwa ini berasal dari hal-hal seperti gangguan perangkat keras, penekanan tombol, pembacaan periode analog-ke-digital, kedaluwarsa timer, dll.

Sistem tertanam dengan daya rendah bahkan lebih mungkin dikendalikan oleh peristiwa; mereka menghabiskan sebagian besar waktu mereka untuk tidur (CPU tidur dalam mode daya rendah), menunggu sesuatu terjadi ("sesuatu" itu adalah suatu peristiwa).

Salah satu kerangka kerja yang paling umum dan populer untuk sistem tertanam yang didorong oleh peristiwa adalah Quantum Platform (QP) (QP juga bekerja di Linux, Windows dan OS yang mirip unix.) karena program ini tidak "berurutan" dalam arti yang khas, melainkan merupakan serangkaian "panggilan balik" yang dipanggil tergantung pada status sistem dan kejadian terkini.


3

Pesan Acara Gregor Hohpe.

Arsitektur Berbasis Acara, Gregor Hohpe.

Arsitektur SEDA , Welsh, Culler, Brewer.

bagaimana Anda menangani pemrograman backend normal ketika sesuatu terjadi lakukan hal lain ini?

Finite State Machine adalah salah satu pendekatan umum

Given(State.A)
When(Event.B)
Then(State.C)
    .and(Consequences.D)

2
1, ini bukan jawaban yang masuk akal, dan 2, FSM bukan contoh yang baik dari penggunaan acara.
whatsisname

1
FSM. Saya yakin agama pastafarian mengamati sejumlah acara ;-)
fr13d

0

Dalam sistem tertanam, peristiwa terjadi selama interupsi. Ada banyak sumber interupsi, dari timer ke I / O.

Juga, RTOS dapat memiliki acara juga. Salah satu contoh sedang menunggu pesan dari tugas lain.


0

Untuk sistem yang tidak tertanam tetapi sesuatu yang saya lakukan di C # adalah sistem SCADA. Ada banyak peristiwa yang terkait dengan apa yang terjadi di gudang ketika beban diturunkan bagian dari peristiwa yang dihasilkan sistem dan bagian lainnya sedang menulis keadaan baru ke database. Kami tentu saja memiliki beberapa klien GUI tetapi itu hanya untuk menunjukkan keadaan database yang mencerminkan keadaan gudang. Jadi itu perangkat lunak server backend berdasarkan peristiwa dan threading. Cukup menantang untuk dikembangkan.

https://en.wikipedia.org/wiki/SCADA

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.