Posting blog yang Anda kutip melebih-lebihkan klaimnya. FP tidak menghilangkan kebutuhan akan pola desain. Istilah "pola desain" tidak banyak digunakan untuk menggambarkan hal yang sama dalam bahasa FP. Tetapi mereka ada. Bahasa fungsional memiliki banyak aturan praktik terbaik dari bentuk "ketika Anda menemukan masalah X, gunakan kode yang terlihat seperti Y", yang pada dasarnya adalah pola desain.
Namun, memang benar bahwa sebagian besar pola desain spesifik OOP cukup tidak relevan dalam bahasa fungsional.
Saya tidak berpikir itu harus sangat kontroversial untuk mengatakan bahwa pola desain secara umum hanya ada untuk memperbaiki kekurangan dalam bahasa. Dan jika bahasa lain dapat menyelesaikan masalah yang sama sepele, bahasa lain itu tidak membutuhkan pola desain untuk itu. Pengguna bahasa itu mungkin bahkan tidak menyadari bahwa masalahnya ada , karena, yah, itu bukan masalah dalam bahasa itu.
Inilah yang dikatakan Gang of Four tentang masalah ini:
Pilihan bahasa pemrograman penting karena memengaruhi sudut pandang seseorang. Pola kami mengasumsikan fitur bahasa level Smalltalk / C ++, dan pilihan itu menentukan apa yang bisa dan tidak bisa diimplementasikan dengan mudah. Jika kita mengasumsikan bahasa prosedural, kita mungkin telah memasukkan pola desain yang disebut "Warisan", "Enkapsulasi," dan "Polimorfisme". Demikian pula, beberapa pola kami didukung langsung oleh bahasa berorientasi objek yang kurang umum. CLOS memiliki multi-metode, misalnya, yang mengurangi kebutuhan akan pola seperti Pengunjung. Faktanya, ada cukup banyak perbedaan antara Smalltalk dan C ++ yang berarti bahwa beberapa pola dapat diekspresikan lebih mudah dalam satu bahasa daripada yang lain. (Lihat Iterator misalnya.)
(Di atas adalah kutipan dari buku Pengantar Pola Desain, halaman 4, paragraf 3)
Fitur utama pemrograman fungsional mencakup fungsi sebagai nilai kelas satu, currying, nilai yang tidak dapat diubah, dll. Tampaknya tidak jelas bagi saya bahwa pola desain OO mendekati salah satu dari fitur tersebut.
Apa pola perintah, jika bukan perkiraan fungsi kelas satu? :) Dalam bahasa FP, Anda cukup mengoper fungsi sebagai argumen ke fungsi lain. Dalam bahasa OOP, Anda harus membungkus fungsi dalam kelas, yang bisa Anda instantiate dan kemudian meneruskan objek itu ke fungsi lainnya. Efeknya sama, tetapi dalam OOP itu disebut pola desain, dan dibutuhkan lebih banyak kode. Dan apa pola pabrik abstrak, jika tidak kari? Lewati parameter ke fungsi sedikit demi sedikit, untuk mengonfigurasi nilai seperti apa yang dikeluarkan ketika Anda akhirnya memanggilnya.
Jadi ya, beberapa pola desain GoF dianggap berlebihan dalam bahasa FP, karena ada alternatif yang lebih kuat dan lebih mudah digunakan.
Tapi tentu saja masih ada pola desain yang tidak diselesaikan oleh bahasa FP. Berapakah FP setara dengan singleton? (Mengabaikan sejenak bahwa lajang umumnya merupakan pola yang mengerikan untuk digunakan.)
Dan itu bekerja dua arah juga. Seperti yang saya katakan, FP juga memiliki pola desainnya; orang biasanya tidak menganggapnya demikian.
Tapi Anda mungkin telah berlari melintasi monad. Apa yang mereka, jika bukan pola desain untuk "berurusan dengan negara global"? Itu masalah yang sangat sederhana dalam bahasa OOP sehingga tidak ada pola desain yang setara di sana.
Kami tidak memerlukan pola desain untuk "increment a static variable", atau "read from socket itu", karena hanya itu yang Anda lakukan .
Mengatakan monad adalah pola desain sama absurdnya dengan mengatakan Integer dengan operasi mereka yang biasa dan elemen nol adalah pola desain. Tidak, monad adalah pola matematika , bukan pola desain.
Dalam bahasa fungsional (murni), efek samping dan keadaan tidak dapat diubah tidak mungkin, kecuali jika Anda mengatasinya dengan "pola desain" monad, atau metode lainnya untuk memungkinkan hal yang sama.
Selain itu, dalam bahasa fungsional yang mendukung OOP (seperti F # dan OCaml), tampak jelas bagi saya bahwa programmer yang menggunakan bahasa ini akan menggunakan pola desain yang sama yang ditemukan tersedia untuk setiap bahasa OOP lainnya. Bahkan, sekarang saya menggunakan F # dan OCaml setiap hari, dan tidak ada perbedaan mencolok antara pola yang saya gunakan dalam bahasa ini vs pola yang saya gunakan saat saya menulis di Jawa.
Mungkin karena Anda masih berpikir secara imperatif? Banyak orang, setelah berhadapan dengan bahasa imperatif sepanjang hidup mereka, mengalami kesulitan melepaskan kebiasaan itu ketika mereka mencoba bahasa fungsional. (Saya telah melihat beberapa upaya yang cukup lucu di F #, di mana setiap fungsi secara harfiah hanyalah serangkaian pernyataan 'let', pada dasarnya seolah-olah Anda mengambil program C, dan mengganti semua titik koma dengan 'let'. :))
Tetapi kemungkinan lain adalah Anda belum menyadari bahwa Anda sedang memecahkan masalah sepele yang membutuhkan pola desain dalam bahasa OOP.
Saat Anda menggunakan currying, atau meneruskan fungsi sebagai argumen ke yang lain, berhenti dan pikirkan bagaimana Anda akan melakukannya dalam bahasa OOP.
Apakah ada kebenaran pada klaim bahwa pemrograman fungsional menghilangkan kebutuhan akan pola desain OOP?
Ya. :) Ketika Anda bekerja dalam bahasa FP, Anda tidak lagi membutuhkan pola desain khusus OOP. Tetapi Anda masih memerlukan beberapa pola desain umum, seperti MVC atau hal-hal spesifik non-OOP lainnya, dan Anda membutuhkan beberapa "pola desain" khusus FP. Semua bahasa memiliki kekurangan masing-masing, dan pola desain biasanya adalah bagaimana kita mengatasinya.
Bagaimanapun, Anda mungkin tertarik untuk mencoba bahasa FP "lebih bersih", seperti ML (favorit pribadi saya, setidaknya untuk tujuan pembelajaran), atau Haskell , di mana Anda tidak memiliki kruk OOP untuk digunakan kembali ketika Anda Sedang dihadapkan dengan sesuatu yang baru.
Seperti yang diharapkan, beberapa orang keberatan dengan definisi saya tentang pola desain sebagai "memperbaiki kekurangan dalam bahasa", jadi inilah alasan saya:
Seperti yang sudah dikatakan, sebagian besar pola desain khusus untuk satu paradigma pemrograman, atau kadang-kadang bahkan satu bahasa tertentu. Seringkali, mereka memecahkan masalah yang hanya ada dalam paradigma itu (lihat monad untuk FP, atau pabrik abstrak untuk OOP).
Mengapa tidak ada pola pabrik abstrak di FP? Karena masalah yang dicoba untuk dipecahkan tidak ada di sana.
Jadi, jika ada masalah dalam bahasa OOP, yang tidak ada dalam bahasa FP, maka jelas itu adalah kekurangan bahasa OOP. Masalahnya dapat dipecahkan, tetapi bahasa Anda tidak melakukannya, tetapi membutuhkan banyak kode boilerplate dari Anda untuk mengatasinya. Idealnya, kami ingin bahasa pemrograman kami secara ajaib membuat semua masalah hilang. Masalah apa pun yang masih ada pada prinsipnya adalah kekurangan bahasa. ;)