Saya menemukan setiap kali saya bekerja dengan kode GUI, kode cenderung menggembung lebih cepat daripada jenis kode lainnya. Tampaknya juga lebih sulit untuk refactor. Sedangkan dalam jenis kode lain saya dapat melakukan refactor dengan mudah - Saya menemukan saya dapat menguraikan kelas yang lebih besar menjadi bagian-bagian kecil dari fungsionalitas - dengan sebagian besar kerangka kerja GUI saya sering terikat pada kerangka kerja yang membutuhkan widget / kontrol / kelas apa saja untuk mengimplementasikan lebih banyak hal lebih langsung di widget / control / apa pun. Kadang-kadang ini karena perlu (a) mewarisi dari beberapa widget dasar / kontrol / hal atau (b) membutuhkan akses ke metode yang dilindungi.
Saya biasanya juga harus, misalnya, menanggapi berbagai macam input melalui sinyal / peristiwa / apa pun dari kerangka kerja untuk menerapkan semua mode berinteraksi dengan pengguna. Saya mungkin perlu dalam satu widget / kontrol GUI untuk menangani berbagai macam input / output yang mungkin termasuk:
- klik kanan / menu konteks
- bereaksi terhadap pilihan dari menu konteks - yang mungkin banyak
- cara khusus untuk melukis GUI
- bereaksi terhadap input keyboard
- tombol, kotak centang,
- dll
... sambil mengatur kelas di bawah GUI yang mewakili logika bisnis.
GUI lurus ke depan sederhana dapat memiliki kode tumbuh cukup cepat, bahkan ketika memisahkan logika bisnis dan menggunakan MVC, saya menemukan kode GUI adalah magnet besar untuk perubahan.
Apakah ada cara untuk mengelola kode GUI dengan cara yang waras dan menghindari membiarkannya menjadi jendela yang rusak? Atau apakah massa penangan kejadian acak / metode yang ditimpa benar-benar yang terbaik yang bisa kita lakukan untuk kode GUI?
sumber
Jawaban:
Yang perlu diingat tentang kode GUI adalah bahwa itu adalah event-driven, dan kode event-driven selalu akan memiliki penampilan massa penangan acara yang diorganisir secara acak. Di mana itu menjadi sangat berantakan adalah ketika Anda mencoba untuk memasukkan kode non-event-driven ke dalam kelas. Tentu, ini memiliki tampilan memberikan dukungan untuk penangan acara dan Anda dapat menjaga penangan acara Anda baik dan kecil, tetapi semua kode dukungan tambahan yang melayang-layang membuat sumber GUI Anda tampak membengkak dan berantakan.
Jadi apa yang dapat Anda lakukan tentang hal ini, dan bagaimana Anda dapat membuat hal-hal lebih mudah untuk diperbaiki? Yah, pertama-tama saya akan mengubah definisi refactoring saya dari sesuatu yang saya lakukan sesekali menjadi sesuatu yang saya lakukan terus menerus saat saya membuat kode. Mengapa? Karena Anda ingin refactoring memungkinkan Anda untuk lebih mudah memodifikasi kode Anda, dan bukan sebaliknya. Saya tidak hanya meminta Anda untuk mengubah semantik di sini, tetapi meminta Anda untuk melakukan sedikit senam mental agar dapat melihat kode Anda secara berbeda.
Tiga teknik refactoring yang saya temukan paling sering saya gunakan adalah Rename , Extract Method , dan Extract Class . Jika saya tidak pernah mempelajari satu pun refactoring lainnya, ketiganya akan tetap memungkinkan saya untuk menjaga kode saya tetap bersih dan terstruktur dengan baik, dan dari isi pertanyaan Anda, sepertinya saya mungkin akan menemukan diri Anda menggunakan tiga refactoring yang sama hampir secara konstan di Untuk menjaga kode GUI Anda tetap tipis dan bersih.
Anda dapat memiliki pemisahan terbaik GUI dan logika Bisnis di dunia, dan masih kode GUI dapat terlihat seperti kode yang telah diledakkan di tengahnya. Saran saya adalah bahwa tidak ada salahnya untuk memiliki kelas ekstra atau dua untuk membantu Anda untuk mengelola GUI Anda dengan benar, dan ini tidak perlu harus Anda View kelas jika Anda menerapkan pola MVC - meskipun sering Anda akan menemukan kelas perantara sangat mirip dengan pandangan Anda sehingga Anda akan sering merasakan keinginan untuk menggabungkannya demi kenyamanan. Menurut saya, tidak ada salahnya menambahkan lapisan khusus GUI tambahan untuk mengelola semua logika visual, namun Anda mungkin ingin mempertimbangkan manfaat dan biaya untuk melakukannya.
Karenanya saran saya adalah:
sumber
Saya pikir banyak masalah yang Anda alami dapat ditelusuri kembali ke penyebab sederhana. Sebagian besar pengembang tidak memperlakukan kode GUI seperti kode 'nyata'. Saya tidak punya bukti atau statistik di sini, hanya perasaan saya.
Mungkin mereka berpikir itu hanya ' presentasi ' dan tidak penting. ' Tidak ada logika bisnis di sana ', kata mereka, ' mengapa unit mengujinya '? Mereka tertawa ketika Anda menyebutkan orientasi objek dan menulis kode bersih. Mereka bahkan tidak MENCOBA untuk membuat segalanya lebih baik. Tidak ada struktur untuk memulai, mereka hanya menampar beberapa kode dan membiarkannya membusuk ketika orang lain menambahkan sentuhan mereka sendiri dari waktu ke waktu. Kekacauan yang indah, kode grafiti.
Kode GUI memiliki tantangan unik sehingga harus diperlakukan secara berbeda dan dengan rasa hormat. Perlu cinta dan pengembang yang ingin menulisnya. Yang akan membuatnya tipis dan memberinya struktur yang baik dan pola yang benar.
sumber
Untuk beberapa alasan kode GUI menciptakan titik buta pada pengembang tentang pemisahan masalah. Mungkin itu karena semua tutorial menggabungkan semuanya menjadi satu kelas. Mungkin itu karena representasi fisik membuat segala sesuatu tampak lebih dekat daripada mereka. Mungkin itu karena kelas dibangun perlahan-lahan sehingga orang tidak menyadari bahwa mereka perlu refactoring, seperti katak pepatah yang direbus dengan perlahan menyalakan panas.
Apa pun alasannya, solusinya adalah membuat kelas Anda jauh lebih kecil. Saya melakukan ini dengan terus bertanya pada diri sendiri apakah mungkin untuk memasukkan apa yang saya ketikkan ke dalam kelas yang terpisah. Jika mungkin untuk dimasukkan ke kelas lain, dan saya bisa memikirkan nama yang masuk akal dan sederhana untuk kelas itu, maka saya melakukannya.
sumber
Anda mungkin ingin melihat pola Model View Presenter / Passive View. Ray Ryan memberi ceramah yang bagus di Google IO tentang praktik arsitektur terbaik untuk GWT.
http://www.google.com/events/io/2009/sessions/GoogleWebToolkitBestPractices.html
Sangat mudah untuk mengabstraksi gagasan ke kerangka kerja dan bahasa lain. Manfaat utama MVP (menurut saya) adalah unit-testability. Dan Anda hanya mendapatkan itu, jika kode Anda tidak membengkak dan tidak spageti (menilai dari pertanyaan Anda, inilah yang Anda inginkan). Ia bekerja dengan memperkenalkan lapisan logika tampilan yang disebut presenter. Tampilan sebenarnya dipisahkan dari ini melalui antarmuka (dan dengan demikian dapat dengan mudah diejek dalam unit test). Sekarang, karena layer logika tampilan Anda (presenter) dibebaskan dari internal kerangka kerja GUI yang konkret, Anda dapat mengaturnya seperti kode biasa dan Anda tidak terikat dengan misalnya hierarki warisan Swings. Idealnya Anda bisa beralih implementasi GUI dalam kerangka kerja yang berbeda selama mereka sesuai dengan antarmuka yang sama.
sumber
Jawaban saya terdiri dari empat bagian: struktur, kesederhanaan, pengujian, dan sintaksis.
Tiga yang pertama sangat sulit dilakukan!
Struktur berarti membayar banyak perhatian untuk menggunakan jumlah kode paling sedikit dan jumlah maksimum kerangka kerja, perpustakaan dll.
Kesederhanaan berarti menjaga segala sesuatunya sederhana dari desain awal hingga implementasi aktual. Menjaga navigasi tetap sederhana, menggunakan plugin sederhana, menjaga tata letak cukup 'polos' semua akan membantu di sini. Mereka sekarang dapat 'dijual' ke klien / pengguna yang dapat dengan cepat melihat keuntungan halaman yang berfungsi pada pc, ipad, ponsel dan perangkat lainnya.
Pengujian berarti termasuk alat pengujian peramban (webrat dan capybara muncul dalam pikiran dengan pekerjaan rel saya) yang menangkap masalah lintas-browser di muka ketika kode yang lebih baik dapat dirancang untuk menghadapinya di awal sebagai lawan dari sering 'tambalan' kode oleh pengembang yang berbeda karena 'ditemukan' oleh pengguna browser yang berbeda.
Sintaksis. Sangat membantu untuk menggunakan pemeriksa kode / IDE / editor-plugin, dll. Untuk HTML, CSS, Javascript, dll. Keuntungan yang diperoleh browser dengan bisa menangani HTML yang tidak berfungsi dengan baik akan merugikan Anda ketika browser yang berbeda bekerja secara berbeda dengan itu, jadi alat yang memeriksa format HTML Anda sangat penting. Memiliki HTML yang terbentuk dengan baik sangat membantu dalam memiliki HTML yang tidak diblokan sebagai kode yang buruk harus memiliki visibilitas lebih.
sumber
Solusi yang saya temukan adalah kode deklaratif. Menggunakan kode prosedural yang adil adalah resep untuk kode GUI spaghetti. Tentu, "cara khusus untuk melukis widget" mungkin akan tetap kode. Tetapi ini adalah kode yang diisolasi dalam sebuah kelas. Penangan acara, pintasan keyboard, ukuran jendela - semua hal berantakan paling baik dinyatakan.
sumber
Ada banyak jawaban bagus di sini.
Satu hal yang telah membantu saya menyederhanakan kode GUI adalah memastikan bahwa GUI memiliki model data sendiri.
Untuk mengambil contoh sederhana, jika saya memiliki GUI dengan 4 bidang entri teks, maka saya memiliki kelas data terpisah yang menyimpan konten dari 4 bidang entri teks tersebut. GUI yang lebih rumit membutuhkan lebih banyak kelas data.
Saya mendesain GUI sebagai model - view. Model GUI dikendalikan oleh pengontrol aplikasi dari model aplikasi - view - controller. Tampilan aplikasi adalah model GUI, bukan kode GUI itu sendiri.
sumber
Aplikasi seperti Pengolah Kata, editor Grafik, dll. Memiliki antarmuka yang kompleks dan kodenya tidak bisa sederhana. Namun, untuk aplikasi bisnis, GUI tidak harus terlalu rumit tetapi tetap bagaimana caranya.
Beberapa kunci untuk menyederhanakan GUI adalah (sebagian besar berlaku untuk .NET):
Berusaha keras untuk desain yang lebih sederhana bila memungkinkan. Hindari perilaku mewah jika tidak dipanggil oleh bisnis.
Gunakan penyedia kontrol yang baik.
Jangan membuat fungsi kontrol kustom di kode klien itu sendiri. Alih-alih, buat kontrol pengguna yang memperluas kontrol asli sedemikian rupa sehingga Anda bisa mencerminkan perilaku spesifik Anda di kontrol daripada dalam kode formulir penggunaan / halaman.
Gunakan kerangka kerja (bahkan rumah yang dikembangkan) untuk menangani internasionalisasi, manajemen sumber daya, gaya, dll. Sehingga Anda tidak mengulangi kode ini di setiap UI.
Gunakan komponen (atau kerangka kerja) untuk navigasi.
Buat dialog standar untuk kesalahan, peringatan, konfirmasi, dll.
sumber
Terapkan Desain Berorientasi Objek ke kode Anda, dan untuk pengembangan UI:
Ini adalah aplikasi kecil tapi non-sepele untuk membantu mengilustrasikan beberapa poin saya. Anda dapat menemukan kode dan diagram interaksi tampilan / model di sini: https://github.com/vanfrankie/pushpopbox
sumber
Anda ingin melihat konsep "penyatuan data" . Ini adalah cara menghubungkan elemen UI ke elemen model abstrak dengan cara deklaratif sehingga elemen model secara otomatis disinkronkan dengan konten UI. Ada banyak manfaat dari pendekatan ini, misalnya tidak harus menulis event handler sendiri untuk menyinkronkan data.
Ada dukungan penyatuan data untuk banyak kerangka kerja UI, misalnya .NET dan Eclipse / JFace .
sumber