Dapatkah pemrograman fungsional digunakan untuk mengembangkan aplikasi perusahaan penuh?

19

Saya baru mulai belajar pemrograman fungsional (FP). Saya berasal dari dunia OOP, di mana semuanya adalah objek, dan sebagian besar dari mereka bisa berubah. Saya kesulitan membungkus konsep yang fungsinya tidak memiliki efek samping.

Jika sesuatu tidak bisa berubah, bagaimana benda-benda umum seperti Karyawan atau Orang diwakili dalam FP.

Dapatkah FP digunakan untuk membuat aplikasi perusahaan yang lengkap?

pengguna2434
sumber
5
Mengapa representasi seorang karyawan harus bisa berubah? Mungkin memiliki keadaan, tapi itu pertanyaan lain sepenuhnya.
1
Data yang dapat diubah digunakan mewakili hal-hal. Sebaliknya data yang tidak dapat diubah memiliki nilai sesuatu pada titik waktu tertentu (meskipun ini bukan satu-satunya kasus penggunaan). Jika Anda memiliki setiap bug di mana Anda memiliki dua objek yang bisa berubah yang mewakili hal yang sama, maka Anda tahu kasus di mana menggunakan objek untuk mewakili hal-hal dapat rusak.
dan_waterworth
2
Pemrograman fungsional memiliki efek samping, jika tidak Anda tidak akan pernah bisa mencetak apa pun.
1
@ Thorbjørn Ravn Andersen: Dalam pemrograman imperatif (prosedural, berorientasi objek) Anda menggunakan efek samping baik untuk berkomunikasi dengan dunia eksternal (IO) dan untuk menghitung transformasi data dalam program Anda. Dalam FP Anda memisahkan dua dunia dengan jelas: Anda menggunakan efek samping hanya untuk IO (program tanpa IO biasanya tidak berguna), tetapi Anda menggunakan fungsi murni untuk menghitung transformasi data internal. Efek samping tidak dapat dihindari sama sekali tetapi karena mereka bukan lokal mereka lebih sulit untuk dipikirkan , jadi sebaiknya batasi penggunaannya sebanyak mungkin.
Giorgio
Sesuatu seperti objek "orang" tidak perlu bisa berubah. Alih-alih, Anda membuat objek "orang" yang sama sekali baru yang hampir sama (tetapi sedikit berbeda). Anda akan memiliki referensi ke objek "orang" di suatu tempat dan mengubahnya untuk merujuk ke salinan baru alih-alih salinan lama. Tentu saja referensi itu mungkin ada dalam semacam koleksi, jadi buat salinan koleksi yang hampir sama. Harus ada referensi ke koleksi di suatu tempat sehingga Anda dapat menukar koleksi lama dengan koleksi baru!
Brendan

Jawaban:

17

Pertanyaannya adalah, apakah FP dapat digunakan di Perusahaan? tetapi haruskah kita menggunakan FP di Enteprise?

Tentu saja Anda bisa. Anda dapat mengembangkan aplikasi apa pun dengan bahasa pemrograman apa pun, itulah sebabnya mereka disebut "Turing complete".

Sekarang, untuk pertanyaan "Haruskah menggunakannya di Enterprise?" Terserah Anda atau atasan Anda, FP bisa sangat berguna dalam beberapa jenis aplikasi, dan pada kenyataannya, itu digunakan cukup banyak: Haskell di industri

Sekarang, Anda mungkin bertanya "Jadi mengapa tidak digunakan lebih banyak?" terutama karena bahasa Imperatif / OO lainnya lebih umum, dan perusahaan menolak untuk mengubah ke bahasa yang lebih "eksotis" karena mereka digunakan untuk Java atau C ++.

dysoco
sumber
7
You can develop any kind of application with any kind of programming languageItu argumen yang sangat lemah, waspadalah terhadap Turing tarpit ...
yannis
5
@YannisRizos Saya pikir dia menggeneralisasi demi jawaban to-the-point sebagai lawan mengeksplorasi setiap tangen masalah.
Johnny Rotten
2
@YannisRizos dapat !=ingin
1
Kadang-kadang rasanya bagi saya bahwa bahasa bahkan seharusnya tidak Turing lengkap untuk beberapa jenis solusi Enterprise ...
shabunc
2
Saya berpendapat bahwa itu tidak tergantung pada atasan Anda, ketika berbicara tentang bahasa, itu tergantung pada para insinyur sendiri untuk maju dengan apa yang kami lihat adalah yang terbaik dari sudut pandang teknis kami.
shmish111
11

Saya sudah mulai belajar tentang bahasa FP beberapa tahun yang lalu (Haskell, Scala, Skema) dan, meskipun saya jauh dari menjadi seorang ahli, saya menemukan bahwa mereka dapat membuat saya sangat produktif, untuk tugas-tugas tertentu lebih dari C ++ atau Java .

IMO, beberapa kekuatan bahasa FP adalah:

  • Mereka cenderung sangat ringkas, namun mereka mempertahankan semantik yang jelas.
  • Anda dapat menggunakan gaya deklaratif dan tidak perlu terlalu memikirkan detail implementasi.
  • Sistem tipe kaya seperti Haskell dapat menangkap banyak kesalahan logis sangat awal (pada waktu kompilasi). Sejauh yang saya tahu (tidak terlalu banyak, sebenarnya), SML dan Ocaml menawarkan keunggulan serupa.

Sampai sekarang, saya telah menemukan peralihan ke paradigma FP cukup menarik dan tidak terlalu sulit setelah Anda menghabiskan cukup waktu untuk itu. (Tapi berapa banyak waktu yang saya habiskan untuk belajar C atau C ++? Cukup banyak!)

Jadi saya pikir dari sudut pandang teknis masuk akal untuk mengembangkan aplikasi perusahaan penuh menggunakan bahasa pemrograman fungsional.

Sayangnya paradigma ini bukan arus utama: sebagian besar perusahaan cenderung hanya mengadopsi teknologi yang telah teruji dengan baik, sehingga mereka akan menjauh dari FP sampai mereka memiliki cukup bukti bahwa itu benar-benar berfungsi, bahwa ada cukup pengembang, alat, perpustakaan, kerangka kerja. Oleh karena itu (jauh) lebih sulit untuk menemukan pekerjaan di mana Anda dapat melakukan pemrograman FP penuh waktu sekarang.

Mungkin situasi saat ini akan berubah jika peningkatan penggunaan prosesor multi-core akan mendorong untuk berinvestasi lebih banyak dalam bahasa FP, yang tampaknya cukup kuat untuk menulis perangkat lunak bersamaan.

Juga, ada kecenderungan untuk memperkenalkan beberapa fitur FP ke dalam arus utama, bahasa non-fungsional seperti C #, C ++ sehingga pemrogram dapat menggunakan beberapa FP tanpa perlu beralih paradigma lengkap. Mungkin dalam sepuluh tahun dari sekarang bahasa-bahasa ini akan mencakup fitur FP yang cukup sehingga peralihan ke bahasa yang murni fungsional akan jauh lebih mudah.

Giorgio
sumber
10

Saya tidak berpikir bahwa itu adalah ide terbaik. Tetapi itu tergantung pada sifat aplikasi spesifik.

Saya percaya banyak pada filosofi Eric Evans seperti yang dijelaskan dalam bukunya, Domain-Driven Design , bahwa Anda harus membuat model domain yang merupakan representasi dari masalah yang ada yang dapat membantu Anda memecahkan masalah Anda. Evans menyarankan untuk menemukan bahasa pemrograman yang sesuai dengan masalah yang dihadapi, misalnya ia menyebutkan Fortran sebagai cara memecahkan masalah yang bersifat matematis. Atau bahkan membuat bahasa khusus Domain-khusus untuk masalah yang dihadapi.

Ketika Anda telah berhasil membuat model domain yang baik, Anda akan menemukan bahwa kode presentasi akhirnya menjadi shell tipis di atas lapisan domain.

Sekarang hal dengan aplikasi perusahaan adalah bahwa jenis aplikasi ini (jika Anda dapat menggeneralisasi tentang aplikasi perusahaan) sering melibatkan modifikasi keadaan entitas yang identitasnya penting, dan mempertahankan entitas yang dimodifikasi dalam database. Jenis masalah yang sangat umum ini adalah IMHO jauh lebih baik diselesaikan dengan menggunakan model berorientasi objek daripada model fungsional.

Ini tidak berarti bahwa ada area aplikasi perusahaan yang tidak dapat diselesaikan dengan lebih baik oleh paradigma fungsional. Misalnya modul analisis risiko aplikasi perbankan, atau modul perencanaan rute dalam aplikasi pengiriman. Dan mungkin beberapa aplikasi perusahaan dapat diimplementasikan sepenuhnya menggunakan paradigma fungsional.

Tetapi secara umum, saya berpikir bahwa paradigma berorientasi objek memungkinkan pembuatan model domain yang lebih berguna untuk sebagian besar aplikasi perusahaan.

Edit

Karena beberapa perbaikan, perhatian saya tertarik pada jawaban ini - dan sejak saya menulisnya, saya telah belajar lebih banyak tentang FP - dan saya tidak sepenuhnya yakin bahwa saya setuju dengan jawaban saya sendiri lagi. Beberapa bahasa fungsional dapat dengan sangat baik menggambarkan kasus penggunaan. Tetapi Anda perlu mempelajari pola pikir yang sama sekali berbeda.

Pete
sumber
2
+1: Jawaban yang sangat bagus dan merangsang. Karena pengetahuan saya yang terbatas tentang FP, saya tidak yakin apakah ini benar, tapi saya pikir objek yang persisten dapat dimodelkan menggunakan monad atau tipe unik (dalam Bersih): dengan cara ini nilai dapat memperoleh identitas, diteruskan ke program Anda dan ditransformasikan oleh fungsi yang berbeda. Tapi saya benar-benar membutuhkan pendapat pakar FP untuk mendukung ini.
Giorgio
3

Ya bisa. Google sedikit dan Anda akan menemukan perangkat lunak nyata yang dikodekan dalam bahasa fungsional murni.

Adapun pertanyaan Anda tentang objek bisnis, saya kira masalah Anda yang sebenarnya adalah dengan kekekalan. Dalam hal itu, pertimbangkan bahwa Anda mengembalikan "Orang" baru setiap kali Anda akan memutasinya jika Anda menggunakan bahasa imperatif.

Perhatikan bahwa teknik ini juga dapat diimplementasikan menggunakan bahasa imperatif!

Andres F.
sumber
3

Function Programming (FP) seperti Object Oriented Programming (OOP) adalah paradigma. Mereka mewakili pola atau pendekatan yang berbeda untuk masalah pemrograman. Berbagai pendekatan yang berbeda ini tidak menghalangi kemampuan untuk menghasilkan perangkat lunak yang dapat diskalakan, dipelihara, dan diperluas. Itu bukan berarti pendekatannya setara untuk semua jenis masalah; mereka tidak. Masalah-masalah tertentu menyelaraskan diri mereka lebih baik (atau lebih buruk) dengan paradigma tertentu, misalnya FP tidak akan menjadi pilihan pertama saya untuk sebuah program yang memiliki urutan operasi bergantung dengan efek samping. Namun program semacam itu dapat dan telah ditulis, dan ditulis dengan baik.

dietbuddha
sumber
3

Ya, FP dapat digunakan dalam aplikasi perusahaan. Clojure adalah salah satu contoh bahasa FP yang sukses di perusahaan: http://cognitect.com/clojure#successstories

Mewakili negara bisa menjadi tantangan dalam FP dan mengubah paradigma agar sesuai dengan FP bisa menjadi sedikit warp. Beberapa bahasa FP benar-benar melarang sisi memengaruhi dan status yang bisa berubah. Clojure memungkinkan keduanya tetapi tidak menganjurkan atau mengisolasi paradigma tersebut.

Singkatnya, representasi negara mungkin sangat mirip dengan OO. Modifikasi keadaannya sangat berbeda. Jadi misalnya, dalam keadaan FP dapat diwakili oleh daftar dan peta. Daftar karyawan mungkin terlihat seperti:

[[name: "James Brown" address: "Barnwell, SC"]
 [name: "Elvis Presley" address: "Tupelo, MS"]]

Ada dua cara yang saya tahu untuk menangani modifikasi negara di FP. Salah satunya adalah sesuatu seperti pemrograman reaktif fungsional. Dalam paradigma ini, semua status ditangani hanya pada level tertinggi ... misalnya, tampilan HTML dari aplikasi Anda memiliki status dalam tampilan (seperti nama orang, alamat, dll.). Sekarang ketika Anda mengklik "perbarui nama" sebuah fungsi dipanggil yang menangani segala sesuatu tentang pembaruan nama kecuali benar-benar mengubah nama. Ini mungkin terdengar aneh ... tetapi bersabarlah. Nama yang diubah kemudian akan dikembalikan oleh fungsi dan tampilan (atau penyimpanan data persisten, dll.) Akan menunjukkan nama baru. Atau, sebagai alternatif, seluruh struktur baru dengan nama yang diperbarui akan dikembalikan. Jadi apa fungsinya? Ini memvalidasi nama dan mengembalikan nama baru jika itu valid, kesalahan jika tidak, dan mungkin tautan tampilan atau navigasi baru untuk diikuti. Untuk sesuatu yang lebih kompleks daripada perubahan nama, itu mungkin lebih bermanfaat.

Jadi untuk FRP objek yang dikembalikan oleh fungsi adalah status baru dan dapat diberikan langsung ke tampilan atau apa pun yang ada di level tinggi. Dalam beberapa kasus FRP mengambil seluruh negara melewatinya ke fungsi dan mendapatkan seluruh negara kembali.

Dengan paradigma ini, wadah atau kerangka kerja perlu menangani pembaruan tampilan, database, atau apa pun yang perlu diperbarui dari keadaan baru. Jadi Anda bisa membayangkan sebuah kerangka kerja yang menggambar aplikasi di layar. Ketika pengguna mengklik fungsi sesuatu dipanggil dan negara baru dikembalikan. Kerangka kerja kemudian memperbarui layar dengan menggambar ulang semuanya atau dengan cerdas menggambar ulang bagian layar. Lihat http://blog.getprismatic.com/om-sweet-om-high-functional-frontend-engineering-with-clojurescript-and-react/

Clojure menggunakan paradigma kedua yang saya temui dan itu adalah untuk mengisolasi perubahan negara tetapi tidak harus membatasi mereka ke tingkat tertinggi. Dengan Clojure, semua status yang dapat berubah harus "dipegang" (kecuali jika Anda menggunakan objek Java untuk status) oleh atom, agen, atau referensi. Cara kerjanya adalah objek yang dipegang atau diarahkan atau direferensikan (namun Anda ingin menyebutnya) oleh atom / agen / ref tidak dapat diubah, tetapi atom / agen / ref dapat berubah untuk menunjuk ke objek baru. Dalam hal ini Anda menggunakan metode khusus pada atom / agen / ref yang mengatakan "perbarui objek di sini dengan melakukan ini dan itu dan menugaskan atom / agen / ref ke objek baru".

Mengapa ini bermanfaat, Anda mungkin bertanya? Karena objek abadi yang dirujuk oleh konstruk Clojure ini dapat diteruskan ke fungsi yang melakukan sesuatu dan sementara fungsi itu menjalankan referensi ke objek dijamin tidak berubah. Yaitu, atom / agen / ref tidak diteruskan ke fungsi tetapi objek abadi yang ditunjukkan oleh mereka dilewatkan. Atom, agen, dan referensi memiliki properti khusus yang menangani pembaruan dan konkurensi dengan cara yang aman dan merupakan bagian dari bahasa. Lihat http://clojure.org/state

Saya harap ini membantu. Saya sarankan membaca lebih lanjut tentang keadaan Clojure dan FRP untuk mendapatkan pemahaman yang lebih baik tentang bagaimana karyawan dan orang-orang dapat diwakili dalam FP. Padahal, representasi aktual akan mirip dengan pemrograman berorientasi objek ... itu adalah mutabilitas yang sangat berbeda.

Jason
sumber