Apakah acara hanya digunakan untuk pemrograman GUI?
Bagaimana Anda menangani pemrograman backend normal ketika sesuatu terjadi pada hal lain ini?
Apakah acara hanya digunakan untuk pemrograman GUI?
Bagaimana Anda menangani pemrograman backend normal ketika sesuatu terjadi pada hal lain ini?
Jawaban:
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.
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).
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.
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.
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.
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)
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.
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.