Prinsip MVC dalam pengaturcaraan web. Mari kembali kepada pelaksanaan MVC. Peraturan am untuk memilih corak

Ramai orang mula menulis projek untuk bekerja dengan satu tugas, tidak membayangkan bahawa ia boleh berkembang menjadi sistem pengurusan berbilang pengguna, contohnya, kandungan atau, Allah melarang, pengeluaran. Dan semuanya kelihatan hebat dan hebat, semuanya berfungsi, sehingga anda mula memahami bahawa kod yang ditulis terdiri sepenuhnya daripada tongkat dan kod keras. Kod bercampur dengan susun atur, pertanyaan dan tongkat, kadangkala tidak boleh dibaca. Masalah mendesak timbul: apabila menambah ciri baharu, anda perlu bermain-main dengan kod ini untuk masa yang sangat lama, mengingati "apa yang ditulis di sana?" dan mengutuk diri sendiri pada masa lalu.

Anda mungkin pernah mendengar tentang corak reka bentuk dan juga membaca buku-buku indah ini:

  • E. Gamma, R. Helm, R. Johnson, J. Vlissides “Teknik objektif reka bentuk berorientasikan. Corak Reka Bentuk";
  • M. Fowler "Seni Bina Aplikasi Perisian Perusahaan."
Dan ramai, tidak gentar dengan manual dan dokumentasi yang besar, cuba mengkaji mana-mana rangka kerja moden dan, berhadapan dengan kerumitan pemahaman (disebabkan kehadiran banyak konsep seni bina yang dihubungkan dengan bijak antara satu sama lain), menangguhkan kajian dan penggunaan alat moden "pada penunu belakang."

Artikel ini akan berguna terutamanya untuk pemula. Walau apa pun, saya berharap dalam beberapa jam anda akan dapat mendapatkan idea tentang pelaksanaan corak MVC, yang mendasari semua rangka kerja web moden, dan juga mendapatkan "makanan" untuk renungan lanjut tentang "cara untuk lakukannya." Di akhir artikel terdapat pilihan pautan yang berguna, yang juga akan membantu anda memahami rangka kerja web yang terdiri daripada (selain MVC) dan cara ia berfungsi.

Pengaturcara PHP yang berpengalaman tidak mungkin menemui sesuatu yang baru untuk diri mereka sendiri dalam artikel ini, tetapi ulasan dan ulasan mereka pada teks utama akan sangat membantu! Kerana Tanpa teori, amalan adalah mustahil, dan tanpa amalan, teori adalah sia-sia, kemudian mula-mula akan ada sedikit teori, dan kemudian kita akan beralih kepada amalan. Jika anda sudah biasa dengan konsep MVC, anda boleh melangkau bahagian teori dan terus ke latihan.

1. Teori Corak MVC menerangkan cara mudah untuk menstruktur aplikasi, yang tujuannya adalah untuk memisahkan logik perniagaan daripada antara muka pengguna. Akibatnya, aplikasi lebih mudah untuk skala, ujian, penyelenggaraan dan, sudah tentu, dilaksanakan.

Mari lihat gambarajah konsep corak MVC (pada pendapat saya, ini adalah gambar rajah paling berjaya yang saya lihat):

Dalam seni bina model MVC menyediakan data dan peraturan logik perniagaan, pandangan bertanggungjawab untuk antaramuka pengguna, dan pengawal menyediakan interaksi antara model dan pandangan.

Aliran biasa aplikasi MVC boleh diterangkan seperti berikut:

  • Apabila pengguna melawat sumber web, skrip permulaan mencipta contoh aplikasi dan melancarkannya untuk pelaksanaan.
    Ini memaparkan paparan, katakan, halaman utama tapak.
  • Aplikasi menerima permintaan daripada pengguna dan menentukan pengawal dan tindakan yang diminta. Dalam kes halaman utama, tindakan lalai dilakukan ( indeks).
  • Aplikasi membuat instantiate pengawal dan menjalankan kaedah tindakan,
    yang, sebagai contoh, mengandungi panggilan model yang membaca maklumat daripada pangkalan data.
  • Selepas ini, tindakan mencipta paparan dengan data yang diperoleh daripada model dan memaparkan hasilnya kepada pengguna.
  • Model - mengandungi logik perniagaan aplikasi dan termasuk kaedah untuk pensampelan (ini boleh menjadi kaedah ORM), pemprosesan (contohnya, peraturan pengesahan) dan menyediakan data khusus, yang sering menjadikannya sangat tebal, yang agak normal.
    Model tidak boleh berinteraksi secara langsung dengan pengguna. Semua pembolehubah yang berkaitan dengan permintaan pengguna mesti diproses dalam pengawal.
    Model tidak boleh menjana HTML atau kod paparan lain yang boleh berubah bergantung pada keperluan pengguna. Kod sedemikian harus diproses dalam paparan.
    Model yang sama, sebagai contoh: model pengesahan pengguna boleh digunakan dalam kedua-dua bahagian pengguna dan pentadbiran aplikasi. Dalam kes ini, ia boleh diambil kod am ke dalam kelas yang berasingan dan mewarisi daripadanya, mentakrifkan kaedah khusus untuk subaplikasi dalam keturunannya.

    View - digunakan untuk menentukan paparan luaran data yang diterima daripada pengawal dan model.
    Paparan mengandungi penanda HTML dan sisipan kecil kod PHP untuk melintasi, memformat dan memaparkan data.
    Tidak boleh mengakses pangkalan data secara langsung. Inilah yang harus dilakukan oleh model.
    Tidak boleh berfungsi dengan data yang diperoleh daripada permintaan pengguna. Tugas ini mesti dilakukan oleh pengawal.
    Boleh mengakses secara langsung sifat dan kaedah pengawal atau model untuk mendapatkan data sedia keluaran.
    Paparan biasanya dibahagikan kepada templat biasa, mengandungi penanda biasa kepada semua halaman (contohnya, pengepala dan pengaki) dan bahagian templat yang digunakan untuk memaparkan output data daripada model atau memaparkan borang kemasukan data.

    Pengawal ialah gam yang menghubungkan model, pandangan dan komponen lain ke dalam aplikasi kerja. Pengawal bertanggungjawab untuk memproses permintaan pengguna. Pengawal seharusnya tidak mengandungi pertanyaan SQL. Adalah lebih baik untuk menyimpannya dalam model. Pengawal tidak boleh mengandungi HTML atau penanda lain. Ia berbaloi untuk memaparkannya.
    Dalam aplikasi MVC yang direka dengan baik, pengawal biasanya sangat nipis dan mengandungi hanya beberapa dozen baris kod. Perkara yang sama tidak boleh dikatakan tentang Stupid Fat Controllers (SFC) dalam CMS Joomla. Logik pengawal agak tipikal dan kebanyakannya dipindahkan ke kelas asas.
    Model, sebaliknya, sangat tebal dan mengandungi kebanyakan kod yang berkaitan dengan pemprosesan data, kerana struktur data dan logik perniagaan yang terkandung di dalamnya biasanya agak khusus untuk aplikasi tertentu.

    1.1. Pengawal Hadapan dan Pengawal Halaman Dalam kebanyakan kes, interaksi pengguna dengan aplikasi web berlaku melalui klik pada pautan. Lihat sekarang pada bar alamat penyemak imbas anda - anda menerima teks ini daripada pautan ini. Pautan lain, seperti yang berada di sebelah kanan halaman ini, akan memberikan anda kandungan yang berbeza. Oleh itu, pautan mewakili arahan khusus kepada aplikasi web.

    Saya harap anda telah menyedari bahawa tapak yang berbeza boleh mempunyai sempurna format yang berbeza pembinaan bar alamat. Setiap format boleh memaparkan seni bina aplikasi web. Walaupun ini tidak selalu berlaku, dalam kebanyakan kes ia adalah fakta yang jelas.

    Mari kita pertimbangkan dua pilihan untuk bar alamat, yang memaparkan beberapa teks dan profil pengguna.

    Anggaran kod pemprosesan dalam kes ini:
    suis($_GET["action"]) ( case "about" : require_once("about.php"); // "Mengenai Kami" pemecahan halaman; case "contacts" : require_once("contacts.php"); // Pemisah halaman "Kenalan"; kes "maklum balas" : require_once("maklum balas.php"); // Pemisah halaman "Maklum Balas"; lalai: require_once("page404.php"); // pemecahan halaman "404"; )
    Saya rasa hampir semua orang pernah melakukan ini sebelum ini.

    Menggunakan enjin penghalaan URL, anda boleh mengkonfigurasi aplikasi anda untuk menerima permintaan seperti ini untuk memaparkan maklumat yang sama:
    http://www.example.com/contacts/feedback

    Di sini kenalan mewakili pengawal, dan maklum balas ialah kaedah pengawal kenalan yang memaparkan borang maklum balas, dsb. Kami akan kembali kepada isu ini dalam bahagian praktikal.

    Perlu juga diketahui bahawa banyak penghala rangka kerja web membenarkan anda membuat laluan URL tersuai (nyatakan maksud setiap bahagian URL) dan peraturan untuk memprosesnya.
    Kini kami mempunyai pengetahuan teori yang mencukupi untuk meneruskan amalan.

    2. Berlatih Mula-mula, mari buat struktur berikut fail dan folder:


    Melihat ke hadapan, saya akan mengatakan bahawa kelas teras Model, View dan Controller akan disimpan dalam folder teras.
    Anak-anak mereka akan disimpan dalam direktori pengawal, model dan pandangan. Fail index.php ialah titik masuk ke dalam aplikasi. Fail bootstrap.php memulakan pemuatan aplikasi, menyambungkan semua modul yang diperlukan, dsb.

    Kami akan pergi secara berurutan; Mari buka fail index.php dan isi dengan kod berikut:
    ini_set("display_errors", 1); memerlukan_sekali "application/bootstrap.php";
    Tidak sepatutnya ada sebarang soalan di sini.

    Seterusnya, mari segera pergi ke fail bootstrap.php:
    memerlukan_sekali "teras/model.php"; memerlukan_sekali "teras/view.php"; memerlukan_sekali "teras/pengawal.php"; memerlukan_sekali "teras/laluan.php"; Route::start(); //mulakan penghala
    Tiga baris pertama akan termasuk fail kernel yang tidak wujud pada masa ini. Baris terakhir sambungkan fail dengan kelas penghala dan lancarkannya untuk pelaksanaan dengan memanggil kaedah statik mulakan.

    2.1. Melaksanakan Penghala URL Buat masa ini, mari kita menyimpang daripada pelaksanaan corak MVC dan fokus pada penghalaan. Langkah pertama yang perlu kita lakukan ialah menulis kod berikut dalam .htaccess:
    RewriteEngine On RewriteCond %(REQUEST_FILENAME) !-f RewriteCond %(REQUEST_FILENAME) !-d RewriteRule .* index.php [L]
    Kod ini akan mengubah hala semua pemprosesan halaman ke index.php, yang kami perlukan. Ingat di bahagian pertama kita bercakap tentang Pengawal Depan?!

    Kami akan meletakkan laluan masuk fail berasingan route.php ke direktori teras. Dalam fail ini kami akan menerangkan kelas Route, yang akan menjalankan kaedah pengawal, yang seterusnya akan menjana paparan halaman.

    Kandungan fail route.php

    Laluan kelas ( fungsi statik mula () ( // pengawal dan tindakan lalai $controller_name = "Utama"; $action_name = "index"; $routes = meletup("/", $_SERVER["REQUEST_URI"]); // dapatkan nama pengawal jika (!empty($routes)) ( $controller_name = $routes; ) // dapatkan nama tindakan jika (!empty($routes)) ( $action_name = $routes; ) // tambah awalan $model_name = " Model_".$controller_name; $controller_name = "Controller_".$controller_name; $action_name = "action_".$action_name; // sambungkan fail dengan kelas model (mungkin tiada fail model) $model_file = strtolower ($model_name). ".php"; $model_path = "application/models/".$model_file; if(file_exists($model_path)) ( masukkan "application/models/".$model_file; ) // sambungkan fail dengan kelas pengawal $controller_file = strtolower ($controller_name)..php"; $controller_path = "application/controllers/".$controller_file; if(file_exists($controller_path)) ( masukkan "application/controllers/".$controller_file; ) else ( /* adalah betul untuk membuang pengecualian di sini, tetapi untuk memudahkan perkara, kami akan segera mengubah hala ke halaman 404 */ Route::ErrorPage404(); ) // buat pengawal $controller = new $controller_name ; $action = $action_name; if(method_exists($controller, $action)) ( // panggil tindakan pengawal $controller->$action(); ) else ( // di sini juga lebih bijak untuk membuang pengecualian Route::ErrorPage404(); ) ) fungsi ErrorPage404( ) ($host = "http://".$_SERVER["HTTP_HOST"]."/"; header("HTTP/1.1 404 Tidak ditemui"); header("Status: 404 Not Found"); header("Lokasi:".$host."404"); ) )


    Saya perhatikan bahawa kelas melaksanakan logik yang sangat mudah (walaupun kod besar) dan mungkin mempunyai masalah keselamatan. Ini dilakukan dengan sengaja, kerana... menulis kelas penghalaan penuh patut mendapat sekurang-kurangnya artikel berasingan. Mari kita lihat perkara utama...

    Dalam unsur tatasusunan global$_SERVER["REQUEST_URI"] mengandungi alamat penuh yang mana pengguna menghubungi.
    Contohnya: example.ru/contacts/feedback

    Menggunakan fungsi meletup Alamat dibahagikan kepada komponen. Akibatnya, kami mendapat nama pengawal, untuk contoh yang diberikan, ini adalah pengawal kenalan dan nama tindakan, dalam kes kami - maklum balas.

    Seterusnya, fail model (model mungkin tiada) dan fail pengawal, jika ada, disambungkan dan akhirnya, contoh pengawal dibuat dan tindakan dipanggil, sekali lagi, jika ia diterangkan dalam kelas pengawal.

    Oleh itu, apabila pergi ke, sebagai contoh, alamat:
    example.com/portfolio
    atau
    example.com/portfolio/index
    Penghala akan melakukan tindakan berikut:

  • akan memasukkan fail model_portfolio.php daripada folder model, yang mengandungi kelas Model_Portfolio;
  • akan memasukkan fail controller_portfolio.php daripada folder pengawal, yang mengandungi kelas Controller_Portfolio;
  • akan membuat contoh kelas Controller_Portfolio dan memanggil tindakan lalai - action_index, yang diterangkan di dalamnya.
  • Jika pengguna cuba mengakses alamat pengawal yang tidak wujud, contohnya:
    example.com/ufo
    maka dia akan dialihkan ke halaman "404":
    example.com/404
    Perkara yang sama akan berlaku jika pengguna mengakses tindakan yang tidak diterangkan dalam pengawal.2.2. Mari kembali ke pelaksanaan MVC Mari pergi ke folder teras dan tambah tiga lagi fail pada fail route.php: model.php, view.php dan controller.php


    Biar saya ingatkan anda bahawa ia akan mengandungi kelas asas, yang kini kita akan mula menulis.

    Kandungan fail model.php
    Model kelas ( fungsi awam get_data() ( ) )
    Kelas model mengandungi satu kaedah pengambilan data kosong, yang akan ditindih dalam kelas turunan. Apabila kita mencipta kelas keturunan semuanya akan menjadi lebih jelas.

    Kandungan fail view.php
    class View ( //public $template_view; // di sini anda boleh menentukan paparan umum lalai. function generate($content_view, $template_view, $data = null) ( /* if(is_array($data)) ( // convert array elemen ke dalam ekstrak pembolehubah($data); ) */ sertakan "application/views/".$template_view; ) )
    Ia tidak sukar untuk meneka bahawa kaedah menjana bertujuan untuk membentuk pandangan. Parameter berikut dihantar kepadanya:

  • $content_file - paparan memaparkan kandungan halaman;
  • $template_file - templat biasa kepada semua halaman;
  • $data ialah tatasusunan yang mengandungi elemen kandungan halaman. Biasanya diisi dalam model.
  • Fungsi sertakan secara dinamik menghubungkan templat umum (pandangan) di mana paparan akan dibenamkan
    untuk memaparkan kandungan halaman tertentu.

    Dalam kes kami, templat umum akan mengandungi pengepala, menu, bar sisi dan pengaki, dan kandungan halaman akan terkandung dalam bentuk berasingan. Sekali lagi, ini dilakukan untuk kesederhanaan.

    Kandungan fail controller.php
    Pengawal kelas ( public $model; public $view; function __construct() ( $this->view = new View(); ) function action_index() ( ) )
    Kaedah indeks_tindakan- ini ialah tindakan yang dipanggil secara lalai; kami akan mengatasinya apabila melaksanakan kelas keturunan.

    2.3. Pelaksanaan kelas turunan Model dan Pengawal, penciptaan View "s Sekarang keseronokan bermula! Laman web kad perniagaan kami akan terdiri daripada halaman berikut:
  • rumah
  • Perkhidmatan
  • Portfolio
  • Kenalan
  • Dan juga - halaman "404".
  • Setiap halaman mempunyai pengawal sendiri dari folder pengawal dan paparan dari folder pandangan. Sesetengah halaman mungkin menggunakan model atau model daripada folder model.


    Dalam rajah sebelumnya, fail template_view.php diserlahkan secara berasingan - ini adalah templat yang mengandungi markup biasa untuk semua halaman. Dalam kes paling mudah ia boleh kelihatan seperti ini:
    rumah
    Untuk memberikan tapak rupa yang rapi, kami mencipta templat CSS dan menyepadukannya ke dalam tapak kami dengan mengubah struktur penanda HTML dan Sambungan CSS dan fail JavaScript:

    Pada penghujung artikel, dalam bahagian "Hasil", terdapat pautan ke repositori GitHub dengan projek yang mana langkah telah diambil untuk menyepadukan templat mudah.

    2.3.1. Mencipta halaman utama Mari kita mulakan dengan controller controller_main.php , berikut ialah kodnya:
    kelas Controller_Main memanjangkan Pengawal ( function action_index() ( $this->view->generate("main_view.php", "template_view.php"); ) )
    Dalam kaedah menjana contoh kelas Lihat, nama fail templat umum dan paparan dengan kandungan halaman diluluskan.
    Sebagai tambahan kepada tindakan indeks, pengawal sudah tentu boleh mengandungi tindakan lain.

    Kami menyemak fail paparan umum sebelum ini. Pertimbangkan fail kandungan main_view.php:
    Selamat datang!

    OLOLOSHA TEAM ialah pasukan pakar kelas pertama dalam bidang pembangunan laman web dengan pengalaman bertahun-tahun dalam mengumpul topeng Mexico, patung gangsa dan batu dari India dan Ceylon, relief dan arca yang dicipta oleh pakar Afrika Khatulistiwa lima atau enam abad lalu...


    Ini mengandungi markup mudah tanpa sebarang panggilan PHP.
    Untuk memaparkan halaman utama, anda boleh menggunakan salah satu daripada alamat berikut:

    Kami akan mempertimbangkan contoh menggunakan paparan yang memaparkan data yang diperoleh daripada model di bawah.

    2.3.2. Buat halaman "Portfolio" Dalam kes kami, halaman "Portfolio" ialah satu-satunya halaman yang menggunakan model.
    Model biasanya termasuk kaedah pensampelan data, contohnya:
  • kaedah perpustakaan pgsql atau mysql asli;
  • kaedah perpustakaan yang melaksanakan abstraksi data. Sebagai contoh, kaedah perpustakaan PEAR MDB2;
  • kaedah ORM;
  • kaedah untuk bekerja dengan NoSQL;
  • dan lain-lain.
  • Untuk memudahkan, kami tidak akan menggunakan pertanyaan SQL atau pernyataan ORM di sini. Sebaliknya, kami akan mencontohi data sebenar dan segera mengembalikan pelbagai hasil.
    Letakkan fail model model_portfolio.php dalam folder model. Berikut adalah kandungannya:
    class Model_Portfolio memanjangkan Model ( public function get_data() ( return array(array("Year" => "2012", "Site" => "http://DunkelBeer.ru", "Description" => "Tapak promosi bagi bir Dunkel gelap dari pengeluar Jerman Löwenbraü yang dihasilkan di Rusia oleh syarikat pembuatan bir "SUN InBev."), array("Year" => "2012", "Site" => "http://ZopoMobile.ru", "Description " => "Katalog bahasa Rusia telefon Cina Syarikat Zopo berdasarkan OS Android dan aksesori untuk mereka."), // todo); ) )

    Kelas pengawal model terkandung dalam fail controller_portfolio.php, berikut ialah kodnya:
    kelas Controller_Portfolio memanjangkan Pengawal ( function __construct() ($this->model = new Model_Portfolio(); $this->view = new View(); ) function action_index() ($data = $this->model->get_data( ); $this->view->generate("portfolio_view.php", "template_view.php", $data); ) )
    Kepada pembolehubah data tatasusunan yang dikembalikan oleh kaedah ditulis dapatkan_data yang kita tengok tadi.
    Pembolehubah ini kemudiannya diluluskan sebagai parameter kaedah menjana, yang juga mengandungi: nama fail dengan templat umum dan nama fail yang mengandungi paparan dengan kandungan halaman.

    Paparan yang mengandungi kandungan halaman adalah dalam fail portfolio_view.php.
    Portfolio

    Semua projek dalam jadual berikut adalah rekaan, jadi jangan cuba mengikuti pautan yang disediakan.
    tahunProjekPenerangan


    Segala-galanya mudah di sini, paparan memaparkan data yang diperoleh daripada model.

    2.3.3. Mencipta halaman selebihnya Halaman selebihnya dibuat dengan cara yang sama. Kod mereka tersedia dalam repositori GitHub, pautan yang disediakan pada penghujung artikel, dalam bahagian "Hasil".3. Keputusan Inilah yang berlaku pada akhirnya:

    Tangkapan skrin tapak web kad perniagaan yang terhasil



    Pautan GitHub: https://github.com/vitalyswipe/tinymvc/zipball/v0.1

    Tetapi dalam versi ini saya melakarkan kelas berikut (dan jenis yang sepadan):

    • Controller_Login di mana paparan dijana dengan borang untuk memasukkan log masuk dan kata laluan, selepas mengisi prosedur pengesahan dijalankan dan, jika berjaya, pengguna dialihkan ke panel pentadbir.
    • Contorller_Admin dengan tindakan indeks yang menyemak sama ada pengguna telah diberi kuasa sebelum ini di tapak sebagai pentadbir (jika ya, paparan panel pentadbir dipaparkan) dan tindakan log keluar untuk log keluar.
    Pengesahan dan kebenaran adalah topik yang berbeza, jadi ia tidak dibincangkan di sini, tetapi hanya pautan yang diberikan di atas disediakan supaya anda mempunyai sesuatu untuk bermula.4. Kesimpulan Corak MVC digunakan sebagai asas seni bina dalam banyak rangka kerja dan CMS yang dicipta untuk dapat membangunkan kualiti yang lebih tinggi penyelesaian yang kompleks dalam tempoh masa yang lebih singkat. Ini dimungkinkan dengan meningkatkan tahap abstraksi, kerana terdapat had kepada kerumitan struktur yang boleh dikendalikan oleh otak manusia.

    Tetapi, menggunakan rangka kerja web seperti Yii atau Kohana, yang terdiri daripada beberapa ratus fail, apabila membangunkan aplikasi web mudah (contohnya, tapak kad perniagaan) tidak selalu digalakkan. Kini kita boleh mencipta model MVC yang cantik supaya tidak mencampurkan Php, Html, CSS dan kod JavaScript dalam satu fail.

    Artikel ini lebih merupakan titik permulaan untuk mempelajari CMF daripada contoh sesuatu yang benar-benar betul yang boleh anda gunakan sebagai asas untuk aplikasi web anda. Mungkin ia juga memberi inspirasi kepada anda dan anda sudah berfikir tentang menulis rangka kerja mikro atau CMS anda sendiri berdasarkan MVC. Tetapi, sebelum mencipta semula roda seterusnya dengan "blackjack dan pelacur," fikirkan sekali lagi: mungkin lebih munasabah untuk mengarahkan usaha anda kepada pembangunan dan membantu komuniti projek yang sedia ada?!

    P.S.: Artikel itu telah ditulis semula dengan mengambil kira beberapa komen yang ditinggalkan dalam komen. Kritikan itu ternyata sangat berguna. Berdasarkan maklum balas: komen, PM dan bilangan pengguna yang menambahkan siaran ke kegemaran, idea untuk menulis siaran ini ternyata tidak begitu buruk. Malangnya, tidak mungkin untuk mengambil kira semua hasrat dan menulis lebih banyak dan lebih terperinci kerana kekurangan masa ... tetapi mungkin individu misterius yang menolak versi asal akan melakukan ini. Semoga berjaya dengan projek anda!

    5. Pilihan pautan yang berguna mengenai subjek Artikel ini sering menyentuh topik rangka kerja web - ini adalah topik yang sangat luas, kerana kerangka kerja mikro pun terdiri daripada banyak komponen yang saling berkaitan dengan bijak dan memerlukan lebih daripada satu artikel untuk membincangkan perkara ini komponen. Walau bagaimanapun, saya memutuskan untuk membentangkan di sini pilihan kecil pautan (yang saya ikuti semasa menulis artikel ini) yang dalam satu cara atau yang lain berkaitan dengan topik rangka kerja.

    Tag: Tambah tag

    Selamat petang, rakan sekerja yang dikasihi. Dalam artikel ini saya ingin bercakap tentang pemahaman analitikal saya tentang perbezaan antara corak MVC, MVP dan MVVM. Saya digesa untuk menulis artikel ini dengan keinginan untuk memahami pendekatan moden untuk pembangunan perisian besar dan berkaitan ciri-ciri seni bina. Pada peringkat semasa tangga kerjaya saya, saya bukan pembangun langsung, jadi artikel itu mungkin mengandungi ralat, ketidaktepatan dan salah faham. Tertarik dengan cara penganalisis melihat apa yang dilakukan pengaturcara dan arkitek? Kemudian selamat datang ke kucing.

    Pautan Perkara pertama yang saya ingin mulakan ialah pautan ke bahan luaran, yang membimbing saya dalam proses menulis artikel ini:
    Pengenalan Dalam masa matahari bersinar lebih terang dan rumput lebih hijau, sekumpulan pelajar seperti pengarang artikel ini membangunkan perisian dengan menulis ratusan baris kod terus ke antara muka produk. Kadangkala perkhidmatan dan pengurus digunakan untuk bekerja dengan data, dan kemudian penyelesaiannya diperoleh menggunakan corak Paparan Dokumen. Menyokong kod tersebut memerlukan kos yang besar, kerana pembangun baharu perlu dilatih (memberitahu) kod apa yang bertanggungjawab untuk apa yang terdapat dalam produk, dan tidak ada perbincangan mengenai sebarang ujian unit. Pasukan pembangunan adalah 4 orang yang duduk dalam satu bilik.
    Masa berlalu, kerja berubah. Aplikasi yang dibangunkan menjadi lebih besar dan lebih kompleks; daripada satu pasukan pembangun yang rapat, terdapat banyak pasukan yang berbeza pemaju, arkitek, pakar kebolehgunaan, pereka bentuk dan PM. Kini semua orang bertanggungjawab untuk kawasan mereka sendiri: GUI, logik perniagaan, komponen. Sebuah jabatan analisis, ujian dan seni bina muncul. Kos pembangunan perisian telah meningkat ratusan malah beribu kali ganda. Pendekatan pembangunan ini memerlukan seni bina yang stabil yang akan menyegerakkan kawasan fungsian produk yang berbeza antara satu sama lain.Corak Memandangkan matlamat mengurangkan kos buruh untuk membangunkan perisian yang kompleks, kami menganggap bahawa adalah perlu untuk menggunakan penyelesaian bersatu sedia dibuat. Lagipun, tindakan templat memudahkan komunikasi antara pembangun, membolehkan anda merujuk kepada reka bentuk yang terkenal dan mengurangkan bilangan ralat.
    Menurut Wikipedia, corak reka bentuk ialah reka bentuk seni bina berulang yang mewakili penyelesaian kepada masalah reka bentuk dalam beberapa konteks yang kerap berlaku.

    Mari kita mulakan dengan perkara utama yang pertama - Model-View-Controller. MVC ialah corak asas yang telah menemui banyak teknologi, melahirkan teknologi baharu dan menjadikan kehidupan lebih mudah untuk pembangun setiap hari.

    Pertama Corak MVC muncul dalam bahasa SmallTalk. Pemaju sepatutnya membuat keputusan penyelesaian seni bina, yang membolehkan kita berpisah GUI daripada logik perniagaan, dan logik perniagaan daripada data. Oleh itu, dalam versi klasiknya, MVC terdiri daripada tiga bahagian, yang memberikan namanya. Mari lihat mereka:

    Model Model biasanya difahami sebagai bahagian yang mengandungi logik perniagaan berfungsi aplikasi. Model mestilah bebas sepenuhnya daripada produk yang lain. Lapisan model tidak perlu mengetahui apa-apa tentang elemen reka bentuk atau cara ia akan dipaparkan. Keputusan dicapai yang membolehkan anda menukar pembentangan data, cara ia dipaparkan, tanpa menyentuh Model itu sendiri.

    Model ini mempunyai ciri-ciri berikut:

    • Model ialah logik perniagaan aplikasi;
    • Model mempunyai pengetahuan tentang dirinya dan tidak tahu tentang pengawal dan pandangan;
    • Untuk sesetengah projek, model ini hanyalah lapisan data (DAO, pangkalan data, fail XML);
    • Untuk projek lain, model itu ialah pengurus pangkalan data, satu set objek, atau hanya logik aplikasi;
    Lihat Tanggungjawab Paparan termasuk memaparkan data yang diterima daripada Model. Walau bagaimanapun, pandangan tidak boleh mempengaruhi model secara langsung. Kita boleh mengatakan bahawa paparan mempunyai akses baca sahaja kepada data.

    Perwakilan mempunyai ciri-ciri berikut:

    • Pandangan melaksanakan paparan data yang diperoleh daripada model dalam apa jua cara;
    • Dalam sesetengah kes, paparan mungkin mempunyai kod yang melaksanakan beberapa logik perniagaan.
    Contoh pembentangan: Halaman HTML, borang WPF, Borang Windows. Perbezaan antara MVP & MVVM & MVP Jenis corak MVC yang paling biasa ialah:
    • Model-View-Controller
    • Model-View-Penyampai
    • Model-View-View Model

    Mari kita pertimbangkan dan bandingkan setiap daripada mereka.

    Model-View-Penyampai

    Pendekatan ini membolehkan anda membuat abstraksi perwakilan. Untuk melakukan ini, anda perlu memilih antara muka paparan dengan set sifat dan kaedah tertentu. Penyampai pula, menerima rujukan kepada pelaksanaan antara muka, melanggan acara pembentangan dan mengubah suai model atas permintaan.

    Tanda-tanda penyampai:

    • Pandangan berinteraksi secara langsung dengan penyampai dengan memanggil fungsi atau acara yang sesuai pada contoh penyampai;
    • Penyampai berinteraksi dengan Paparan dengan menggunakan antara muka khas yang dilaksanakan oleh Paparan;
    • Satu contoh penyampai dikaitkan dengan satu paparan.

    Pelaksanaan:
    Setiap paparan mesti melaksanakan antara muka yang sepadan. Antara muka paparan mentakrifkan set fungsi dan peristiwa yang diperlukan untuk berinteraksi dengan pengguna (contohnya, IView .ShowErrorMessage(string msg)). Penyampai mesti mempunyai rujukan kepada pelaksanaan antara muka yang sepadan, yang biasanya diluluskan dalam pembina.
    Logik pembentangan mesti mempunyai rujukan kepada contoh penyampai. Semua acara paparan dihantar kepada penyampai untuk diproses dan hampir tidak pernah diproses oleh logik pembentangan (termasuk penciptaan pandangan lain).

    Contoh penggunaan: Windows Forms.

    Model-View-View Model

    Pendekatan ini membolehkan anda mengaitkan elemen paparan dengan sifat dan peristiwa model Paparan. Boleh dikatakan bahawa setiap lapisan corak ini tidak mengetahui kewujudan lapisan lain.

    Ciri-ciri model View:

    • Komunikasi dua hala dengan pembentangan;
    • Model pandangan ialah abstraksi pandangan. Biasanya bermaksud sifat pandangan adalah sama dengan sifat Paparan/Model
    • Model Paparan tidak mempunyai rujukan kepada antara muka paparan (IView). Menukar keadaan model Paparan secara automatik menukar paparan dan sebaliknya, kerana mekanisme pengikatan data digunakan (Pengikatan)
    • Satu contoh model Paparan dikaitkan dengan satu paparan.

    Pelaksanaan:
    Apabila menggunakan corak ini, paparan tidak melaksanakan antara muka yang sepadan (IView).
    Paparan mesti mempunyai pautan ke sumber data (DataContex), yang dalam kes ini ialah model Paparan. Elemen paparan terikat pada sifat dan peristiwa sepadan model Paparan.
    Sebaliknya, model View melaksanakan antara muka khas yang digunakan untuk kemas kini automatik elemen persembahan. Contoh antara muka sedemikian dalam WPF ialah INotifyPropertyChanged.

    Contoh penggunaan: WPF

    Model-View-Controller
    Idea utama corak ini ialah kedua-dua pengawal dan pandangan bergantung pada model, tetapi model tidak bergantung pada kedua-dua komponen ini.

    Ciri-ciri pengawal

    • Pengawal menentukan pandangan yang perlu dipaparkan pada masa ini;
    • Lihat acara hanya boleh menjejaskan pengawal. Pengawal boleh menjejaskan model dan menentukan paparan lain.
    • Pandangan berbilang boleh dilakukan untuk hanya satu pengawal;

    Pelaksanaan:
    Pengawal memintas peristiwa dari luar dan, mengikut logik yang tertanam di dalamnya, bertindak balas kepada peristiwa ini dengan menukar Model dengan memanggil kaedah yang sesuai. Selepas perubahan, Model menggunakan peristiwa yang telah diubah, dan semua acara Lihat melanggan ini, setelah menerimanya, beralih kepada Model untuk data dikemas kini, selepas itu ia dipaparkan.

    Contoh penggunaan: MVC ASP.NET

    Ringkasan Pelaksanaan corak MVVM dan MVP, pada pandangan pertama, kelihatan agak mudah dan serupa. Walau bagaimanapun, untuk MVVM pengikatan pandangan kepada model Paparan dilakukan secara automatik, tetapi untuk MVP adalah perlu untuk memprogramkan
    MVC nampaknya mempunyai lebih kawalan ke atas pandangan. Peraturan umum pemilihan corak MVVM
    • Digunakan dalam situasi di mana pengikatan data boleh dilakukan tanpa perlu memperkenalkan antara muka paparan khas (iaitu tidak perlu melaksanakan IView);
    • Contoh biasa ialah teknologi WPF.
    MVP
    • Digunakan dalam keadaan di mana pengikatan data tidak mungkin (Pengikatan tidak boleh digunakan);
    • Contoh biasa ialah menggunakan Borang Windows.
    MVC
    • Digunakan dalam situasi di mana komunikasi antara paparan dan bahagian lain aplikasi tidak dapat dilakukan (dan anda tidak boleh menggunakan MVVM atau MVP);
    • Kes penggunaan biasa ialah ASP.NET MVC.
    Kesimpulan Sebagai kesimpulan, penulis artikel ini ingin menunjukkan bahawa berpegang pada satu corak sahaja bukanlah pilihan terbaik. Sebagai contoh, bayangkan anda ingin menggunakan MVVM untuk membangunkan aplikasi dengan menggunakan Windows Borang melalui sifat kawalan Bindings. Matlamat anda adalah untuk memisahkan pembentangan daripada logik perniagaan dan logik yang menghubungkannya. Aplikasi itu harus mudah untuk diuji dan disokong, dan boleh difahami oleh penganalisis (lagipun, soalan "apa yang diukur dalam berusaha keras cakera" hanya ada satu jawapan yang betul - dalam Joules (contoh abstrak Models -> Views)).

    Terima kasih banyak atas masa anda, selamat membaca!

    Apakah MVC?

    Jadi, MVC adalah mengenai antara muka pengguna (UI). Tidak semestinya grafik, kawalan suara juga bagus. Jangan lupa bahawa program mungkin tidak mempunyai antara muka pengguna, tetapi mungkin mempunyai antara muka perisian(API) atau tiada langsung dan masih berguna.

    Tetapi jika kita mempunyai pengguna, maka mesti ada antara muka pengguna. Apakah antara muka? Ini adalah sempadan bersebelahan antara dua sistem. Dalam kes kami: di satu pihak - program, di pihak yang lain - pengguna. Di sini mereka.

    Program ini sepenuhnya abstrak, sebarang kod subjek. Ia boleh melakukan sesuatu yang berguna, dan pengguna mempunyai keperluan yang boleh dipenuhi dengan bantuan program ini. Kemudian kepingan logik muncul yang "tahu" bagaimana, menggunakan program ini, untuk melakukan secara langsung apa yang pengguna mahu. Potongan-potongan itu bukan logik khusus subjek, khusus subjek dalam program. Ia lebih relevan kepada pengguna dengan keperluan khususnya, dan merupakan gabungan panggilan dan panggilan ke program.

    Kes guna

    Sebagai contoh, bayangkan terminal untuk berdagang di bursa. Pengguna terminal menghantar permohonan di mana dia menunjukkan bahawa dia ingin membeli 20 saham syarikat Svetly Put pada harga 1,500 rubel sesaham. Ia juga menunjukkan bahawa permohonan itu sah selama empat jam, dan dari akaun mana wang itu akan didebitkan jika transaksi itu berjaya.

    Sebilangan ketara atribut. Beberapa masa berlalu, dan dia menyedari bahawa dia tidak akan dapat membeli pada harga ini dan bersedia untuk menaikkan harga kepada 1,550 rubel, meninggalkan semua nilai lain. Kemudian dia memilih aplikasi ini, mengklik butang "edit", menunjukkan harga baru, Ya. Ia selesa.

    Tetapi pada pertukaran anda tidak boleh menukar pesanan; dalam kawasan subjek tidak ada konsep sedemikian. Permohonan hanya boleh dihantar dan dibatalkan. Untuk memberi pengguna peluang untuk menukar pesanan dalam satu klik, anda perlu mengingati nilai lama, mengalih keluar pesanan, biarkan mereka mengedit perkara yang mereka ingat dan membuat pesanan baharu. Gabungan sedemikian. Tetapi bagi pengguna ia kelihatan seperti satu tindakan mudah: menukar aplikasi. Ini dipanggil use case.

    Mari tambahkan rajah kami dengan ruang untuk kes penggunaan.

    Pengguna juga harus diberi peluang untuk menarik kes penggunaan ini dan mendapatkan hasil. Ini boleh menjadi butang dan elemen input/output grafik lain, gerak isyarat, pengecaman pertuturan dan sintesis. Sebarang pilihan untuk bertukar-tukar data dan arahan. Voila:

    Pengguna menarik salah satu kes penggunaan, yang seterusnya, memanipulasi program. Program ini menerbitkan keputusan atau perubahan dalam keadaannya.

    Jadi di manakah MVC pula?

    Yang tinggal hanyalah memberikan nama biasa kepada komponen yang terhasil.

    Apabila model menerbitkan perubahan, ia tidak peduli untuk siapa, ia tidak tahu apa-apa tentang View. Daripada atau bersama-sama dengan View, mungkin terdapat subsistem lain di hujung yang lain.

    Sekarang beberapa butiran.

    Ia adalah versi klasik MVC - Model Aktif. Ia juga berlaku bahawa model tidak memberitahu tentang perubahan. Kemudian pengawal mengambil tanggungjawab ini. Dia tahu manipulasi yang dia lakukan pada model itu, dan, jelas sekali, dia tahu perubahan dalam keadaan model yang mungkin berlaku. Ini adalah Model Pasif.

    Dan seketika. Pembahagian kod kepada subjek dan bukan subjek adalah bersyarat dan bergantung pada tahap pedantik kita mahu membuat model bidang subjek. Kadangkala adalah keputusan yang rasional untuk memasukkan beberapa jenis kes penggunaan dalam model. Mungkin ini akan mengurangkan jumlah kod secara keseluruhan dan memudahkannya.

    Kami mengucapkan terima kasih kepada pelanggan kami Stanislav Ilyichev untuk bahan tersebut

    Di dalam bilik

      elemen pelindung- Tera air: tradisi dan inovasi

      titik pertemuan- Ini adalah wang esok

      sudut pandangan- Tayangan perdana dan trend

      tahu bagaimana- Pertahanan dua muka

      tahu bagaimana- Rahsia keseluruhan ada pada kanta

      dokumen - pasport Kanada: seni teknologi

      pembangunan - Serabut keselamatan: peluang baru

      setem- Jubin, nikel dan puisi Brodsky

      tanda-tanda sejarah- Poskad: laluan daripada "telegram pos" kepada poster propaganda

      persiaran- Drama Armenia: wang menggambarkan sejarah

    Mudah untuk diperiksa, sukar untuk diulang

    DALAM tahun lepas Goznak secara aktif membangunkan dan memasarkan teknologi perlindungan yang paling berkesan. Antaranya, dua arah menyerlah: untuk mencipta elemen yang boleh dilihat kepada cahaya, dan ciri yang diperoleh melalui gabungan offset dan metalografi.

    Hari ini, industri wang kertas mendapat permintaan yang lebih besar berbanding sebelum ini untuk penyelesaian teknologi dan keselamatan yang berkesan. Dalam beberapa tahun kebelakangan ini, Goznak telah membayar Perhatian istimewa pembangunan dan promosi ke pasaran penyelesaian sedemikian, konsep yang boleh dirumuskan seperti berikut: pembangunan ciri keselamatan yang mudah dikenal pasti, tetapi sukar untuk menghasilkan semula, diperoleh menggunakan peralatan standard. Kami akan menggambarkan pendekatan ini kepada pembangunan teknologi keselamatan yang berkesan menggunakan contoh pembangunan dua arah: mendapatkan ciri pembolehubah optik yang boleh dilihat melalui penghantaran, dan ciri yang diperoleh melalui gabungan percetakan offset dan intaglio.

    Teknologi Tercerahkan

    Tera air, diperhatikan dalam kertas dalam cahaya yang dihantar, kekal sebagai ciri keselamatan paling popular di kalangan penduduk. Pada masa yang sama, ia maju dari segi teknologi, dan pengalaman menghasilkan kertas dengan tera air bermula sejak lebih tujuh abad. Itulah sebabnya dalam beberapa tahun kebelakangan ini, terima kasih kepada kemunculan teknologi baru untuk pembuatan produk seragam, ciri perlindungan ini telah menerima perkembangan baru. Tera air berbilang nada dalam hampir semua wang kertas moden telah memberi laluan kepada tera air yang diperoleh dengan menggabungkan tanda berbilang nada dan kerawang. Dan pada masa ini, teknologi untuk mendapatkan tera air menggunakan kerawang berbilang peringkat kompleks sedang giat dilaksanakan. Majalah Watermark telah berulang kali bercakap tentang tera air ini. Teknologi ini memungkinkan untuk mendapatkan bukan sahaja kawasan terang yang berbeza pada tanda, tetapi juga imej dengan garisan tinggi, tidak tipikal untuk tera air.

    Benang keselamatan, seperti tera air dikawal penghantaran, adalah, tidak seperti yang kedua, tidak begitu sejarah panjang- lebih sedikit daripada satu setengah abad. Walau bagaimanapun, mereka bertapak kukuh pada tingkat atas teknologi perlindungan. Ini disebabkan kedua-dua kebolehkilangan kertas dengan benang keselamatan yang baik dan keupayaan luasnya untuk bertindak sebagai pembawa pelbagai ciri dan kesan keselamatan. Walaupun kelebihan yang tidak dapat dinafikan berbanding tera air, terdapat lebih banyak lagi harga tinggi Benang keselamatan itu sendiri mengurangkan keberkesanan penggunaannya, terutamanya pada denominasi rendah, di mana, sebagai peraturan, pilihan benang yang paling mudah dan, sewajarnya, lebih murah digunakan. Itulah sebabnya salah satu arahan dalam pembangunan benang keselamatan di Goznak ialah pengeluaran tetingkap lutsinar yang luas di dalam kertas dengan memperkenalkan pita polimer lutsinar lebar semasa penuangan kertas, diikuti dengan penggunaan standard teknologi percetakan untuk mendapatkan kesan perlindungan di kawasan tingkap. Oleh kerana filem polimer dari mana pita itu dibuat adalah produk yang dihasilkan secara besar-besaran dan tidak mengandungi ciri perlindungan eksklusif, kosnya jauh lebih rendah daripada kos benang yang mempunyai pembolehubah warna, pembolehubah optik dan ciri berteknologi tinggi yang lain. Pada masa yang sama, ciri pembolehubah optikal yang sangat selamat yang serupa boleh diperoleh menggunakan teknologi percetakan tradisional, yang menjadikannya penyelesaian teknikal lebih cekap.

    Inilah pendekatan yang telah dilaksanakan dalam wang kertas peringatan Sochi 2014. Dalam tetingkap lutsinar, diperoleh dengan memasukkan pita polimer lebar ke dalam kertas semasa air surut, elemen pelindung pembolehubah optik "Zebra" dibuat menggunakan kaedah metalografi. Apabila dilihat dalam cahaya dan lancar memutar wang kertas, anda boleh melihat bagaimana imej kepingan salji dalam tetingkap berubah daripada negatif kepada positif.

    Bagaimana jika anda tidak memperkenalkan pita polimer untuk mendapatkan ciri pembolehubah optik yang dikawal oleh penghantaran? Atau, dengan cara lain, bagaimana untuk mendapatkan optik elemen pembolehubah, dikawal penghantaran, menggunakan teknologi wang kertas tradisional? Inilah tugas yang ditetapkan untuk kakitangan Direktorat teknologi perlindungan dan pakar dari Institut Penyelidikan Goznak pada 2014. Matlamatnya jelas: untuk menghilangkan unsur "tambahan" - pita polimer yang luas dan teknologi kompleks pengenalannya ke dalam kertas, iaitu untuk membuat penyelesaian keselamatan malah lebih berkesan.

    Tugas itu ternyata sangat sukar, kerana, di satu pihak, sejumlah besar faktor mempengaruhi hasil akhir, dan, sebaliknya, faktor utama ternyata bukan sahaja berkait rapat antara satu sama lain, tetapi juga. bercanggah antara satu sama lain. Saya terpaksa melihat penyelesaian bukan standard. Menjelang akhir tahun 2014, selepas kerja penyelidikan, kemungkinan asas untuk mendapatkan elemen perlindungan sedemikian telah terbukti. Pada tahun 2015, FSUE Goznak mengeluarkan wang kertas pengiklanan "Rusia Avangard", yang disampaikan oleh timbalan Ketua pengarah mengenai sains dan pembangunan oleh A. B. Kuryatnikov dalam edisi kedua majalah "Watermark" untuk 2015. Wang kertas promosi mempunyai elemen keselamatan "Siluet" - elemen pembolehubah optik, boleh dilihat dalam cahaya yang dihantar dan dibuat menggunakan teknologi wang kertas percetakan tradisional dalam tingkap lut sinar yang diperoleh menggunakan teknologi pembuatan kertas wang kertas tradisional. Pada masa ini, kerja sedang dijalankan untuk menambah baik teknologi untuk mendapatkan tingkap lut sinar, dan untuk mengoptimumkan reka bentuk elemen bercetak.

    Permainan dadu

    MVC, MVC+, HMC... Singkatan untuk nama ciri keselamatan yang dibangunkan di FSUE Goznak ini kerap muncul di halaman majalah sejak 2004. Dan jika anda mengumpul semua artikel yang ditulis mengenai topik ini, anda akan mendapat keseluruhan cerita tentang kelahiran, pembentukan dan perkembangan salah satu kawasan perlindungan yang paling berkesan, pada pendapat kami. Keistimewaan arah ini ialah untuk menghasilkan semula elemen keselamatan, gabungan digunakan dalam bentuk garisan yang diselaraskan secara geometri yang dicetak dengan kaedah percetakan offset dan intaglio.

    Ciri keselamatan MVC Moire Variable Color yang muncul dalam wang kertas moden Bank of Russia bertujuan terutamanya untuk perlindungan salinan. Mari kita ingat bagaimana ciri ini berfungsi: pada medan yang pada mulanya homogen, apabila wang kertas dicondongkan, jalur berwarna moire muncul. Kesan pembolehubah optik ini tiada pada salinan, iaitu, sama ada jalur moire berwarna tidak muncul, atau dikesan serta-merta, dan gambar kekal tidak berubah tidak kira bagaimana wang kertas itu dicondongkan atau diputar. Potensi ciri ini ternyata jauh lebih tinggi daripada jangkaan asalnya kerana rintangannya yang tinggi terhadap tiruan, kebolehkilangan, rintangan haus dan kemungkinan pemodenan selanjutnya. Kesederhanaan pelaksanaannya dalam wang kertas siri pemodenan bandar tahun 2004 dan tiruan pantas yang diharapkan oleh pakar Goznak dalam hal ini memaksa pemodenan ciri keselamatan ini ke arah mewujudkan corak moiré yang lebih sukar bagi pemalsu untuk menghasilkan semula, kerana kepada penggunaan struktur garisan tak linear dan penggunaan gabungan cetakan timbul tanpa dakwat dan cetakan intaglio berwarna-warni. Beginilah cara generasi seterusnya bagi ciri pembolehubah optik MVC+ muncul. Elemen keselamatan ini mempunyai dua kawasan yang diselaraskan. Di kawasan bawah, corak moire boleh dilihat dari mana-mana sudut, manakala di kawasan atas, seperti MVC, ia hanya muncul pada sudut tertentu. Adalah sangat penting untuk mengetahui bahawa apabila wang kertas dicondongkan, corak moire bahagian atas dan bawah harus membentuk satu gambar berterusan tanpa mengalihkan garisan moire di sempadan kedua-dua kawasan ini. Di samping itu, ciri perlindungan ini dipertingkatkan dengan tahap perlindungan tunai. Apabila melihat elemen MVC+ di bawah cahaya UV, anda boleh melihat kesan moiré yang sama seperti pada waktu siang. Unsur keselamatan MVC+ digunakan dalam wang kertas Bank of Russia dalam denominasi 1000 dan 5000 rubel, dimodenkan pada tahun 2010.

    Selari dengan MVC+, pembangunan telah dijalankan pada elemen perlindungan baharu dengan lebih besar kesan visual. Dan menjelang 2010, ciri keselamatan baharu, HMC (Berbilang Warna Tersembunyi), telah dicipta, yang menjadi elemen keselamatan yang lebih berkesan dalam siri ciri ini. Disebabkan oleh perubahan dalam parameter geometri garisan offset dan metalografi apabila wang kertas dicondongkan, medan homogen pada mulanya dibahagikan kepada serpihan berasingan yang dicat dengan warna yang berbeza. Nombor digunakan sebagai serpihan berwarna, aksara teks, bentuk geometri, mana-mana kawasan sewenang-wenangnya. Biasanya tidak lebih daripada 2-3 warna digunakan. Ciri penting ciri perlindungan ini adalah kemungkinan cek tambahan keasliannya. Jika anda masih ingat warna yang kelihatan apabila menyengetkan wang kertas, dan kemudian pusingkan wang kertas dalam satahnya 180 darjah, anda boleh melihat warna serpihan yang berbeza. Kesan ini dicapai berkat bentuk khas garisan dan penggunaan peralatan unik untuk pembuatan bentuk metalografik. Seperti elemen MVC+, elemen keselamatan HMC mempunyai tahap pengesahan tunai tambahan: apabila terdedah kepada cahaya UV, anda boleh melihat kesan pembolehubah optik yang sama seperti pada waktu siang. Elemen keselamatan HMC telah diperkenalkan ke dalam kompleks keselamatan wang kertas Bank of Russia 500 ruble pengubahsuaian 2010.

    Untuk mendapatkan elemen pelindung siri MVC - HMC, garisan metalografi dengan kedalaman pelepasan yang cukup besar digunakan. Di bawah keadaan tekanan yang sangat tinggi semasa pencetakan intaglio, kertas menjadi cacat, mengambil bentuk profil garisan intaglio. Pelega yang terhasil muncul pada kedua-dua bahagian hadapan dan belakang helaian bercetak. Walaupun pelega sisi hadapan "berfungsi" dalam ciri keselamatan siri MVC - HMC, pelega sisi belakang tidak digunakan sehingga baru-baru ini. Pakar Goznak mencadangkan penyelesaian yang menarik– penciptaan elemen pembolehubah optik pada kedua-dua bahagian hadapan dan belakang wang kertas semasa pencetakan intaglio hanya pada bahagian hadapan. Elemen sedemikian telah dibangunkan dan dilaksanakan pada wang kertas pengiklanan "195 tahun Goznak". Penerangan terperinci elemen ini, yang dipanggil CHMC (HMC Gabungan), diberikan dalam majalah "Watermark" No. 3 untuk 2013. Selain mendapatkan ciri pembolehubah optik pada kedua-dua belah wang kertas melalui penggunaan yang penting ciri teknologi mesin cetak mengimbangi - memastikan pendaftaran cetakan yang tepat pada bahagian hadapan dan belakang; elemen telah diperoleh untuk mengawal penjajaran bahagian hadapan dan belakang. Oleh itu, CHMC ialah "tiga dalam satu", iaitu ciri optik pada kedua-dua belah wang kertas dan elemen untuk mengawal penjajaran bahagian hadapan dan belakang. Ciri penting elemen ini ialah kedua-dua MVC dan HMC atau gabungan kedua-duanya boleh diperoleh secara bebas di bahagian hadapan dan belakang wang kertas. Oleh itu, pada wang kertas pengiklanan "Russian Avangard" elemen HMC digunakan di bahagian hadapan, dan gabungan MVC dan HMC digunakan di bahagian belakang.

    Untuk mendapatkan kesan visual terbaik apabila mencipta ciri siri MVC - HMC, terutamanya HMC, adalah perlu untuk menggunakan warna yang terang dan kontras apabila mencetak garisan offset. Sarung yang ideal ialah menggunakan warna CMY. Walau bagaimanapun, selalunya apabila memodenkan wang kertas, pelanggan tidak membenarkan menukar warna atau menggunakan warna terang sedemikian untuk percetakan mengimbangi. Oleh itu, kompromi perlu dibuat antara reka bentuk dan kesan visual. Ini terutama berlaku untuk elemen HMC. Untuk wang kertas "kompleks" sedemikian dari segi warna, elemen HMC boleh ubah optik dua dan juga satu warna telah dibangunkan. Dalam kes ini, elemen satu warna secara rasmi dua warna, kerana ruang, iaitu, warna kertas, digunakan sebagai cat kedua. Oleh itu, apabila wang kertas dicondongkan, warna tidak berubah; imej positif atau negatif muncul.

    Di samping itu, mana-mana elemen siri MVC - HMC boleh ditambah dengan imej tersembunyi atau terpendam.

    Oleh itu, hari ini satu siri elemen pelindung pembolehubah optik yang berkesan yang dihasilkan oleh gabungan percetakan offset dan intaglio telah dicipta. Ini adalah sejenis set kiub yang boleh digunakan untuk membina kompleks keselamatan yang unik untuk pelbagai wang kertas.

    Pembangunan elemen pelindung pembolehubah optik bagi siri MVC - HMC diteruskan. Ada idea baru. Dan kemungkinan besar pelaksanaan baharu ciri keselamatan berdasarkan gabungan percetakan offset dan intaglio akan muncul tidak lama lagi dalam wang kertas pengiklanan baharu atau sebarang produk edaran.

    Prinsip MVC dalam pengaturcaraan web (Model - View - Controller, Model - View (View) - Controller) adalah salah satu yang paling idea yang bagus sehingga kini. Prinsip MVC adalah intuitif pada pandangan pertama, tetapi tidak begitu mudah apabila diselidiki. Mula-mula mari kita lihat tujuannya.

    Prinsip MVC membolehkan anda memisahkan pelaksanaan logik aplikasi, penampilan(antara muka grafik, GUI) dan interaksi pengguna.

    Ini menghasilkan kod yang lebih tersusun, membolehkan lebih ramai orang yang khusus bekerja pada projek, menjadikan kod lebih mudah untuk diselenggara dan menjadikannya lebih logik dan mudah difahami. Perubahan dalam satu komponen mempunyai kesan minimum kepada komponen lain. Boleh disambungkan kepada satu model jenis yang berbeza, pengawal yang berbeza.

    Sebaliknya, ini memerlukan prestasi mesin pelaksanaan yang lebih tinggi, tetapi baru-baru ini ini tidak menjadi masalah besar - penyelesaian pengaturcaraan yang semakin kompleks memerlukan sokongan, dan kos sokongan akan jauh melebihi kos peralatan moden yang lebih berkuasa.

    Prinsip MVC digunakan oleh hampir semua rangka kerja moden.

    Mari kita lihat lebih dekat pada komponen.

    Model- mengandungi apa yang dipanggil "logik perniagaan" - pemprosesan dan pengesahan data, mengakses pangkalan data, mewakili organisasi dalaman sistem. Model tidak boleh berinteraksi secara langsung dengan pengguna.

    Lihat menerangkan rupa aplikasi.

    Pengawal- pautan penghubung antara model dan pandangan, menerima data daripada pengguna, memindahkannya ke model, menerima hasil yang diproses dan memindahkannya ke paparan.

    Hubungannya boleh dilihat dalam rajah:

    Sumber imej: http://www.wikipedia.org Keperluan komponen:

    model:

    • mesti mengandungi sifat yang mewakili data tertentu;
    • mesti menyertakan logik perniagaan (contohnya, peraturan pengesahan) untuk memastikan data memenuhi keperluan;
    • mungkin mengandungi kod untuk bekerja dengan data.
    Perwakilan:
    • harus mengandungi markup seperti HTML dan PHP mudah kod yang digunakan untuk melintasi, memformat dan memaparkan data;
    • tidak boleh mengakses pangkalan data secara langsung. Inilah yang harus dilakukan oleh model;
    • tidak boleh mengakses terus $_GET , $_POST dan pembolehubah lain yang diperoleh daripada permintaan pengguna. Tugas ini mesti dilakukan oleh pengawal. Pandangan hanya boleh digunakan untuk memformat data yang diterima daripada pengawal dan model;
    • boleh mengakses secara langsung sifat dan kaedah pengawal atau model. Walau bagaimanapun, ini hanya perlu dilakukan untuk tujuan paparan data.
    Pengawal:
    • boleh mengakses $_GET , $_POST dan lain-lain Pembolehubah PHP, diperoleh daripada permintaan pengguna;
    • boleh membuat dan mengurus contoh model. Contohnya, dalam tindakan kemas kini model biasa, pengawal mungkin mula-mula membuat contoh model, kemudian mengisinya dengan data daripada $_POST dan, jika model berjaya disimpan, ubah hala penyemak imbas pengguna ke halaman model yang dibuat. Perlu diingat bahawa menyimpan model itu sendiri harus dilaksanakan dalam kelas model, bukan dalam pengawal;
    • tidak boleh mengandungi pertanyaan SQL. Adalah lebih baik untuk menyimpannya dalam model;
    • tidak boleh mengandungi HTML atau markup lain. Ia bernilai meletakkannya dalam pembentangan.
    (Keperluan diambil dari sini: http://yiiframework.ru/doc/guide/ru/basics.best-practices)

    Sebagai tambahan kepada konsep MVC, terdapat banyak lagi, contohnya MOVE (Model, O perations, V iews dan E vents) - semacam seperti evolusi MVC (diambil dari sini: http://habrahabr.ru/post/ 147038/), tetapi konsep ini kurang biasa.