Ok, saya tahu judul pertanyaan ini hampir identik dengan Kapan saya harus menggunakan pemrograman berbasis acara? tetapi jawaban dari pertanyaan tersebut tidak membantu saya dalam memutuskan apakah saya harus menggunakan acara dalam kasus tertentu yang saya hadapi.
Saya sedang mengembangkan aplikasi kecil. Ini adalah aplikasi sederhana, dan sebagian besar fungsinya adalah CRUD dasar.
Setelah peristiwa tertentu (saat memodifikasi data tertentu) aplikasi harus menulis salinan lokal dari data tersebut dalam file. Saya tidak yakin tentang apa cara terbaik untuk mengimplementasikan ini. Saya bisa:
- Kejadian kebakaran ketika data diubah dan mengikat respons (menghasilkan file) untuk peristiwa tersebut. Atau, terapkan pola pengamat. Kelihatannya seperti kompleksitas yang tidak perlu.
- Panggil kode penghasil file langsung dari kode yang memodifikasi data. Jauh lebih sederhana, tetapi tampaknya salah bahwa ketergantungan harus seperti ini, yaitu, tampaknya salah bahwa fungsionalitas inti dari aplikasi (kode yang memodifikasi data) harus digabungkan dengan tambahan (kode yang menghasilkan file cadangan). Saya tahu, bagaimanapun, bahwa aplikasi ini tidak akan berkembang ke titik di mana kopling itu menimbulkan masalah.
Apa pendekatan terbaik dalam kasus ini?
Jawaban:
Ikuti prinsip KISS: Keep It Simple, Bodoh, atau prinsip YAGNI: Anda Tidak Akan Membutuhkannya.
Anda dapat menulis kode seperti:
Atau Anda dapat menulis kode seperti:
Dengan tidak adanya alasan kuat untuk melakukan sebaliknya, ikuti rute yang lebih sederhana. Teknik seperti penanganan acara memang kuat, tetapi mereka meningkatkan kompleksitas kode Anda. Itu membutuhkan lebih banyak kode untuk bekerja, dan itu membuat apa yang terjadi dalam kode Anda lebih sulit untuk diikuti.
Peristiwa sangat penting dalam situasi yang benar (bayangkan mencoba melakukan pemrograman UI tanpa peristiwa!) Tetapi jangan menggunakannya saat Anda dapat KISS atau YAGNI sebagai gantinya.
sumber
Contoh yang Anda gambarkan dari data sederhana, di mana modifikasi memicu beberapa efek dapat dengan sempurna diimplementasikan dengan pola desain pengamat :
Pendekatan event driven bernilai investasi untuk skenario yang lebih kompleks, ketika banyak interaksi yang berbeda dapat terjadi, dalam konteks banyak ke banyak, atau jika reaksi berantai dipertimbangkan (misalnya subjek menginformasikan pengamat, yang dalam beberapa kasus ingin memodifikasi subjek atau subjek lain)
sumber
Seperti yang Anda katakan, acara adalah alat yang hebat untuk mengurangi sambungan antar kelas; jadi walaupun dapat melibatkan penulisan kode tambahan dalam beberapa bahasa tanpa dukungan bawaan untuk acara, ini mengurangi kompleksitas gambaran besar.
Acara bisa dibilang salah satu alat paling penting dalam OO (Menurut Alan Kay - Objek berkomunikasi dengan mengirim dan menerima pesan ). Jika Anda menggunakan bahasa yang memiliki dukungan bawaan untuk acara, atau memperlakukan fungsi sebagai warga negara kelas satu, maka menggunakannya adalah hal yang sulit.
Bahkan dalam bahasa tanpa dukungan bawaan, jumlah pelat untuk sesuatu seperti pola Observer cukup minim. Anda mungkin dapat menemukan perpustakaan acara generik yang layak di suatu tempat yang dapat Anda gunakan di semua aplikasi Anda untuk meminimalkan boilerplate. (Agregator acara umum atau mediator acara berguna di hampir semua jenis aplikasi).
Apakah ini berguna dalam aplikasi kecil? Saya akan mengatakan ya .
Jika Anda berpikir "Oh, tetapi itu benar-benar hanya aplikasi yang sangat kecil, itu tidak terlalu penting" , pertimbangkan:
Secara keseluruhan, ukuran aplikasi seharusnya tidak menjadi faktor penentu apakah akan mempertahankan kelas secara longgar; Prinsip SOLID tidak hanya untuk aplikasi besar, tetapi juga berlaku untuk perangkat lunak dan basis kode pada skala apa pun.
Faktanya, waktu yang dihemat dalam unit untuk menguji kelas yang longgar digabungkan secara terpisah harus melawan keseimbangan waktu tambahan yang dihabiskan untuk memisahkan kelas-kelas tersebut.
sumber
Pola pengamat dapat diimplementasikan dengan cara yang jauh lebih kecil daripada yang dijelaskan oleh artikel Wikipedia (atau buku GOF), dengan asumsi bahasa pemrograman Anda mendukung sesuatu seperti "panggilan balik" atau "delegasi". Cukup kirimkan metode panggilan balik ke kode CRUD Anda (metode pengamat, yang bisa berupa metode "menulis-ke-file" umum, atau yang kosong). Alih-alih "event firing" panggil saja callback itu.
Kode yang dihasilkan hanya akan minimal lebih kompleks daripada memanggil kode penghasil file secara langsung, tetapi tanpa kelemahan dari kopling ketat dari komponen yang tidak terkait.
Itu akan membawa Anda "terbaik dari kedua dunia", tanpa mengorbankan decoupling untuk "YAGNI".
sumber