Rumah >pembangunan bahagian belakang >tutorial php >PHP Master | Menguruskan kerumitan dengan corak fasad
Corak reka bentuk dibina untuk menyeragamkan penyelesaian untuk masalah biasa yang dihadapi dalam pembangunan perisian. Apabila kita membangunkan aplikasi yang kompleks, kita harus memperuntukkan masa yang mencukupi untuk merancang reka bentuk dan struktur aplikasinya. Apabila kita berbuat demikian, kita mempunyai peluang untuk memilih corak reka bentuk yang sesuai. Tetapi ada situasi di mana kita menggunakan corak reka bentuk tanpa mengetahui bahawa kita menggunakannya.
Fasad adalah corak reka bentuk yang digunakan dalam hampir setiap aplikasi web, tetapi sering tanpa mengetahui. Istilah "corak reka bentuk" mewujudkan imej mental sesuatu yang rumit dan sukar difahami. Walaupun ini kadang -kadang boleh berlaku, corak fasad mudah dilaksanakan. Mari kita lihat apa fasad dan apa yang dilakukannya untuk membantu kita menulis kod yang baik.
Takeaways Key
proses meminjam buku
Anggapkan bahawa kami sedang membangunkan aplikasi untuk sistem pengurusan perpustakaan. Meminjam dan mengembalikan buku adalah jelas dua tugas yang paling penting dalam sistem sedemikian. Tetapi pertimbangkan pelaksanaan biasa proses pinjaman buku:
Pelaksanaan setiap tugas terkandung dalam kelas berasingan dengan antara muka mereka sendiri. Kod berikut menggambarkan bagaimana sistem mungkin membiarkan pengguna meminjam buku dengan memanggil kaedah yang diperlukan:
<span><span><?php
</span></span><span><span>public class User
</span></span><span><span>{
</span></span><span> <span>public function borrowBook() {
</span></span><span> <span>$bookManager = new Book_Manager();
</span></span><span> <span>$bookManager->returnBooks();
</span></span><span>
</span><span> <span>$bookPayments = new Book_Payments();
</span></span><span> <span>if ($bookPayments->hasOverdueBooks()) {
</span></span><span> <span>$bookPayments->payBookFines();
</span></span><span> <span>}
</span></span><span>
</span><span> <span>$bookLibrary = new Book_Library();
</span></span><span> <span>$bookReservations = new Book_Reservations();
</span></span><span>
</span><span> <span>$book = $bookLibrary->searchBooks();
</span></span><span> <span>$isAvailable = $bookLibrary->isBookAvailable($book);
</span></span><span> <span>$isReserved = $bookReservations->isBookReserved($book);
</span></span><span> <span>if ($isAvailable && !isReserved) {
</span></span><span> <span>$bookLibrary->locateBook($book);
</span></span><span>
</span><span> <span>$bookManager->borrowBook($book);
</span></span><span> <span>$bookLibrary->updateBookAvailability($book, $status);
</span></span><span> <span>}
</span></span><span> <span>}
</span></span><span><span>}</span></span>
Anda dapat melihat proses meminjam buku sebenarnya adalah proses yang kompleks! Dalam pelaksanaan ini, pengguna perlu berinteraksi dengan empat kelas yang berbeza dan sekitar sepuluh kaedah untuk meminjam buku.
Anggapkan bahawa setiap bit fungsi dilaksanakan sebagai skrin berasingan dalam aplikasi; Bolehkah anda bayangkan usaha yang diperlukan untuk meminjam tiga buku dengan sistem ini? Dan peminjam tidak perlu tahu mengenai fungsi seperti memeriksa tempahan dan mengemas kini status. Kami pasti mempunyai masalah dengan pelaksanaan kami.
Melaksanakan fasad perpustakaan
Kita perlu meremehkan pengguna dari alur kerja kompleks perpustakaan dan membolehkan antara muka yang dipermudahkan mendedahkan hanya maklumat yang berkaitan secara langsung dengan pengguna - fasad. Mari lihat pelaksanaan fasad perpustakaan.
<span><span><?php
</span></span><span><span>class Library_Facade
</span></span><span><span>{
</span></span><span> <span>public function returnBooks() {
</span></span><span> <span>// previous implementation by calling necessary classes
</span></span><span> <span>}
</span></span><span>
</span><span> <span>public function borrowBooks() {
</span></span><span> <span>}
</span></span><span>
</span><span> <span>public function searchBooks() {
</span></span><span> <span>}
</span></span><span>
</span><span> <span>public function reserveBooks() {
</span></span><span> <span>}
</span></span><span><span>}</span></span>
Pengguna boleh meminjam buku dengan memanggil kaedah peminjam () kelas perpustakaan_facade seperti yang ditunjukkan dalam contoh berikut:
<span><span><?php
</span></span><span><span>class User
</span></span><span><span>{
</span></span><span> <span>public function borrowBook() {
</span></span><span> <span>$libraryFacade = new Library_Facade();
</span></span><span> <span>$libraryFacade->borrowBook();
</span></span><span> <span>}
</span></span><span><span>}</span></span>
Dengan pelaksanaan berasaskan fasad ini, pengguna hanya bercakap dengan kelas perpustakaan_facade dan tidak tahu bagaimana fungsi dilaksanakan di luarnya. Pengguna boleh terus meminta sebarang ciri dari fasad dan fasad bertanggungjawab untuk mengendalikan proses kompleks dan mengembalikan maklumat yang sesuai. Corak fasad mematuhi prinsip pengetahuan yang paling sedikit di mana setiap unit harus mempunyai pengetahuan yang minimum tentang unit lain.
Walaupun fungsi peringkat rendah tersembunyi dari pengguna melalui fasad, pengguna masih boleh meminta kelas peringkat rendah secara langsung apabila diperlukan. Fikirkan tentang projek anda sendiri dan di mana anda mungkin mencari situasi di mana anda telah melaksanakan corak fasad tanpa menyedarinya.
Definisi corak fasad
Oleh kerana kami telah mengenal pasti proses dan kepentingan melaksanakan corak fasad, kini sudah tiba masanya untuk mempelajari definisi corak. Berikut ini diekstrak dari Wikipedia:
Fasad adalah objek yang menyediakan antara muka yang dipermudahkan kepada badan kod yang lebih besar, seperti perpustakaan kelas. Fasad boleh:
Pelaksanaan dunia sebenar
Di bahagian sebelumnya kita mempelajari teori di sebalik corak fasad menggunakan sistem perpustakaan sebagai contoh. Di dunia nyata, fasad boleh menjadi lebih kompleks daripada pelaksanaan dalam senario perpustakaan kami. Mari kita semak beberapa pelaksanaan corak dalam konteks aplikasi dan perpustakaan dunia nyata.
opauth untuk pengesahan terbuka
Baru -baru ini saya menulis artikel mengenai perpustakaan pengesahan terbuka yang popular yang dipanggil Opauth, dan saya cadangkan anda membacanya jika anda belum melakukannya. Anggapkan kami telah membangunkan tapak rangkaian sosial profesional dan kami mahu pengguna kami dapat menggunakan laman web popular lain seperti Twitter, LinkedIn, dan Facebook untuk mengesahkan. Untuk melengkapkan proses pengesahan, kami menggunakan perpustakaan pihak ketiga yang sedia ada untuk mengakses perkhidmatan rangkaian. Mari kita lihat beberapa kod sampel untuk dengan perpustakaan Twitter untuk mencapai fungsi yang dikehendaki.
<span><span><?php
</span></span><span><span>public class User
</span></span><span><span>{
</span></span><span> <span>public function borrowBook() {
</span></span><span> <span>$bookManager = new Book_Manager();
</span></span><span> <span>$bookManager->returnBooks();
</span></span><span>
</span><span> <span>$bookPayments = new Book_Payments();
</span></span><span> <span>if ($bookPayments->hasOverdueBooks()) {
</span></span><span> <span>$bookPayments->payBookFines();
</span></span><span> <span>}
</span></span><span>
</span><span> <span>$bookLibrary = new Book_Library();
</span></span><span> <span>$bookReservations = new Book_Reservations();
</span></span><span>
</span><span> <span>$book = $bookLibrary->searchBooks();
</span></span><span> <span>$isAvailable = $bookLibrary->isBookAvailable($book);
</span></span><span> <span>$isReserved = $bookReservations->isBookReserved($book);
</span></span><span> <span>if ($isAvailable && !isReserved) {
</span></span><span> <span>$bookLibrary->locateBook($book);
</span></span><span>
</span><span> <span>$bookManager->borrowBook($book);
</span></span><span> <span>$bookLibrary->updateBookAvailability($book, $status);
</span></span><span> <span>}
</span></span><span> <span>}
</span></span><span><span>}</span></span>
Seperti yang anda lihat, kami memanggil satu set kaedah perpustakaan khusus Twitter untuk melaksanakan fungsi yang dikehendaki. Pendekatan yang sama diperlukan untuk LinkedIn dan Facebook. Proses ini telah menjadi kompleks. Kami tidak membangunkan aplikasi Twitter, Facebook, atau LinkedIn; Kita hanya perlu mengesahkan kelayakan dan mengesahkan pengguna. Permohonan kami tidak perlu bimbang tentang pelaksanaan setiap perkhidmatan ini.
Kami dapat menyelesaikan masalah ini dengan menggunakan perpustakaan Opauth sebagai antara muka fasad. Mula -mula kita perlu menentukan URL log masuk perkhidmatan yang dikehendaki dalam format biasa yang akan dikenalpasti oleh plugin Opauth. Pertimbangkan kod berikut untuk melaksanakan proses pengesahan.
<span><span><?php
</span></span><span><span>class Library_Facade
</span></span><span><span>{
</span></span><span> <span>public function returnBooks() {
</span></span><span> <span>// previous implementation by calling necessary classes
</span></span><span> <span>}
</span></span><span>
</span><span> <span>public function borrowBooks() {
</span></span><span> <span>}
</span></span><span>
</span><span> <span>public function searchBooks() {
</span></span><span> <span>}
</span></span><span>
</span><span> <span>public function reserveBooks() {
</span></span><span> <span>}
</span></span><span><span>}</span></span>
Sebaik sahaja pautan log masuk diminta, OpAuth mengenal pasti perkhidmatan yang diminta dari URL dan memulakan perpustakaan untuk mengalihkan pengguna untuk pengesahan. Aplikasi kami kini hanya perlu membuat pautan masuk dan hubungi kaedah Inisialisasi. Semua barangan pengesahan kompleks dikendalikan di belakang layar menggunakan perpustakaan masing-masing untuk setiap perkhidmatan. Ini boleh dianggap sebagai contoh yang sempurna untuk menggunakan corak fasad dengan berkesan.
Fungsi Meta WordPress
WordPress bukanlah salah satu rangka kerja yang paling popular di kalangan pemaju PHP yang serius memandangkan kualiti kodnya. Tetapi kita dapat dengan mudah mencari beberapa pelaksanaan fasad yang berjaya di dalam asas WordPress. Di sini saya akan melihat fungsi update_post_meta () untuk menyimpan data tersuai untuk siaran WordPress.
WordPress membolehkan kami membuat medan tersuai yang berkaitan dengan jawatan sedia ada. Fikirkan bagaimana kita menyelamatkan bidang ini dalam situasi yang biasa ... kita perlu melaksanakan semua tugas berikut:
Itu cukup banyak kerja untuk menyelamatkan satu bidang tersuai! WordPress menyembunyikan kerumitan menyelamatkan bidang ini dengan menyediakan fungsi terbina dalam yang dipanggil update_post_meta ()
untuk bertindak sebagai fasad. Ini membenarkan kami memberi tumpuan kepada lulus data yang diperlukan berkaitan dengan aplikasi kami; Semua tugas yang disebutkan di atas tersembunyi dari pengguna.
Sekarang pertimbangkan pelaksanaan update_post_meta () untuk mengenal pasti fungsinya sebagai fasad:
<span><span><?php
</span></span><span><span>public class User
</span></span><span><span>{
</span></span><span> <span>public function borrowBook() {
</span></span><span> <span>$bookManager = new Book_Manager();
</span></span><span> <span>$bookManager->returnBooks();
</span></span><span>
</span><span> <span>$bookPayments = new Book_Payments();
</span></span><span> <span>if ($bookPayments->hasOverdueBooks()) {
</span></span><span> <span>$bookPayments->payBookFines();
</span></span><span> <span>}
</span></span><span>
</span><span> <span>$bookLibrary = new Book_Library();
</span></span><span> <span>$bookReservations = new Book_Reservations();
</span></span><span>
</span><span> <span>$book = $bookLibrary->searchBooks();
</span></span><span> <span>$isAvailable = $bookLibrary->isBookAvailable($book);
</span></span><span> <span>$isReserved = $bookReservations->isBookReserved($book);
</span></span><span> <span>if ($isAvailable && !isReserved) {
</span></span><span> <span>$bookLibrary->locateBook($book);
</span></span><span>
</span><span> <span>$bookManager->borrowBook($book);
</span></span><span> <span>$bookLibrary->updateBookAvailability($book, $status);
</span></span><span> <span>}
</span></span><span> <span>}
</span></span><span><span>}</span></span>
Hanya kod yang diperlukan; Kod sumber lengkap untuk fungsi update_metadata () tersedia dalam fail meta.php di dalam direktori WP-termasuk. Tetapi anda dapat melihat semua pengesahan, penapisan, dan kemas kini pangkalan data dilaksanakan di sini dan hanya antara muka fasad yang mempunyai pengetahuan mengenai butirannya.
Kesimpulan
Fasad adalah salah satu corak reka bentuk yang paling mudah dan mudah digunakan dalam pembangunan perisian. Sepanjang artikel ini saya bercakap tentang pelbagai pelaksanaan corak fasad. Kini sudah tiba masanya untuk berkongsi pengalaman anda dalam komen di bawah. Adakah anda tahu mana -mana perpustakaan atau perkhidmatan yang menggunakan fasad? Jangan ragu untuk berkongsi pelaksanaan praktikal corak fasad yang anda jumpai.
imej melalui Fotolia
soalan yang sering ditanya mengenai corak fasad
Apakah tujuan utama corak fasad dalam reka bentuk perisian? Ia menyembunyikan kerumitan sistem dan menyediakan antara muka kepada klien dari mana klien boleh mengakses sistem. Corak ini melibatkan satu kelas yang menyediakan kaedah mudah yang diperlukan oleh pelanggan dan perwakilan panggilan ke kaedah kelas sistem yang sedia ada. Meningkatkan kebolehbacaan kod dan kebolehgunaan dengan menyediakan antara muka yang mudah ke subsistem yang kompleks. Daripada membuat perjanjian pelanggan dengan beberapa kelas subsistem secara langsung, fasad merangkumi subsistem dengan antara muka bersatu. Ini mengurangkan lengkung pembelajaran yang diperlukan untuk memahami subsistem dan menjadikan subsistem lebih mudah digunakan dan dikendalikan. corak fasad adalah penggunaan komputer. Apabila anda menghidupkan komputer anda, anda tidak perlu memahami bagaimana komponen dalaman berfungsi bersama untuk boot sistem. Anda hanya menekan butang kuasa (fasad) dan proses kompleks berlaku di belakang tabir.
Apakah kelebihan dan kekurangan menggunakan corak fasad? Ia juga menggalakkan decoupling antara subsistem dan pelanggan mereka, yang boleh menjadikan sistem lebih modular dan lebih mudah dikekalkan. Walau bagaimanapun, kelemahan yang berpotensi adalah bahawa corak fasad boleh menjadi hambatan jika terlalu banyak fungsi dimasukkan ke dalam fasad. Ia juga boleh menyembunyikan ciri -ciri berguna subsistem dari klien. digunakan untuk menambah atau mengubah tingkah laku objek individu, corak fasad digunakan untuk memudahkan sistem kelas yang kompleks. Ia menyediakan antara muka yang dipermudahkan ke subsistem yang kompleks, menyembunyikan selok -belok subsistem dari klien. Digunakan bersempena dengan corak reka bentuk yang lain. Sebagai contoh, ia boleh digunakan dengan corak singleton untuk memastikan bahawa hanya satu contoh fasad dibuat. Ia juga boleh digunakan dengan corak kilang abstrak untuk menyediakan antara muka yang mudah untuk mewujudkan keluarga objek yang berkaitan. menyumbang kepada prinsip pengetahuan paling sedikit (atau undang -undang Demeter) dengan mengehadkan komunikasi antara objek. Pelanggan hanya perlu berkomunikasi dengan fasad, bukan dengan kelas subsistem. Ini mengurangkan kebergantungan antara objek, menjadikan sistem lebih mantap dan lebih mudah untuk dikekalkan. Aplikasi multi-threaded. Walau bagaimanapun, penjagaan mesti diambil untuk memastikan bahawa fasad itu selamat. Ini dapat dicapai dengan menggunakan mekanisme penyegerakan seperti kunci atau semaphores untuk mencegah keadaan kaum. Pelanggan perlu berinteraksi dengan. Ini dapat mengurangkan overhead penciptaan objek dan penyerahan kaedah. Walau bagaimanapun, jika fasad menjadi kesesakan, ia boleh memberi kesan negatif terhadap prestasi. Kelas Facade yang menyediakan antara muka mudah ke subsistem kompleks. Kelas fasad harus merangkum subsistem dan perwakilan panggilan ke kelas subsistem. Pelanggan harus berinteraksi dengan subsistem melalui fasad, tidak langsung dengan kelas subsistem.
Atas ialah kandungan terperinci PHP Master | Menguruskan kerumitan dengan corak fasad. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!