Apabila saya mula mereka bentuk antara muka, saya sentiasa menghadapi isu bahawa pengendali acara dilampirkan terus pada butang, yang mengehadkan fleksibiliti interaksi komponen. Masalahnya ialah butang standard tidak boleh menawarkan sebarang tingkah laku lain. Apa yang saya perlukan ialah pengasingan logik dan pengurusan tindakan dinamik, yang tidak tersedia apabila menggunakan butang standard 'di luar kotak.' Dalam artikel ini, saya akan mencadangkan penyelesaian tentang cara menyesuaikan butang menggunakan Komponen Web dan corak 'Arahan', membuka kemungkinan baharu untuk antara muka yang lebih fleksibel dan berskala.
Biasanya, apabila kita berfikir tentang butang, kita menganggapnya sebagai elemen kawalan grafik yang menyediakan cara mudah untuk mencetuskan beberapa peristiwa, tindakan atau perubahan dalam keadaan antara muka. Ini adalah definisi yang sangat mudah dan mudah, yang sesuai dengan pemahaman harian kita tentang elemen antara muka pengguna dalam aplikasi web.
Walau bagaimanapun, apabila kami menemui butang dalam konteks pembangunan web, apabila HTML dan JavaScript terlibat, perkara pertama yang terlintas di fikiran ialah teg standard, yang merupakan alat yang paling biasa digunakan untuk membuat butang pada halaman web. Teg ini biasanya kelihatan seperti ini:
<button onclick="myFunction()">Click me</button>
Tetapi jika kita memikirkannya, teg ini, semasa berfungsi sebagai butang, tidak mencerminkan sepenuhnya semua kemungkinan aspek dan fungsi yang boleh dilakukan oleh butang dalam konteks interaksi pengguna yang lebih luas dengan antara muka.
Setelah memeriksa dengan lebih dekat definisi butang, seseorang mungkin mendapati bahawa butang itu tidak memberikan sebarang maklumat tentang rupa butang itu, cara ia harus bertindak atau cara ia harus mencetuskan tindakan. Dalam konteks ini, tiada pemahaman yang jelas tentang apa yang dimaksudkan dengan perkataan "cara mudah" untuk mencetuskan tindakan, mahupun cara hubungan antara butang dan tindakan itu diwujudkan. Kami hanya melihat struktur asas butang, yang, apabila diklik, memanggil beberapa kaedah. Tetapi pada hakikatnya, kesederhanaan ini menyembunyikan pelbagai kemungkinan dan pendekatan yang lebih luas. Oleh itu, persoalan timbul: mungkin butang itu lebih daripada sekadar teg yang kita lihat dalam contoh di atas?
Mari kita mendekati konsep butang dari perspektif yang lebih falsafah, menyelidiki intipati dan fungsinya. Apakah yang sebenarnya diwakili oleh butang? Jika kita menganggap intipati jag sebagai kekosongannya, intipati butang boleh didapati dalam keupayaannya untuk memulakan tindakan. Butang bukan sekadar elemen antara muka pengguna; ia adalah mekanisme yang mencetuskan proses khusus yang telah wujud dalam konteks aplikasi. Tindakan yang akan dilakukan berlaku dalam aplikasi, dalam konteks keseluruhan sistem, tetapi permulaan tindakan itu - permulaannya - adalah fungsi butang. Oleh itu, kami melihat bahawa butang berfungsi sebagai sejenis pencetus, melancarkan tindakan dalam konteks sistem luaran yang lebih luas.
Apabila pengguna mengklik butang, mereka menjangkakan bahawa klik ini akan membawa kepada tindakan tertentu. Akibatnya, butang itu dikaitkan dengan tanggungjawab untuk memulakan tindakan ini. Dalam erti kata lain, butang menjadi pautan antara pengguna dan tindakan yang harus diikuti. Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa kaedah atau fungsi yang benar-benar menjalankan tindakan itu tidak seharusnya menyedari bahawa butang itu adalah yang mencetuskannya. Perbezaan antara perkara yang memulakan tindakan dan perkara yang melaksanakannya adalah aspek penting yang membolehkan kami mengekalkan fleksibiliti dan kemudahan interaksi dalam sistem yang lebih kompleks.
Apabila butang secara langsung melakukan tindakan atau apabila kaedah melaksanakan tindakan bergantung pada butang itu sendiri, kami berhadapan dengan sistem yang agak kompleks dan saling bergantung. Jika kita ingin memudahkan sistem sedemikian, adalah perlu untuk memecahkannya kepada bahagian yang lebih mudah dan bebas. Dan di sini kami menyimpulkan bahawa memudahkan proses memulakan tindakan terutamanya melibatkan pengasingan proses permulaan daripada tindakan itu sendiri. Dan oleh kerana dalam konteks JavaScript, pemula sering dirujuk sebagai peristiwa, kami bercakap secara khusus tentang memisahkan acara sebagai pemula daripada logik yang melaksanakan tindakan.
Mengapa penting untuk memisahkan acara daripada pengendali?
Pertama sekali, mengasingkan acara daripada pengendali dengan ketara meningkatkan kebolehbacaan kod dan menggalakkan penciptaan lebih banyak penyelesaian modular. Apabila logik butang dan pengendalinya saling berkait, atau, lebih teruk lagi, apabila pengendali ialah fungsi tanpa nama, kod tersebut menjadi amat sukar untuk dibaca dan dianalisis. Ini boleh membawa kepada masalah semasa menyelenggara dan mengemas kini projek, kerana memahami perkara yang sebenarnya dilakukan oleh butang dan perubahan yang diperlukan menjadi tugas yang mencabar. Sebaliknya, apabila pengendali diekstrak ke dalam fungsi berasingan yang dinamakan dengan jelas yang menggambarkan tindakan yang dilakukan, struktur kod menjadi lebih telus. Pembangun segera memahami perkara yang berlaku apabila butang diklik, dan boleh mengubah suai kelakuan elemen dengan lebih mudah tanpa perlu menyelidiki logik yang lain. Oleh itu, pemisahan memudahkan kedua-dua membaca dan membuat perubahan pada kod.
Kedua, memisahkan logik peristiwa dan pengendali membuka peluang untuk menggunakan semula pengendali merentas bahagian aplikasi yang berbeza. Apabila pengendali diletakkan dalam fungsinya sendiri, ia boleh digunakan bukan sahaja pada satu butang, tetapi kepada banyak orang lain yang mempunyai kelakuan yang serupa. Contohnya, berbilang butang yang melakukan tindakan yang sama boleh menggunakan pengendali yang sama, yang mengurangkan pertindihan kod dan meningkatkan kecekapan. Tambahan pula, pengendali boleh dicetuskan bukan sahaja melalui butang tetapi juga melalui cara lain, seperti panggilan program atau tindakan yang dimulakan oleh bahagian lain antara muka. Ini meluaskan kefungsian aplikasi anda dengan ketara, meningkatkan fleksibiliti dan kebolehskalaannya.
Ketiga, pengasingan acara dan pengendali membolehkan lebih fleksibiliti dalam butang itu sendiri. Jika kelakuan butang itu kini ditentukan bukan dalam butang itu sendiri, tetapi melalui pengendali yang berasingan, ia menjadi mudah untuk mengubah suai tindakannya atau menugaskannya semula bergantung pada situasi. Ini amat penting dalam projek dengan antara muka dinamik, di mana gelagat elemen boleh berubah sebagai tindak balas kepada tindakan pengguna atau perubahan dalam keadaan aplikasi. Pendekatan ini membolehkan antara muka mudah disesuaikan dengan keperluan yang berubah tanpa mengganggu struktur kod keseluruhan.
Keempat, pengasingan acara dan pengendali adalah penting untuk kebolehujian, terutamanya dalam projek besar. Apabila pengendali acara diekstrak ke dalam fungsi yang berasingan, mengujinya menjadi lebih mudah, kerana ia boleh diuji secara bebas daripada antara muka. Anda boleh mengasingkan pengendali dan menguji cara ia berfungsi dengan pelbagai parameter, tanpa perlu risau tentang interaksi dengan bahagian antara muka yang lain. Ini menjadikan ujian lebih mudah, meningkatkan kebolehpercayaan dan kestabilan aplikasi sambil meminimumkan kemungkinan ralat.
Memisahkan acara butang dan pengendali ialah langkah penting ke arah seni bina kod yang lebih bersih, fleksibel dan boleh diselenggara. Ini amat penting dalam projek yang kompleks, di mana interaksi antara elemen antara muka menjadi lebih rumit dan saling bergantung. Pendekatan ini membantu meningkatkan kestabilan sistem, menjadikannya lebih mudah untuk mengembangkan dan mengubah suai aplikasi serta mengurangkan risiko ralat yang timbul semasa perubahan ini.
Contoh untuk memisahkan acara butang daripada pengendalinya boleh didapati dalam mana-mana panduan pemula.
<button onclick="myFunction()">Click me</button>
Jika butang boleh menyampaikan bukan sahaja konteks interaksi tetapi juga niat pengguna secara eksplisit dalam acara tersebut, ia akan memudahkan seni bina dengan ketara. Pengendali boleh menumpukan pada melaksanakan tugas daripada memberikan logik kepada acara.
Ini menyerlahkan keperluan untuk beralih daripada pemahaman tradisional tentang butang sebagai pemula acara semata-mata. Sebaliknya, ia mencadangkan untuk menggunakan model yang lebih maju di mana butang bertindak sebagai jambatan antara niat pengguna dan logik aplikasi.
Untuk mencipta model yang lebih maju bagi pengendalian acara, kami boleh memanfaatkan corak Perintah, yang membolehkan peristiwa dikaitkan dengan logik aplikasi pada tahap abstraksi yang lebih tinggi. Ini boleh dicapai dengan memperkenalkan lapisan yang mengubah peristiwa biasa kepada arahan seperti saveDocument atau deleteItem. Menggunakan pendekatan ini, sesuatu peristiwa menjadi lebih daripada sekadar isyarat bahawa sesuatu telah berlaku — ia berubah menjadi perkara yang dimaksudkan: pemula tindakan, seperti yang dibincangkan sebelum ini dalam artikel.
Tetapi ini menimbulkan persoalan: mengapa pembangun acara JavaScript tidak melaksanakan corak Perintah dari awal? Mengapakah acara direka bentuk seperti sekarang? Dan mengapakah acara perlu pada mulanya?
Apabila HTML dan teknologi berkaitan seperti DOM dan JavaScript pada mulanya dibangunkan, matlamat utama mereka adalah untuk mencipta struktur ringkas untuk dokumen hiperteks yang membolehkan pengguna berinteraksi dengan halaman web. Pada masa itu, interaksi pengguna adalah terhad dengan ketara, dan model pengendalian peristiwa tidak direka bentuk untuk menampung mekanisme kompleks seperti corak Perintah. Adalah penting untuk memahami bahawa web awal dibangunkan untuk memudahkan penciptaan dan pengurusan kandungan, bukan untuk menyediakan alat canggih untuk logik sisi klien yang kompleks.
Pada tahun 1990-an, apabila HTML dan web sedang dibuat, tumpuan mereka adalah untuk menyediakan cara yang mudah untuk mempersembahkan dokumen hiperteks dengan interaksi pengguna yang minimum. Matlamat utama adalah penyerahan data kepada pelayan dan bukannya melaksanakan logik kompleks dalam penyemak imbas. Butang dan borang digunakan terutamanya untuk menghantar data, bukan untuk memulakan proses sisi klien. Semua pengiraan dan pemprosesan data telah dikendalikan pada pelayan, dengan butang berfungsi sebagai elemen antara muka yang mencetuskan penyerahan data ke bahagian belakang.
Corak Perintah memerlukan struktur yang lebih canggih yang melibatkan pemisahan yang jelas antara antara muka dan logik pemprosesan, serta mekanisme untuk menentukan tindakan tepat yang akan dilaksanakan. Idea ini hanya menjadi relevan kemudian, kerana keperluan untuk antara muka dinamik dan interaktiviti yang lebih besar dalam aplikasi web semakin meningkat. Interaksi dinamik dan kompleks, seperti mencetuskan logik pihak pelanggan melalui peristiwa, memerlukan pendekatan baharu, termasuk penggunaan corak Perintah.
Bolehkah Corak Perintah Digunakan pada Butang Hari Ini? Ya, boleh. Walaupun butang HTML standard tidak menyokong corak Perintah secara langsung, teknologi moden seperti acara tersuai membolehkan kami mencipta mekanisme yang serupa. Sebagai contoh, kami telah meneroka cara sifat butiran boleh digunakan untuk menghantar data tambahan dengan acara.
Walau bagaimanapun, pendekatan ini masih tidak sesuai, kerana ia memerlukan mewujudkan pelaksanaan berasingan untuk setiap butang dalam antara muka. Ini menambahkan kerumitan tambahan dan menjadikan penskalaan sistem sedemikian lebih mencabar.
Memanfaatkan Komponen Web untuk memodenkan butang dan menyelaraskannya dengan corak Perintah ialah pendekatan yang menjanjikan yang boleh meningkatkan kedua-dua seni bina dan fleksibiliti interaksi dalam projek anda dengan ketara. Komponen Web menyediakan alatan berkuasa untuk mencipta elemen antara muka boleh guna semula yang boleh disepadukan dengan lancar ke dalam pelbagai bahagian aplikasi.
Daripada menulis pengendali berasingan untuk setiap butang, anda boleh mencipta komponen bersatu yang bertindak sebagai butang dengan keupayaan tambahan untuk menghantar arahan. Pendekatan ini bukan sahaja menambah baik struktur kod tetapi juga meningkatkan kebolehbacaan dan kebolehselenggaraannya.
Berikut ialah contoh asas komponen sedemikian:
<button onclick="myFunction()">Click me</button>
Apabila komponen butang menghantar pengecam arahan dan kemungkinan parameter tambahan, ia mewujudkan asas untuk seni bina yang lebih maju. Dalam persediaan ini, komponen yang mengandungi butang dan melanggan acaranya pada asasnya bertindak sebagai pengawal yang memproses arahan yang melalui acara tersebut.
Dalam corak seni bina seperti MVC (Model-View-Controller), pengawal berfungsi sebagai perantara antara model, yang mewakili data dan pandangan, yang membentuk antara muka pengguna. Ia menerima input pengguna, seperti klik butang dan mengurus perubahan yang terhasil pada data atau keadaan, yang kemudiannya ditunjukkan dalam antara muka.
Penggunaan pengawal dalam komponen menawarkan beberapa kelebihan utama. Pertama, ia merangkum logik untuk melaksanakan arahan, memastikan kod aplikasi utama bebas daripada kerumitan yang tidak perlu. Butiran pelaksanaan kekal tersembunyi dalam pengawal itu sendiri. Kedua, pendekatan ini meningkatkan modulariti, membenarkan butang untuk digunakan semula hanya dengan menghantar arahan dan parameter yang berbeza. Ia juga mengurangkan gandingan dalam aplikasi, kerana perubahan pada logik pengendalian arahan memerlukan pengubahsuaian hanya dalam pengawal, tanpa menjejaskan bahagian lain sistem. Akhir sekali, pengawal memberikan fleksibiliti yang ketara. Mereka boleh mengendalikan kedua-dua arahan yang mudah, seperti "simpan" atau "padam" dan tindakan yang lebih kompleks, manakala komponen butang kekal mudah dan tertumpu semata-mata pada peranan utamanya.
Seni bina ini memudahkan pemisahan kebimbangan yang bersih. Komponen butang memancarkan peristiwa tersuai yang merangkumi arahan dan data berkaitannya, manakala komponen induk, bertindak sebagai pengawal, mendengar acara ini. Pengawal memproses arahan, berinteraksi dengan model data jika perlu, dan mengemas kini antara muka pengguna dengan sewajarnya. Pendekatan ini menghasilkan seni bina yang lebih bersih dan berskala yang lebih mudah untuk dipanjangkan dan diselenggara, sambil memastikan komponen butang boleh diguna semula dan bebas daripada logik yang dicetuskan olehnya.
Kesimpulannya, pendekatan di mana butang bukan sahaja mencetuskan tindakan tetapi juga menghantar arahan dengan data yang diperlukan melalui acara adalah contoh terbaik untuk menggunakan corak "Perintah". Kaedah ini meningkatkan organisasi interaksi antara muka dengan ketara dengan memisahkan logik pelaksanaan perintah daripada elemen antara muka, meningkatkan fleksibiliti dan kebolehskalaan aplikasi.
Bagaimanapun, pendekatan sedemikian masih agak jarang dalam amalan. Daripada memanfaatkan keupayaan hebat Komponen Web untuk mencipta penyelesaian universal dan fleksibel, banyak pembangun terus bergantung pada butang standard yang terikat secara langsung dengan pengendali acara. Ini berkemungkinan disebabkan oleh tabiat dan kekurangan kesedaran tentang kelebihan pendekatan ini, yang membawa kepada penggunaan butang yang lebih konvensional sebagai pencetus mudah untuk tindakan.
Bertekad untuk mengubah keadaan ini, saya membangunkan perpustakaan KoiCom, di mana banyak komponen telah disesuaikan dan dipertingkatkan. Khususnya, butang dalam pustaka ini mengikut corak "Perintah", menghantar data dan arahan yang diperlukan melalui acara. Pendekatan ini sangat meningkatkan modulariti, fleksibiliti dan kebolehselenggaraan, menghapuskan logik berlebihan dan memudahkan cara arahan diurus.
Dokumentasi KoiCom
KoiCom github
Akhirnya, saya berharap penyelesaian sedemikian akan membantu pembangun menggunakan pendekatan yang lebih moden untuk reka bentuk antara muka, menjadikan aplikasi lebih berskala dan lebih mudah diselenggara.
Atas ialah kandungan terperinci Butang Generasi Seterusnya: Melaksanakan Corak Perintah melalui Komponen Web. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!