Mengapa pola desain tidak ditambahkan ke konstruksi bahasa?

11

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 Viewskonstruksi 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.

Songo
sumber
19
Ada aliran pemikiran yang mengatakan bahwa memiliki banyak pola adalah bau bahasa. Yang pasti banyak pola di buku GO4 hilang atau menjadi 1 liner di Lisp.
Zachary K
5
"Membangun Pabrik dijamin 100% dalam proyek apa pun." Kemudian Anda mengerjakan proyek yang buruk. Sementara pabrik adalah pola yang bermanfaat, itu jauh dari jaminan. Setiap OOP memiliki pola pabrik. Ini disebut konstruktor.
Euforia
9
Saya cukup skeptis terhadap seluruh hal OO secara umum. Mungkin ada ide untuk mempromosikan kegunaan kembali, ya, tapi itu tidak berhasil. Dan, setelah Anda memiliki beberapa alat yang sangat kuat yang tersedia, seperti metaprogramming, fungsi tingkat tinggi, sistem tipe yang kuat, modul, dll., Anda akan dapat mengekspresikan semua pola desain OO karena bahasa baru mudah dikonstruksi - tetapi Anda ingin tidak ingin melakukannya, karena dengan semua ini Anda tidak memerlukan OO sama sekali.
SK-logic
2
Karena itu berarti menambahkan fitur, dalam bahasa tujuan umum, Anda tidak ingin bahasa yang memiliki dua ribu fitur karena semua sintaks dan interaksi silang halus antara fitur tidak akan masuk ke kepala Anda. Sebaliknya Anda menginginkan bahasa dengan serangkaian fitur minimal yang dapat mengakomodasi banyak pola desain yang cukup ringkas. Jika pola desain dapat ditulis dalam hal fitur bahasa yang ada dengan sintaksis yang tidak terlalu buruk, maka biaya penambahan fitur baru jauh lebih tinggi dan akan menyulitkan bahasa.
Lie Ryan
5
Ada juga sekolah pemikiran (yang saya milik) yang mengatakan pola desain hanya solusi untuk kekurangan dalam bahasa. Di mata mereka, semua pola desain yang ada tidak akan ada dalam bahasa yang sempurna; tetapi mengingat bahasa yang paling populer jauh dari sempurna, kami terjebak dengan solusi ini. (Contoh)
BlueRaja - Danny Pflughoeft

Jawaban:

20

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.

Jörg W Mittag
sumber
Sebenarnya, berbagai macam pola desain untuk panggilan subrutin adalah umum (dalam assembler dan kode mesin, setidaknya) hingga akhir 50-an, awal 60-an dan juga dipamerkan di, katakanlah, M6800 (yang 8-bit). Cari Wheeler jumpatau Modified Wheeler jump.
Vatine
Tidak adanya konstruksi seperti itu dalam TI-83 Plusbahasa dasar menyebabkan pola yang sama kembali ketika saya belajar bagaimana memprogram sekitar tahun 2001.
Izkata
12

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.

Matěj Zábský
sumber
10
Bahkan orientasi objek dapat dianggap sebagai pola tertentu yang dianggap berguna dan karenanya dimasukkan ke dalam banyak bahasa. Secara umum, keberadaan pola merupakan indikator kurangnya fitur bahasa.
Andrea
7

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:

  • Tidak perlu menambahkannya sebagai konstruksi bahasa - semua pola desain dapat diimplementasikan dengan cara lain
  • Ini akan menyulitkan bahasa - ini adalah ide yang buruk karena membuat bahasa lebih sulit untuk dipelajari, membuat kompiler dan alat lebih sulit untuk ditulis
  • Pendekatan implementasi alternatif ada untuk banyak pola desain. Memilih satu pendekatan dan memberkatinya sebagai bagian dari bahasa inti mungkin akan membuat orang menggunakan pendekatan itu daripada yang lain (yang mungkin jauh lebih baik dalam beberapa keadaan)
  • Ketergantungan yang berlebihan pada pola desain mungkin merupakan ide yang buruk - desainer bahasa mungkin menyadari bahwa mereka seharusnya tidak mendorong mereka lebih jauh.

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.

mikera
sumber
4

Mengapa pola desain yang paling banyak digunakan (MVC, Pabrik, Strategi, ... dll.) Ditambahkan ke konstruksi bahasa?

Sebagian besar pola ini dapat diimplementasikan dalam sebagian besar bahasa pemrograman tanpa dukungan linguistik tertentu. Ambil contoh MVC di Jawa:

  • Anda dapat mengkodekannya secara langsung.
  • Anda dapat menerapkannya menggunakan generator aplikasi ... dan merawat seluruh pelat ketel lainnya secara bersamaan.
  • Anda bisa mengimplementasikannya menggunakan kelas pustaka "framework".
  • Anda dapat menerapkannya menggunakan anotasi dan pemrosesan anotasi statis atau runtime.

Mengingat semua opsi ini, ada sedikit nilai dalam langsung memperluas bahasa. Dan ada sejumlah "kerugian":

  • Itu akan cenderung mengacaukan sintaks bahasa, (bisa dibilang) membuat hidup lebih sulit bagi programmer pemula.
  • Itu akan cenderung membuat spesifikasi bahasa lebih besar dan lebih kompleks, membuatnya lebih sulit untuk pelaksana bahasa. (Dan, tentu saja, semakin besar speknya, semakin besar kemungkinan akan ada kesalahan dan ketidakkonsistenan.)
  • Akan selalu ada tekanan untuk menambahkan pola lain ... yang mengarah ke masalah / masalah dengan stabilitas bahasa.
  • Dengan mendukung pola-pola spesifik dalam bahasa tersebut, Anda memasang cara - cara spesifik untuk mendukung pola-pola tersebut, yang mungkin tidak sesuai dengan beberapa aplikasi.
Stephen C
sumber
4

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.

Jack V.
sumber
3

Baca buku 'geng empat' dan akan menjadi jelas bahwa:

  1. Pola desain dalam buku ini sebenarnya adalah konvensi smalltalk yang terkenal yang dikodekan dalam bahasa OO lainnya.
  2. Dengan demikian, pola-pola itu tidak dapat dimasukkan ke dalam bahasa OO - itu akan menerapkan kembali smalltalk di dalam bahasa-bahasa itu - lebih baik menggunakan smalltalk secara langsung
  3. Mengapa pola desain berguna adalah karena mereka menekankan peran bahasa yang saat ini digunakan, dan berfokus pada masalah lain selain sintaksis. Pengodean pola-pola di dalam bahasa akan kehilangan fitur pola desain ini.
  4. Masalah sebenarnya dalam pertanyaan di atas adalah bahwa ia kehilangan titik bahwa menulis perangkat lunak tidak hanya tentang mempelajari bahasa. Sangat penting untuk mengambil jarak yang cukup dari bahasa apa yang secara langsung menyediakan dan fokus pada persyaratan saat ini.
tp1
sumber
2

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.

DeadMG
sumber
0

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.

Erik Reppen
sumber