Sejak saya pertama kali belajar tentang pola desain Gang of Four (GoF) , setidaknya 10 tahun yang lalu, saya mendapat kesan bahwa 23 pola ini seharusnya hanya sampel kecil dari sesuatu yang jauh lebih besar yang saya suka menyebutnya Pattern Space . Ruang Pola hipotetis ini terdiri dari semua solusi yang direkomendasikan (diketahui atau tidak diketahui) untuk masalah desain perangkat lunak berorientasi objek umum.
Jadi saya berharap jumlah pola desain yang dikenal dan didokumentasikan akan tumbuh secara signifikan.
Itu tidak terjadi. Lebih dari 20 tahun setelah buku GoF keluar, hanya 12 pola tambahan yang tercantum dalam artikel Wikipedia, yang sebagian besar jauh kurang populer daripada yang asli. (Saya tidak memasukkan pola konkurensi di sini karena mereka membahas topik tertentu.)
Apa alasannya?
Apakah seperangkat pola GoF sebenarnya lebih komprehensif daripada yang saya pikirkan?
Apakah minat untuk menemukan pola baru menurun, mungkin karena mereka ditemukan tidak terlalu berguna dalam desain perangkat lunak?
Sesuatu yang lain
sumber
Jawaban:
Ketika Buku itu keluar, banyak orang berpikir seperti itu, dan ada banyak upaya untuk membuat "perpustakaan pola" atau bahkan "masyarakat pola." Anda masih dapat menemukan beberapa di antaranya:
Tapi kemudian...
Ini sangat banyak. Inti dari pola desain adalah meningkatkan komunikasi antar pengembang, tetapi jika Anda mencoba untuk menambahkan lebih banyak pola, Anda dengan cepat mencapai titik di mana orang tidak dapat mengingatnya, atau salah mengingatnya, atau tidak setuju tentang seperti apa tepatnya mereka seharusnya terlihat, dan komunikasi adalah sebenarnya tidak membaik. Itu sudah sering terjadi dengan pola GoF.
Secara pribadi, saya akan melangkah lebih jauh: Desain perangkat lunak, terutama desain perangkat lunak yang baik, terlalu beragam untuk ditangkap secara bermakna dalam pola, terutama dalam sejumlah kecil pola yang orang benar-benar dapat ingat - dan mereka terlalu abstrak bagi orang untuk benar-benar mengingat lebih dari segelintir. Jadi mereka tidak banyak membantu.
Dan terlalu banyak orang yang terpikat dengan konsep ini dan mencoba menerapkan pola di mana-mana - biasanya, dalam kode yang dihasilkan Anda tidak dapat menemukan desain aktual antara semua Singleton (yang sepenuhnya tidak berarti) dan Pabrik-Pabrik Abstrak.
sumber
ControversialDesignPatternOnlineOpinionHumanReadableRetortFactory.newInstance().getText();
Ini adalah asumsi mengerikan yang disebarkan oleh programmer neophyte di mana-mana, programmer yang berpikir bahwa mereka dapat menulis sebuah program hanya dengan menyatukan pola perangkat lunak. Tidak berfungsi seperti itu. Jika ada "ruang pola", Anda dapat mengasumsikan bahwa ukurannya efektif tanpa batas.
Pola desain (dalam pengertian GoF) hanya memiliki satu tujuan: untuk mengkompensasi kekurangan dalam bahasa pemrograman yang Anda gunakan.
Pola desain tidak universal atau komprehensif. Jika Anda mengubah ke bahasa pemrograman yang berbeda dan lebih ekspresif, sebagian besar pola dalam buku GoF menjadi tidak perlu dan tidak diinginkan.
sumber
ObservableSomething<T>
yang membuatnya mudah untuk memahami tujuan mereka, karena menggunakan nama pola yang dikenal umum. Pola adalah ide, bukan implementasi yang tepat.Saya pikir ada tiga faktor yang berperan di sini.
Kurangnya Massa Kritis
Pertama, suatu pola pada dasarnya sedikit lebih dari sekedar memberi nama pada beberapa kode yang mengimplementasikan fungsi tertentu. Satu-satunya cara nama itu memberikan banyak nilai nyata adalah jika Anda dapat bergantung pada semua orang yang tahu apa artinya nama itu hanya dengan menggunakan namanya, mereka segera mengerti cukup banyak tentang kode tersebut.
Pola tidak pernah membentuk massa kritis yang mereka butuhkan untuk mencapai itu. Sebaliknya, AAMOF. Dalam 20 (atau lebih) tahun sejak buku GoF keluar, saya cukup yakin saya belum melihat selusin percakapan di mana semua orang yang terlibat benar-benar tahu pola desain yang cukup untuk digunakan mereka untuk meningkatkan komunikasi.
Untuk membuatnya sedikit lebih aneh: pola desain gagal secara khusus karena gagal.
Terlalu Banyak Pola
Saya pikir faktor utama kedua adalah bahwa, jika ada, mereka awalnya menyebutkan terlalu banyak pola. Dalam banyak kasus, perbedaan antara pola cukup halus sehingga hampir tidak mungkin untuk mengatakan dengan kepastian nyata apakah suatu kelas tertentu cocok dengan satu pola atau yang lain (atau mungkin keduanya - atau mungkin tidak keduanya).
Maksudnya adalah agar Anda dapat berbicara tentang kode di tingkat yang lebih tinggi. Anda dapat memberi label sejumlah kode yang cukup besar sebagai implementasi dari pola tertentu. Cukup dengan menggunakan nama yang telah ditentukan itu, semua orang yang mendengarkan biasanya tahu sebanyak mereka peduli dengan kode itu, sehingga Anda dapat beralih ke hal berikutnya.
Kenyataannya cenderung hampir sebaliknya. Katakanlah Anda sedang rapat dan beri tahu mereka bahwa kelas khusus ini adalah Fasad. Separuh orang dalam rapat itu tidak pernah tahu atau sudah lama lupa persis apa artinya itu. Salah satu dari mereka meminta Anda untuk mengingatkannya tentang perbedaan persis antara Facade dan, katakanlah, Proxy. Oh, dan beberapa orang yang benar-benar tahu pola menghabiskan sisa pertemuan memperdebatkan apakah ini benar-benar harus dianggap sebagai Fasad atau "hanya" Adaptor (dengan satu pria masih bersikeras bahwa sepertinya Proxy baginya).
Mengingat bahwa maksud Anda benar-benar hanya untuk mengatakan: "kode ini tidak terlalu menarik; mari kita beralih", mencoba menggunakan nama pola hanya menambah gangguan, bukan nilai.
Kurang minat
Kebanyakan pola desain tidak benar-benar berurusan dengan bagian kode yang menarik. Mereka berurusan dengan hal-hal seperti: "bagaimana cara membuat objek ini?", Dan "bagaimana saya membuat objek ini untuk berbicara dengan yang itu?" Menghafal nama-nama pola untuk ini (dan juga argumen yang disebutkan di atas tentang detail dan semacamnya) hanya memasukkan banyak energi ke dalam hal-hal yang tidak dipedulikan oleh kebanyakan programmer.
Singkatnya: pola berurusan dengan hal-hal yang sama antara banyak program - tetapi yang benar-benar membuat program menarik adalah bagaimana hal itu berbeda dari program lain.
Ringkasan
Pola desain gagal karena:
sumber
Pola adalah abstraksi yang hilang, pola sederhana diabstraksikan, pola kompleks tidak dikenali, sehingga pola tidak berguna (kecuali beberapa yang tingkat tinggi).
Saya pikir Paul Graham mengatakan yang terbaik:
Ketika Anda mengenali pola dalam kode Anda, itu berarti sesuatu berulang sendiri dan Anda harus menggunakan abstraksi yang lebih baik. Jika Anda tidak memiliki abstraksi yang lebih baik, Anda menggunakan pola sebagai solusinya. Karena bahasa pemrograman yang lebih baru memberikan abstraksi yang lebih baik, pola menjadi jauh lebih tidak berguna.
Juga pola-pola sederhana seringkali mudah diabstraksi dan pola-pola kompleks jarang dikenali.
Ketika suatu pola digantikan oleh abstraksi, itu tidak berarti bahwa konsep di balik pola tersebut menghilang, tetapi bahwa konsep tersebut dapat ditulis secara eksplisit dan bukannya tidak langsung dan bahwa itu tidak lagi istimewa dibandingkan dengan kode lain dan menjadi tidak lagi dikenal sebagai sebuah pola.
sumber
String.replace
fungsi, Anda bisa membayangkannya muncul sebagai suatu pola, tetapi lebih baik menulisnya sekali daripada terus mengimplementasikannya kembali. Setuju bahwa jika Anda tidak memberi nama hal-hal ini dengan benar, itu akan membuatnya lebih sulit untuk dibaca, tetapi ketika dilakukan dengan benar, kode membaca IMO secara lebih deklaratif (misalnyagetOrElse
gaya monad opsi vs pengecekan nol)Sementara saya sebagian besar setuju dengan apa yang orang lain jawab di sini, saya pribadi berpikir bahwa alasan utama untuk tidak bertambahnya jumlah pola adalah bahwa pola kehilangan maknanya ketika ada yang tak terhitung jumlahnya. Yang menyenangkan dengan beberapa pola ini adalah, mereka mencakup banyak domain bermasalah dengan cara standar. Jika Anda akan fokus pada domain pola tak berujung Anda akan berakhir tanpa pola sama sekali. Ini agak seperti "berapa lama garis pantai sebuah pulau?". Jika Anda mengukur pada peta Anda datang dengan angka yang layak. Tetapi jika Anda mencoba untuk mendapatkan yang lebih tepat dan mencapai resolusi yang lebih baik, Anda akan menemukan bahwa panjangnya semakin bertambah hingga tak terbatas (atau ketidakpastian; bagaimana Anda mengukur batas yang tepat dengan pasang surut dan pada tingkat atom?).
sumber
Sesuatu yang tidak disebutkan oleh jawaban lain yang juga relevan:
Munculnya bahasa yang diketik secara dinamis.
Ketika buku itu pertama kali keluar ada diskusi serius bahwa Jawa terlalu lambat untuk melakukan pekerjaan nyata. Sekarang Jawa sering digunakan lebih dari bahasa ekspresif karena kecepatannya. Mungkin Ruby, Python, JavaScript, dkk masih terlalu lambat untuk beberapa kelas aplikasi yang penting, tetapi pada umumnya mereka cukup cepat untuk sebagian besar tujuan. Dan setidaknya JavaScript semakin cepat meskipun memiliki lebih banyak fitur yang dikemas dalam setiap rilis.
Buku GoF asli memiliki pola di smalltalk dan c ++, dan jika ingatanku, pola selalu lebih pendek di smalltalk dan kadang-kadang secara signifikan. Beberapa fitur dari pola desain klasik benar-benar cara untuk menambahkan fitur dinamis ke sistem yang diketik secara statis (seperti AbstractFactory yang sudah dibahas, di mana Anda membuat kelas yang benar berdasarkan pada data runtime). Yang lain jauh lebih pendek dalam bahasa dinamis sehingga mereka hanya berbaur dengan penggunaan bahasa itu sendiri.
sumber
Itu memang terjadi. Lusinan jika tidak ratusan buku diterbitkan dalam apa yang tampak seperti upaya untuk mengurangi seluruh ilmu komputer menjadi pola desain, karena penerbit dan penulis berusaha untuk melompat (atau membuat) kereta musik lain. Saya punya rak mereka. Tidak pernah berkonsultasi sejak pemindaian pertama, dan ya saya payah, karena hanya ada sedikit atau tidak ada sama sekali penggunaan aktual atau yang belum diketahui dengan baik (lihat misalnya Jenis Objek, yang tidak lebih dari bentuk normal ketiga yang diekspresikan di atas selusin halaman alih-alih satu paragraf), dan karena jelas semakin sedikit polanya semakin baik: titik yang menghindari sebagian besar praktisi. Memang, ketika saya memposting bantahan dari Object Type, saya diperintahkan untuk menyusun kembali teks saya sebagai pola desain.Kisah nyata. Yang juga menunjukkan kekurangan lain dari proyek: tidak ada ulasan atau pengecualian atau mekanisme penolakan.
Faktanya, GoF tidak benar-benar berusaha 'mengeksplorasi Pola Desain secara menyeluruh'. Sebaliknya, mereka terlibat dalam proyek yang jauh lebih besar: untuk memperkenalkan 'bahasa pola' ke dalam CS, dengan semua arcana notasi yang aneh tentang Pasukan, Peserta, dll., Yang gagal, karena secara fundamental disalahpahami, dan juga tidak ada gunanya.
Apa yang mereka lakukan , yang bermanfaat, adalah dua hal:
Konsep lain yang bermanfaat yang muncul adalah 'anti-pola', misalnya 'log and throw'. Proyek ini, seperti banyak mode di CS, tergelincir oleh penginjilannya sendiri dan diadopsi secara salah sebagai agama CS lainnya, dan ia berjalan seperti kebanyakan agama seperti itu: berguna dalam beberapa bagian, tetapi tentu saja 'tidak ada peluru perak' ((c ) Fred Brooks, 1965). Sedih karena kita harus terus menemukan kembali itu setiap beberapa tahun benar-benar.
sumber
Ada beberapa buku berjudul PLoP ( Pola Bahasa Desain Program ) yang masing-masing merupakan antologi makalah yang dipresentasikan pada konferensi tahunan .
Membaca buku, saya menemukan beberapa pola yang menarik dan baru bagi saya, beberapa di antaranya standar (misalnya "setengah objek plus protokol").
Jadi tidak, koleksi GoF tidak lengkap, dan menginspirasi / menginspirasi orang untuk mengumpulkan / menggambarkan / menemukan / menemukan yang baru.
"Hanya 12 pola tambahan yang tercantum dalam artikel Wikipedia" mungkin juga bukan koleksi lengkap: yaitu ada yang lain yang didokumentasikan di tempat lain, misalnya dalam buku-buku PLoP dan mungkin di tempat lain juga.
sumber
Buku Gang of Four (GoF) berisi sebagian besar pola yang dimiliki oleh programmer yang berpengalaman dalam bahasa yang tidak fungsional di sabuk alat mereka. Ini seperti seperangkat alat dasar yang semua pembangun tahu cara menggunakannya. Kontribusi utama buku ini adalah untuk memberikan nama yang jelas untuk pola-pola yang umum digunakan oleh programmer yang paling berpengalaman pada saat itu dan karenanya membantu komunikasi antara programmer membahas opsi desain.
Anda berharap bahwa seorang tukang listrik memiliki beberapa alat yang tidak dimiliki oleh pembangun normal, Anda juga akan berharap bahwa seorang programmer WPF mengetahui pola desain untuk "Dependency Properties", atau "SQL Programmer" untuk mengetahui pola desain untuk menggunakan pemicu untuk buat data audit.
Namun kami tidak menganggap ini sebagai "Pola desain" karena mereka hanya digunakan dengan satu teknologi.
Beberapa buku pola desain modem lainnya adalah "Refactoring, Meningkatkan Desain Kode yang Ada (Martin Fowler)" dan "Kode Bersih: Buku Pegangan Pengerjaan Perangkat Lunak Agile (Robert C. Martin) " Kedua buku ini menyajikan konten sebagai transformasi yang Anda buat untuk kode Anda saat ini, alih-alih sebagai "desain yang dapat digunakan kembali kaleng", namun mereka juga "pola desain".
sumber
Berikut adalah wawancara dengan Erich Gamma di mana ia merefleksikan pilihan pola mereka dan apa yang akan mereka ubah hari ini (nah hari ini 10 tahun lalu, haha).
http://www.informit.com/articles/article.aspx?p=1404056
sumber
Pola aktual dalam buku ini kadang-kadang sangat berguna, tetapi mereka benar-benar hanya contoh dari alat yang lebih kuat yang diberikan buku ini kepada Anda: pemahaman yang mendalam tentang kapan dan di mana lebih baik untuk memotong kode monolitik di bagian independen yang dipisahkan dan diatur oleh sebuah antarmuka .
Ketika Anda mempelajari keterampilan itu, Anda menyadari bahwa Anda tidak perlu mengingat detail yang tepat dari setiap pola tunggal, karena Anda selalu dapat memotong solusi yang Anda terapkan dengan cara yang paling sesuai dengan tujuannya. Jadi ide untuk menulis lebih banyak dan lebih banyak pola tampaknya sangat akademis dan tidak berguna.
sumber
Buku GoF dan Wikipedia bukan satu-satunya sumber pola desain yang diketahui. Jika Anda hanya mencari "pola desain" di Amazon.com, Anda mendapatkan ratusan buku (coba pencarian ini ). Saya kira mereka hanya mencantumkan pola yang paling terkenal di artikel Wikipedia .
Jadi masalahnya bukan tidak ada cukup pola desain yang terdokumentasi. Sebaliknya ada begitu banyak sehingga tidak ada yang bisa menghafal semuanya dan kebanyakan programmer hanya mengenal sedikit. Janji besar bahasa pola umum rusak pada saat ini.
sumber
Mungkin ada banyak struktur yang belum dipikirkan. Selama orang mengembangkan perangkat lunak, akan ada tantangan desain untuk diatasi. Beberapa di antaranya mungkin dapat diselesaikan dengan menggunakan pola baru yang cerdas yang dapat digunakan orang lain.
Bahasa pemrograman telah berkembang dan berkembang untuk menghilangkan pola yang paling umum digunakan. Pola-pola itu masih ada dalam desain bahasa. Jadi mereka mungkin diabaikan hari ini, tetapi itu tidak membuat mereka tidak penting.
Apakah pengetahuan tentang cara membangun rumah tiba-tiba tidak penting begitu kita memiliki robot yang dapat melakukannya untuk kita? Saya berpendapat tidak, tidak. Ini kurang relevan, pasti - dan mungkin jauh lebih sedikit bermanfaat untuk dipelajari, karena permintaannya turun tajam, dan tidak ada orang lain yang mempelajarinya.
Jadi tidak, saya tidak percaya ruang pola seperti yang Anda sebut telah habis. Seperti yang ditunjukkan oleh jawaban lain, itu kemungkinan tidak terbatas. Tetapi ketika permintaan untuk desain sistem mereda, karena kami meningkatkan ketinggian menara abstraksi kami dan kekuatan bahasa pemrograman kami - semakin sedikit orang yang membangun di tingkat atas akan memperhatikan detail bagaimana menara itu dibangun .
sumber
Pola tidak terbatas .. Anda dapat men-tweak setiap pola atau mencocokkan dan mencocokkan untuk membuat yang baru .. Pola integrasi perusahaan juga didefinisikan dengan baik..jadi ya memang memakan waktu mendokumentasikan pola menggunakan uml dan menciptakan standar untuk menjelaskannya .. Tapi untuk setiap pola domain berkembang dan mereka juga berubah untuk bahasa ekspresif seperti python atau scala ..
sumber