Apakah ada koleksi pedoman desain yang disepakati bersama untuk memisahkan kelas Model dari kelas View / Controller di aplikasi Java Swing? Saya tidak begitu khawatir bahwa View / Controller tidak tahu apa-apa tentang Model sebagai sebaliknya: Saya ingin merancang Model saya untuk tidak memiliki pengetahuan tentang apa pun di javax.swing. Idealnya itu harus memiliki API sederhana yang memungkinkannya untuk didorong oleh sesuatu yang primitif seperti CLI. Seharusnya, secara longgar, "mesin."
Mengkomunikasikan acara GUI ke model tidak terlalu sulit - Pelaku Aksi dapat memanggil API model. Tetapi bagaimana dengan ketika model membuat perubahan negara sendiri yang perlu dipantulkan kembali ke GUI? Untuk itulah "mendengarkan", tetapi bahkan "didengarkan" tidak sepenuhnya pasif; itu mengharuskan model tahu tentang menambahkan pendengar.
Masalah khusus yang membuat saya berpikir melibatkan antrian File. Di sisi GUI ada di DefaultListModel
belakang a JList
, dan ada beberapa hal GUI untuk memilih file dari sistem file dan menambahkannya ke JList. Di sisi Model, ia ingin menarik file dari bagian bawah "antrian" ini (menyebabkan mereka menghilang dari JList) dan memprosesnya dengan cara tertentu. Bahkan, kode Model sudah ditulis - saat ini mempertahankan ArrayList<File>
dan memperlihatkan add(File)
metode publik . Tapi saya bingung bagaimana cara mendapatkan Model saya bekerja dengan View / Controller tanpa modifikasi berat, ayunan khusus untuk Model.
Saya sangat baru untuk pemrograman Java dan GUI, karena selalu melakukan pemrograman "batch" dan "back-end" sampai sekarang - maka minat saya dalam mempertahankan pembagian yang ketat antara model dan UI, jika memungkinkan dan jika dapat diajarkan.
Jawaban:
Tidak ada pedoman desain (yaitu defacto ) yang disepakati bersama untuk MVC. Ini tidak sepenuhnya sulit untuk dilakukan sendiri tetapi membutuhkan perencanaan kelas Anda dan banyak waktu dan kesabaran.
Alasan tidak ada solusi pasti adalah karena ada banyak cara untuk melakukan MVC, semua dengan pro dan kontra mereka. Jadi, cerdaslah tentang hal itu dan lakukan yang terbaik untuk Anda.
Untuk menjawab pertanyaan Anda, Anda sebenarnya juga ingin memisahkan pengontrol dari tampilan (sehingga Anda dapat menggunakan logika aturan bisnis yang sama untuk aplikasi Swing dan aplikasi konsol). Dalam contoh Swing Anda ingin memisahkan controller dari
JWindow
widget apa pun di Swing. Cara yang biasa saya lakukan (sebelum menggunakan kerangka kerja aktual) adalah membuat antarmuka untuk tampilan yang digunakan pengontrol:Untuk solusi ini selama startup Anda perlu mendaftarkan controller ke tampilan.
Ini mungkin ide yang baik untuk membuat wadah-IOC untuk melakukan semua pengaturan untuk Anda sebagai gantinya.
Bagaimanapun, dengan cara ini Anda dapat mengimplementasikan tampilan konsol saja, menggunakan pengontrol yang sama:
Bagian yang menyenangkan adalah bagaimana melakukan penanganan acara. Saya menerapkan ini dengan membiarkan tampilan mendaftar sendiri ke controller menggunakan antarmuka, ini dilakukan menggunakan pola Observer (jika Anda menggunakan .NET Anda akan menggunakan event handler sebagai gantinya). Berikut adalah contoh "pengamat dokumen" yang sederhana, yang memberi sinyal ketika dokumen telah disimpan atau dimuat.
Dengan begitu, tampilan dapat memperbarui dirinya dengan benar karena berlangganan pembaruan dokumen. Yang harus dilakukan hanyalah mengimplementasikan
DocumentObserver
antarmuka:Saya harap contoh-contoh yang memotivasi ini memberi Anda beberapa ide tentang bagaimana melakukannya sendiri. Namun saya sangat menyarankan Anda untuk mempertimbangkan menggunakan kerangka kerja di Jawa yang melakukan sebagian besar hal untuk Anda, atau Anda akan berakhir memiliki banyak kode boilerplate yang membutuhkan waktu lama untuk menulis. Ada beberapa Rich Client Platforms (RCP) yang dapat Anda gunakan yang mengimplementasikan beberapa fungsi dasar yang paling mungkin Anda butuhkan, seperti penanganan dokumen di seluruh aplikasi dan banyak penanganan acara dasar.
Ada beberapa yang bisa saya pikirkan dari kepala saya: Eclipse dan Netbeans RCP.
Anda masih perlu mengembangkan pengontrol dan model untuk diri Anda sendiri, tetapi itu sebabnya Anda menggunakan ORM. Contohnya adalah Hibernate .
Kontainer IoC memang keren, tapi ada kerangka kerja untuk ini juga. Seperti Spring (yang juga menangani data juga antara lain).
sumber
Menurut saya, terkadang kita perlu berkompromi
Seperti yang Anda katakan, alangkah baiknya jika kita dapat menyebarkan pemberitahuan perubahan secara implisit tanpa objek yang diamati memiliki infrastruktur eksplisit untuk ini. Untuk bahasa imperatif umum seperti Java, C #, C ++ arsitektur runtime mereka terlalu ringan, seperti yang sekarang. Maksud saya itu bukan bagian dari spesifikasi bahasa saat ini.
Dalam kasus khusus Anda, saya tidak berpikir itu adalah hal yang buruk untuk mendefinisikan / menggunakan beberapa antarmuka umum seperti INotifyPropertyChanged (seperti dalam c #), karena itu tidak secara otomatis digabungkan ke tampilan - itu hanya mengatakan bahwa jika saya berubah, Aku akan memberitahumu .
Sekali lagi, saya setuju itu akan bagus jika kita tidak harus menentukan sendiri notifikasi perubahan, tetapi sekali lagi jika itu implisit untuk semua kelas yang mungkin menimbulkan biaya tambahan.
sumber