Baru-baru ini saya berbicara dengan seorang kolega yang menyebutkan bahwa perusahaannya sedang berupaya menambahkan pola desain MVC sebagai ekstensi PHP.
Dia menjelaskan bahwa mereka menulis kode C untuk menambahkan Controllers, Models and Views
konstruksi bahasa untuk meningkatkan kinerja.
Sekarang saya tahu bahwa MVC adalah pola desain arsitektur yang digunakan secara luas dalam aplikasi web, tetapi saya masih harus menemukan bahasa yang memiliki konstruksi bahasa untuk Controllers misalnya.
IMHO mengintegrasikan pola desain ke dalam bahasa dapat menekankan pentingnya desain OO yang baik.
Jadi, Mengapa pola desain yang paling banyak digunakan (MVC, Pabrik, Strategi, ... dll.) Ditambahkan ke konstruksi bahasa?
Jika pertanyaan terdengar terlalu luas, maka Anda dapat membatasi pertanyaan hanya untuk PHP.
Edit:
Saya tidak menyiratkan bahwa seseorang harus menggunakan pola desain ketika mengembangkan proyek. Sebenarnya saya mempromosikan metodologi menjaganya tetap sederhana asalkan bekerja.
Jawaban:
Pola desain yang ditambahkan ke bahasa konstruksi sepanjang waktu. Pernah mendengar Pola Desain Panggilan Subroutine ? Tidak? Aku juga tidak. Itu karena Panggilan Subroutine, yang berada Pola Desain di awal 1950-an mendapat ditambahkan ke bahasa cukup banyak langsung. Saat ini, mereka bahkan hadir dalam set instruksi kode mesin CPU.
Bagaimana dengan Pola Desain Loop ? The Sementara loop Pola Desain? The Beralih Pola Desain? The Obyek Desain Pola? The Kelas Desain Pola? Semua ini telah ditambahkan ke beberapa bahasa.
sumber
Wheeler jump
atauModified Wheeler jump
.TI-83 Plus
bahasa dasar menyebabkan pola yang sama kembali ketika saya belajar bagaimana memprogram sekitar tahun 2001.Beberapa dari mereka adalah. Misalnya iterator adalah fitur bahasa dalam banyak bahasa dan pustaka standarnya (halo, foreach dan hasil balik). Pengamat juga sering hadir dalam bentuk acara (bukan dalam PHP - Anda harus mengelola sendiri langganan panggilan balik). Perintah adalah fitur inti dalam WPF.
Banyak dari yang lain tidak akan mendapat manfaat dari dukungan bahasa (dan akan membuat bahasa lebih rumit) - bagaimana Anda menyederhanakan Pengendali jika Anda dapat merancang fitur bahasa untuk mereka? Sebagai kelas, mereka mendapat manfaat dari semua infrastruktur yang sudah ada untuk mendukung kelas - Anda dapat membuat instantiate, menyebarkannya dan misalnya unit mengujinya sebagai objek lain.
Satu-satunya komponen MVC yang IMO dapat manfaat dari semacam dukungan bahasa adalah View (dengan beberapa mesin templating resmi) - dan dalam PHP sudah semacam didukung - Anda dapat secara dinamis membuat dan memuat skrip PHP (yang sering dengan semacam preprocessing digunakan sebagai templat).
Hal yang sama berlaku untuk metode pabrik - bagaimana Anda menyederhanakannya, jika Anda dapat memiliki fitur bahasa apa pun yang Anda inginkan? Salah satu fitur yang tidak dimiliki oleh beberapa bahasa (seperti C ++) adalah kemampuan untuk membangun objek dari nama jenis ini, tetapi sebagian besar bahasa tingkat yang lebih tinggi dapat melakukan ini (dan bahkan tidak perlu membuat metode pabrik yang berguna). Selain itu, semua yang Anda butuhkan adalah untuk dapat membuat metode yang instantiate dan mengembalikan serta objek.
sumber
Beberapa pola desain memang ditambahkan sebagai konstruksi bahasa - mereka hanya tidak bisa diidentifikasi karena orang mulai menganggapnya sebagai "sintaks" begitu mereka dibangun. Penanganan pengecualian di Jawa adalah contoh yang baik - banyak orang akan mengkode sesuatu yang serupa secara eksplisit sebagai pola desain jika itu bukan bagian dari sintaks inti.
Tetapi untuk fokus pada pertanyaan - ada banyak alasan mengapa Anda tidak ingin menambahkan terlalu banyak pola desain ke bahasa:
Juga, jika Anda menggunakan bahasa yang cukup kuat dengan kemampuan metaprogramming (misalnya Lisp), itu menjadi relatif mudah untuk memperluas bahasa sendiri untuk menerapkan pola desain apa pun . Anda tidak memerlukan pola sama sekali dalam bahasa inti jika mudah untuk menambahkan pola Anda sendiri dengan makro 5-baris.
sumber
Sebagian besar pola ini dapat diimplementasikan dalam sebagian besar bahasa pemrograman tanpa dukungan linguistik tertentu. Ambil contoh MVC di Jawa:
Mengingat semua opsi ini, ada sedikit nilai dalam langsung memperluas bahasa. Dan ada sejumlah "kerugian":
sumber
Mereka.
Fungsi adalah pola desain dalam kode assembly sebelum mereka menjadi konstruksi bahasa di C.
Fungsi virtual adalah pola desain dalam C sebelum mereka menjadi konstruksi bahasa di C ++.
Namun, ada trade off. Jika polanya melibatkan produksi kode boilerplate (bahkan beberapa kata kunci), itu indikasi itu akan menjadi fitur bahasa yang berguna. Tetapi jika polanya sederhana dan jelas, mis. C's "for (int i = 0; i <10; i ++)", masih berguna bagi semua orang untuk menuliskannya dengan cara yang sama, tetapi tidak secara signifikan lebih lama dari "for i = 0 hingga 10" dan memiliki keuntungan signifikan yaitu jelas bagaimana mengubahnya untuk membuat loop yang sedikit berbeda.
sumber
Baca buku 'geng empat' dan akan menjadi jelas bahwa:
sumber
Karena pola desain diimplementasikan dengan sangat baik dengan kode pengguna. Contohnya hanya terjadi karena PHP- tetapi jika Anda benar-benar membutuhkan kinerja, Anda hanya akan bekerja dalam bahasa lain atau mendapatkan HipHop atau sesuatu.
Fitur bahasa rumit, baik untuk menentukan dan untuk mengimplementasikan, dan itu tidak dibenarkan untuk membuatnya hanya untuk tujuan "idiom saat ini adalah X". Anda hampir tidak menyimpan kode pengguna yang berarti sama sekali, dan tanpa hasil.
sumber
Eh, pertanyaan basi tapi saya tidak setuju dengan banyak jawaban tergantung di mana Anda mengatur "Pola Desain" pada dial semantik termasuk yang diterima.
Dalam pengertian buku GoF Design Patterns, saya akan mengatakan itu tergantung. MVC, misalnya (sebenarnya bukan pola GoF tetapi cocok dengan cetakan itu), sama sekali tidak pantas untuk diungkapkan sebagai konstruksi bahasa untuk konsumsi massal (walaupun mungkin masuk akal untuk proyek PHP tertentu). Sebagai pola arsitektur ada variasi konstan pada tema dan berbagai interpretasi yang sah untuk itu dalam keadaan yang berbeda (walaupun banyak yang meninggalkan begitu jauh dari MVC mereka mungkin tidak boleh menyebutnya MVC lagi). Misalnya, di web, penghalang http membuatnya agak canggung tergantung pada apakah Anda mencoba untuk memasukkan sisi klien (tidak diragukan lagi menyakitkan) dalam persamaan dan apa yang Anda pertimbangkan "tampilan" dari yang lebih dengan tepat perspektif sisi server.
Iterator di sisi lain adalah konsep yang sangat umum yang dapat diterapkan dalam berbagai cara untuk berbagai konstruksi.
Di mana garis harus ditarik pada apakah sesuatu termasuk dalam desain bahasa inti, bahkan dalam server-side-web-bahasa spesifik, IMO, adalah titik di mana sesuatu melintasi garis dari membuatnya lebih mudah untuk melakukan sejumlah hal yang tak terhitung jumlahnya lebih mudah vs. melakukan hal yang terlalu spesifik namun diterapkan secara luas seperti pola arsitektur untuk Anda.
sumber