mata teras
Corak reka bentuk sering diintegrasikan ke dalam rangka kerja yang popular. Sebagai contoh, corak reka bentuk model-view-controller (MVC) ada di mana-mana. Dalam JavaScript, sukar untuk memisahkan rangka kerja dari corak reka bentuk. Sering kali, rangka kerja tertentu akan datang dengan tafsirannya sendiri tentang corak reka bentuk ini. Bingkai datang dengan perspektif, dan setiap bingkai memaksa anda untuk berfikir dalam beberapa cara.
Corak MVC sesuai untuk rangka kerja pelanggan, tetapi rangka kerja moden akan berubah. Pemodenan hari ini akan mati dari masa ke masa. Dalam kes ini, saya ingin meneroka alternatif dan melihat di mana disiplin kecil dapat membawa kita.
Baca JavaScript moden dan terus mengikuti dunia JavaScript yang sentiasa berubah!
Baca buku ini Model MVC itu sendiri dapat dikesan kembali dekad. Ini menjadikan corak reka bentuk bernilai pelaburan anda dalam kemahiran pengaturcaraan. Mod MVC adalah mod yang boleh wujud secara bebas. Persoalannya, sejauh mana ini boleh membawa kita?
Bingkai berbeza kerana ia tidak perlu mengikuti sebarang corak reka bentuk. Salah satu cara untuk membezakan antara kerangka dan corak adalah mencari prinsip Hollywood. Prinsip Hollywood adalah: "Jangan panggil kami, kami akan memanggil anda." Rangka kerja ini sama seperti Hollywood, dan anda tidak boleh memutuskan apa yang perlu dilakukan atau bagaimana untuk melakukannya. Malah, pemaju adalah seperti pelakon, mengikuti skrip apabila diminta bertindak.
Terdapat banyak sebab yang baik untuk mengelakkan rangka kerja pelanggan:
corak reka bentuk MVC berasal dari projek penyelidikan Xerox Smalltalk pada tahun 1970 -an dan 1980 -an. Ini adalah mod yang diuji masa untuk antara muka pengguna grafik front-end. Corak ini datang dari aplikasi desktop, tetapi telah terbukti berfungsi dengan baik untuk aplikasi web juga.
terasnya ialah corak reka bentuk MVC adalah mengenai pemisahan kebimbangan yang jelas. Tujuannya adalah untuk menjadikan penyelesaiannya jelas dan mudah difahami. Mana -mana pengaturcara yang ingin membuat perubahan khusus dapat dengan mudah mencari tempat yang tepat.
Penguin! Comel dan berbulu, salah satu makhluk paling lucu di bumi. Malah, mereka sangat comel, dengan 17 penguin yang berbeza, tidak semuanya tinggal di persekitaran Antartika.
Sudah tiba masanya untuk membuat demo penguin! Saya akan menunjukkan dek yang menunjukkan beberapa spesies di halaman. Untuk ini, saya mahu menggunakan corak reka bentuk MVC dan sedikit disiplin. Saya akan menggunakan kaedah pengaturcaraan yang melampau untuk menggunakan ujian unit dan kaedah mudah untuk menyelesaikan masalah di tangan. Akhirnya, anda sepatutnya dapat melayari beberapa penguin, masing -masing dengan gambar data dan profilnya sendiri.
Pada akhir contoh ini, anda sepatutnya belajar cukup untuk menggunakan corak reka bentuk MVC dalam JavaScript tulen. Corak itu sendiri sangat mudah untuk diuji, jadi ujian unit yang baik dijangka.
Saya akan berpegang dengan ES5 dalam demo ini untuk alasan keserasian silang penyemak imbas. Adalah masuk akal untuk menggunakan ciri bahasa yang terbukti digabungkan dengan corak reka bentuk kekal ini.
Adakah anda sudah bersedia? Mari tunggu dan lihat.
Demo akan terdiri daripada tiga bahagian utama: pengawal, pandangan, dan model. Setiap bahagian mempunyai kebimbangan dan isu sendiri yang perlu diselesaikan.
Berikut adalah visualisasi penampilannya:
Penguinview mengambil berat tentang Dom. DOM adalah API penyemak imbas yang anda gunakan untuk melakukan operasi HTML. Dalam MVC, tiada bahagian dari perubahan dom kecuali pandangan. Pandangan boleh melampirkan acara pengguna, tetapi meninggalkan isu pengendalian acara kepada pengawal. Perintah utama pandangan adalah untuk menukar status pengguna melihat pada skrin. Untuk demonstrasi ini, pandangan akan menggunakan JavaScript tulen untuk operasi DOM.
Penguinmodel mengambil berat tentang data. Dalam klien JavaScript, ini bermakna Ajax. Satu kelebihan corak MVC ialah anda kini mempunyai satu lokasi untuk panggilan Ajax sisi pelayan. Ini menjadikannya lebih mudah bagi pengaturcara lain yang tidak biasa dengan penyelesaian untuk memulakan. Model dalam corak reka bentuk ini hanya mengambil berat tentang JSON atau objek dari pelayan.
Satu anti-corak adalah menentang pemisahan kebimbangan ini. Sebagai contoh, model tidak boleh peduli dengan HTML. Pandangan tidak boleh peduli dengan Ajax. Pengawal mesti bertindak sebagai mediator tanpa bimbang tentang butiran pelaksanaan.
Saya mendapati bahawa apabila menggunakan corak ini, pemaju pada mulanya mempunyai niat yang baik, tetapi mereka akan membocorkan kebimbangan mereka. Ia menggoda untuk menjadikan semuanya menjadi komponen web dan berakhir dengan kekacauan. Fokus pada ciri-ciri dan kebimbangan berorientasikan pengguna. Walau bagaimanapun, kebimbangan fungsi adalah berbeza daripada kebimbangan fungsi.
Apa yang saya suka dalam pengaturcaraan adalah untuk membuat pemisahan yang jelas mengenai kebimbangan fungsional. Setiap masalah pengaturcaraan individu akan diselesaikan secara konsisten. Ini menjadikannya lebih mudah difahami apabila anda membaca kod tersebut. Tujuannya adalah untuk menulis kod yang mudah difahami supaya orang lain juga boleh membuat sumbangan positif.
Ini bukan demonstrasi yang baik tanpa contoh sebenar yang dapat anda lihat dan sentuh. Jadi, tidak perlu dikatakan, inilah codepen yang menunjukkan demonstrasi Penguin:
Lihat SitePoint (@SitePoint) Pen demo penguin pada codepen.
Saya telah berkata cukup, sudah tiba masanya untuk menulis kod.
Lihat dan model adalah dua komponen yang digunakan oleh pengawal. Pengawal mengandungi semua komponen yang diperlukan untuk melakukan tugas dalam pembangunnya:
<code>var PenguinController = function PenguinController(penguinView, penguinModel) { this.penguinView = penguinView; this.penguinModel = penguinModel; }; </code>
Pembina menggunakan penyongsangan kawalan dan menyuntik modul dengan cara ini. Mod ini membolehkan anda menyuntik sebarang komponen yang memenuhi kontrak lanjutan. Fikirkan ia sebagai cara yang baik untuk kod abstrak dan melaksanakan butiran. Corak ini membolehkan anda menulis kod bersih dalam JavaScript tulen.
Acara pengguna kemudian disambungkan dan dikendalikan dengan cara ini:
<code>PenguinController.prototype.initialize = function initialize() { this.penguinView.onClickGetPenguin = this.onClickGetPenguin.bind(this); }; PenguinController.prototype.onClickGetPenguin = function onClickGetPenguin(e) { var target = e.currentTarget; var index = parseInt(target.dataset.penguinIndex, 10); this.penguinModel.getPenguin(index, this.showPenguin.bind(this)); }; </code>
Perhatikan bahawa acara ini menggunakan sasaran semasa untuk mendapatkan negeri yang disimpan di DOM. Dalam kes ini, DOM akan memberitahu anda semua tentang status semasa. Status semasa DOM adalah apa yang pengguna lihat pada penyemak imbas. Anda boleh menyimpan data status di DOM itu sendiri, selagi pengawal tidak mengubah status.
Selepas acara itu dicetuskan, pengawal akan mendapat data dan menerangkan apa yang akan berlaku seterusnya. This.showpenguin () panggil balik menarik:
<code>PenguinController.prototype.showPenguin = function showPenguin(penguinModelData) { var penguinViewModel = { name: penguinModelData.name, imageUrl: penguinModelData.imageUrl, size: penguinModelData.size, favoriteFood: penguinModelData.favoriteFood }; penguinViewModel.previousIndex = penguinModelData.index - 1; penguinViewModel.nextIndex = penguinModelData.index + 1; if (penguinModelData.index === 0) { penguinViewModel.previousIndex = penguinModelData.count - 1; } if (penguinModelData.index === penguinModelData.count - 1) { penguinViewModel.nextIndex = 0; } this.penguinView.render(penguinViewModel); }; </code>
Pengawal mengira indeks setiap penguin dan memberitahu pandangan untuk menjadikannya. Ia mengambil data dari model dan menukarkannya menjadi objek yang dilihat oleh pandangan dan peduli.
Berikut adalah ujian unit yang menunjukkan jalan gembira ketika penguin:
<code>var PenguinController = function PenguinController(penguinView, penguinModel) { this.penguinView = penguinView; this.penguinModel = penguinModel; }; </code>
PenguinViewMock mempunyai kontrak yang sama seperti pelaksanaan sebenar. Ini memungkinkan untuk menulis ujian unit dan membuat pernyataan. Pernyataan datang dari pernyataan nod dan juga wujud dalam pernyataan chai. Ini membolehkan anda menulis ujian yang boleh dijalankan pada nod dan pada penyemak imbas anda.
Sila ambil perhatian bahawa pengawal tidak peduli dengan butiran pelaksanaan. Ia menggunakan kontrak yang disediakan oleh pandangan, seperti ini.render (). Itulah disiplin yang diperlukan untuk menulis kod bersih. Pengawal boleh mempercayai bahawa setiap komponen boleh melakukan apa yang dikatakannya. Ini meningkatkan ketelusan dan menjadikan kod lebih mudah dibaca.
Lihat hanya mengambil berat tentang elemen dom dan peristiwa sambungan, contohnya:
<code>PenguinController.prototype.initialize = function initialize() { this.penguinView.onClickGetPenguin = this.onClickGetPenguin.bind(this); }; PenguinController.prototype.onClickGetPenguin = function onClickGetPenguin(e) { var target = e.currentTarget; var index = parseInt(target.dataset.penguinIndex, 10); this.penguinModel.getPenguin(index, this.showPenguin.bind(this)); }; </code>
Apabila ia mengubah status yang dilihat oleh pengguna, pelaksanaannya adalah seperti berikut:
<code>PenguinController.prototype.showPenguin = function showPenguin(penguinModelData) { var penguinViewModel = { name: penguinModelData.name, imageUrl: penguinModelData.imageUrl, size: penguinModelData.size, favoriteFood: penguinModelData.favoriteFood }; penguinViewModel.previousIndex = penguinModelData.index - 1; penguinViewModel.nextIndex = penguinModelData.index + 1; if (penguinModelData.index === 0) { penguinViewModel.previousIndex = penguinModelData.count - 1; } if (penguinModelData.index === penguinModelData.count - 1) { penguinViewModel.nextIndex = 0; } this.penguinView.render(penguinViewModel); }; </code>
Perhatikan bahawa kebimbangan utamanya ialah menukar data model paparan ke HTML dan mengubah keadaan. Yang kedua adalah untuk menyambungkan acara klik dan biarkan pengawal bertindak sebagai titik masuk. Selepas perubahan status, pengendali acara dilampirkan ke DOM. Teknologi ini mengendalikan pengurusan acara pada satu masa.
Untuk menguji ini, kami dapat mengesahkan bahawa elemen telah dikemas kini dan menukar status:
<code>var PenguinViewMock = function PenguinViewMock() { this.calledRenderWith = null; }; PenguinViewMock.prototype.render = function render(penguinViewModel) { this.calledRenderWith = penguinViewModel; }; // Arrange var penguinViewMock = new PenguinViewMock(); var controller = new PenguinController(penguinViewMock, null); var penguinModelData = { name: 'Chinstrap', imageUrl: 'http://chinstrapl.jpg', size: '5.0kg (m), 4.8kg (f)', favoriteFood: 'krill', index: 2, count: 5 }; // Act controller.showPenguin(penguinModelData); // Assert assert.strictEqual(penguinViewMock.calledRenderWith.name, 'Chinstrap'); assert.strictEqual(penguinViewMock.calledRenderWith.imageUrl, 'http://chinstrapl.jpg'); assert.strictEqual(penguinViewMock.calledRenderWith.size, '5.0kg (m), 4.8kg (f)'); assert.strictEqual(penguinViewMock.calledRenderWith.favoriteFood, 'krill'); assert.strictEqual(penguinViewMock.calledRenderWith.previousIndex, 1); assert.strictEqual(penguinViewMock.calledRenderWith.nextIndex, 3); </code>
Ini menyelesaikan semua isu utama, perubahan keadaan dan peristiwa sambungan. Tetapi di manakah data datang?
Di MVC, semua model peduli tentang Ajax. Contohnya:
<code>var PenguinView = function PenguinView(element) { this.element = element; this.onClickGetPenguin = null; }; </code>
sudah tiba masanya untuk mendapatkan penguin berdasarkan indeks:
<code>PenguinView.prototype.render = function render(viewModel) { this.element.innerHTML = '<h3>' + viewModel.name + '</h3>' + '<img alt="' + viewModel.name + '" src="'%20+%20viewModel.imageUrl%20+%0A%20%20%20%20%20%20'">' + '<p><b>Size:</b> ' + viewModel.size + '</p>' + '<p><b>Favorite food:</b> ' + viewModel.favoriteFood + '</p>' + '<a href="https://www.php.cn/link/f0b875eb6cff6fd5f491e6b6521c7510"> ' data-penguin-index="' + viewModel.previousIndex + '">Previous</a> ' + '<a href="https://www.php.cn/link/f0b875eb6cff6fd5f491e6b6521c7510"> ' data-penguin-index="' + viewModel.nextIndex + '">Next</a>'; this.previousIndex = viewModel.previousIndex; this.nextIndex = viewModel.nextIndex; // Wire up click events, and let the controller handle events var previousPenguin = this.element.querySelector('#previousPenguin'); previousPenguin.addEventListener('click', this.onClickGetPenguin); var nextPenguin = this.element.querySelector('#nextPenguin'); nextPenguin.addEventListener('click', this.onClickGetPenguin); nextPenguin.focus(); }; </code>
<code>var ElementMock = function ElementMock() { this.innerHTML = null; }; // Stub functions, so we can pass the test ElementMock.prototype.querySelector = function querySelector() { }; ElementMock.prototype.addEventListener = function addEventListener() { }; ElementMock.prototype.focus = function focus() { }; // Arrange var elementMock = new ElementMock(); var view = new PenguinView(elementMock); var viewModel = { name: 'Chinstrap', imageUrl: 'http://chinstrap1.jpg', size: '5.0kg (m), 4.8kg (f)', favoriteFood: 'krill', previousIndex: 1, nextIndex: 2 }; // Act view.render(viewModel); // Assert assert(elementMock.innerHTML.indexOf(viewModel.name) > 0); assert(elementMock.innerHTML.indexOf(viewModel.imageUrl) > 0); assert(elementMock.innerHTML.indexOf(viewModel.size) > 0); assert(elementMock.innerHTML.indexOf(viewModel.favoriteFood) > 0); assert(elementMock.innerHTML.indexOf(viewModel.previousIndex) > 0); assert(elementMock.innerHTML.indexOf(viewModel.nextIndex) > 0); </code>
Ujian unit
Bagi saya, ini bermakna menyediakan satu set lengkap ujian unit untuk setiap kes penggunaan. Ujian memberikan panduan mengenai bagaimana kod itu boleh berguna. Ini menjadikannya terbuka dan menggoda kepada mana -mana pengaturcara yang ingin membuat perubahan khusus.
Jangan ragu untuk melihat keseluruhan set ujian unit. Saya fikir ini akan membantu anda memahami corak reka bentuk ini. Setiap ujian disasarkan pada kes penggunaan tertentu; Ujian unit membantu anda secara bebas mempertimbangkan setiap masalah pengekodan dan menyelesaikannya. Pemisahan kebimbangan fungsi dalam MVC dicerminkan dalam setiap ujian unit.Looking forward
Demonstrasi Penguin hanya termasuk konsep asas yang boleh dilaksanakan yang menunjukkan bagaimana MVC berguna. Walau bagaimanapun, anda boleh melangkah ke atas banyak penambahbaikan:
Sudah tentu, pembaca saya, anda boleh memperbaiki demo ini. Ini hanya beberapa idea yang anda boleh mempamerkan kuasa corak reka bentuk ini.
Saya harap anda dapat melihat di mana corak reka bentuk MVC dan sedikit disiplin dapat membawa anda. Corak reka bentuk yang baik akan memudahkan menulis kod bersih tanpa mendapat jalan. Ia akan membuat anda memberi tumpuan kepada tugas apabila menyelesaikan masalah di tangan. Ia akan menjadikan anda seorang pengaturcara yang lebih baik dan lebih cekap.
Dalam pengaturcaraan, tujuannya adalah untuk memberi tumpuan kepada isu -isu yang dihadapi sambil menghapuskan redundansi. Seni pengaturcaraan adalah untuk menyelesaikan satu masalah pada satu masa. Dalam MVC, ini bermakna menyelesaikan masalah fungsi satu demi satu.
Sebagai pemaju, mudah untuk mempercayai bahawa anda adalah logik dan tidak berurusan dengan emosi. Sebenarnya, anda kecewa apabila anda mempunyai terlalu banyak masalah sekaligus. Ini adalah tindak balas manusia biasa yang kita semua harus berurusan. Malah, kekecewaan boleh menjejaskan kualiti kod secara negatif. Apabila perasaan ini menangkap anda dan memimpin kerja anda, ia tidak lagi mengenai logik. Ini boleh mengecewakan kerana penyelesaian mengambil lebih banyak risiko dan kebergantungan yang kompleks.
Apa yang saya suka ialah memberi tumpuan kepada satu tumpuan. Selesaikan satu masalah pada satu masa dan dapatkan maklum balas positif. Dengan cara ini, anda boleh terus fokus, cekap dan mengelakkan perkara yang tidak bermakna.
Artikel ini telah dikaji semula oleh Vildan Softic. Terima kasih kepada semua pengulas rakan sebaya untuk mendapatkan kandungan SitePoint dengan sebaik -baiknya!
Corak reka bentuk Model-View-Controller (MVC) dalam JavaScript adalah penting kerana ia membantu menyusun kod dengan cara yang ringkas dan sistematik. Ia membahagikan fokus aplikasi ke dalam tiga komponen yang saling berkaitan. Model memproses data dan logik perniagaan, paparan menguruskan paparan data, dan pengawal memproses input pengguna. Pemisahan ini membolehkan pengurusan kod yang cekap, debugging yang lebih mudah dan peningkatan skalabiliti.
mod MVC meningkatkan kebolehbacaan dan pemeliharaan kod dengan mengasingkan tanggungjawab. Setiap komponen corak MVC mempunyai fungsi yang berbeza. Pemisahan ini bermakna pemaju boleh mengendalikan komponen individu tanpa menjejaskan orang lain. Ia juga menjadikannya lebih mudah untuk mencari dan menetapkan kesilapan, ciri kemas kini, atau kod refactor, kerana perubahan dalam satu komponen tidak menjejaskan orang lain.
Model dalam corak MVC bertanggungjawab untuk menguruskan data dan logik perniagaan. Ia mengambil data dari pangkalan data, mengendalikan data dan mengemas kini data. Model ini bebas daripada antara muka pengguna dan tidak berinteraksi secara langsung dengan paparan atau pengawal. Sebaliknya, ia menghantar pemberitahuan kepada mereka apabila keadaannya berubah.
Paparan dalam mod MVC bertanggungjawab untuk memaparkan data kepada pengguna. Ia menerima data dari model dan membentangkan data dalam format mesra pengguna. Pandangan tidak berinteraksi secara langsung dengan model. Sebaliknya, ia menerima kemas kini dari pengawal.
Pengawal dalam mod MVC bertindak sebagai mediator antara model dan pandangan. Ia memproses input pengguna dan mengemas kini model dan melihat dengan sewajarnya. Apabila pengguna berinteraksi dengan pandangan, pengawal menafsirkan input dan membuat perubahan yang diperlukan pada model. Ia juga mengemas kini pandangan untuk mencerminkan perubahan ini.
Mod MVC meningkatkan skalabilitas dengan memisahkan titik fokus. Pemisahan ini membolehkan pemaju mengubahsuai atau memanjangkan satu komponen tanpa menjejaskan orang lain. Sebagai contoh, jika anda perlu menukar bagaimana data anda dipaparkan, anda boleh mengubahsuai pandangan tanpa menyentuh model atau pengawal. Modulariti ini menjadikannya lebih mudah untuk skala dan mengembangkan permohonan anda dari masa ke masa.
Ya, corak MVC boleh digunakan dengan pelbagai kerangka JavaScript seperti AngularJS, Ember.js, dan Backbone.js. Rangka kerja ini menyediakan pendekatan berstruktur untuk melaksanakan corak MVC, menjadikannya lebih mudah untuk membina aplikasi yang kompleks.
Melaksanakan corak MVC dalam JavaScript boleh mencabar kerana sifat dinamik JavaScript. Ia memerlukan pemahaman yang baik tentang bahasa dan memerlukan perancangan yang teliti untuk memastikan model, pandangan dan pengawal dipisahkan dengan betul dan berinteraksi dengan betul. Di samping itu, menguruskan kemas kini antara komponen ini boleh menjadi rumit.
Mod MVC menyokong pembangunan pasukan dengan membenarkan pemaju yang berbeza untuk mengendalikan komponen yang berbeza secara serentak. Sebagai contoh, satu pemaju boleh mengendalikan model, sementara pemaju lain boleh mengendalikan pandangan. Pemisahan kebimbangan ini bukan sahaja meningkatkan produktiviti, tetapi juga mengurangkan kemungkinan konflik atau kesilapan disebabkan oleh tumpang tindih kod.
Ya, mod MVC boleh digunakan untuk membangunkan aplikasi mudah alih. Ia menyediakan pendekatan berstruktur untuk pembangunan aplikasi yang menjadikan pengurusan aplikasi mudah alih yang kompleks lebih mudah. Banyak rangka kerja pembangunan mudah alih yang popular, seperti React Native dan Ionic, menyokong mod MVC.
Atas ialah kandungan terperinci Corak Reka Bentuk MVC di Vanilla JavaScript. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!