Saya terutama telah terpapar dengan pemrograman OO sejauh ini dan saya menantikan untuk belajar bahasa fungsional. Pertanyaan saya adalah:
- Kapan Anda memilih pemrograman fungsional daripada berorientasi objek?
- Apa definisi masalah yang khas di mana pemrograman fungsional merupakan pilihan yang lebih baik?
oop
functional-programming
paradigms
Olivier Lalonde
sumber
sumber
Jawaban:
Ketika Anda mengantisipasi berbagai jenis evolusi perangkat lunak:
Bahasa berorientasi objek baik ketika Anda memiliki serangkaian operasi pada hal-hal , dan ketika kode Anda berkembang, Anda terutama menambahkan hal-hal baru. Ini dapat dicapai dengan menambahkan kelas baru yang menerapkan metode yang ada, dan kelas yang ada dibiarkan sendiri.
Bahasa fungsional baik ketika Anda memiliki satu set hal yang tetap , dan ketika kode Anda berkembang, Anda terutama menambahkan operasi baru pada hal-hal yang ada. Ini dapat dicapai dengan menambahkan fungsi baru yang menghitung dengan tipe data yang ada, dan fungsi yang ada dibiarkan sendiri.
Ketika evolusi salah jalan, Anda memiliki masalah:
Menambahkan operasi baru ke program berorientasi objek mungkin memerlukan pengeditan banyak definisi kelas untuk menambahkan metode baru.
Menambahkan hal baru ke program fungsional mungkin memerlukan pengeditan banyak definisi fungsi untuk menambahkan kasus baru.
Masalah ini telah dikenal selama bertahun-tahun; pada tahun 1998, Phil Wadler menjulukinya "masalah ekspresi" . Meskipun beberapa peneliti berpikir bahwa masalah ekspresi dapat diatasi dengan fitur bahasa seperti mixin, solusi yang diterima secara luas belum mencapai arus utama.
Bahasa fungsional unggul dalam memanipulasi data simbolik dalam bentuk pohon. Contoh favorit adalah kompiler, di mana bahasa sumber dan menengah jarang berubah (kebanyakan hal yang sama ), tetapi penulis kompiler selalu menambahkan terjemahan baru dan peningkatan atau optimisasi kode (operasi baru pada hal-hal). Kompilasi dan terjemahan yang lebih umum adalah "aplikasi pembunuh" untuk bahasa fungsional.
sumber
Anda tidak perlu harus memilih di antara kedua paradigma tersebut. Anda dapat menulis perangkat lunak dengan arsitektur OO menggunakan banyak konsep fungsional. FP dan OOP bersifat ortogonal .
Ambil contoh C #. Bisa dibilang sebagian besar OOP, tetapi ada banyak konsep dan konstruksi KB. Jika Anda mempertimbangkan Linq , konstruksi paling penting yang memungkinkan Linq ada adalah sifat fungsional: ekspresi lambda .
Contoh lain, F #. Bisa dibilang itu kebanyakan FP, tetapi ada banyak konsep dan konstruk OOP yang tersedia. Anda dapat mendefinisikan kelas, kelas abstrak, antarmuka, berurusan dengan warisan. Anda bahkan dapat menggunakan kemampuan berubah-ubah saat membuat kode Anda lebih jelas atau ketika itu secara dramatis meningkatkan kinerja.
Banyak bahasa modern multi-paradigma.
Bacaan yang disarankan
Karena saya berada di kapal yang sama (latar belakang OOP, belajar FP), saya sarankan beberapa bacaan yang sangat saya hargai:
Pemrograman Fungsional untuk Pengembangan .NET Sehari-hari , oleh Jeremy Miller. Sebuah artikel yang bagus (walaupun tidak diformat dengan baik) menunjukkan banyak teknik dan contoh FP nyata yang praktis di dunia nyata pada C #.
Pemrograman Fungsional Dunia Nyata , oleh Tomas Petricek. Sebuah buku hebat yang terutama berkaitan dengan konsep FP, mencoba menjelaskan apa itu, kapan harus digunakan. Ada banyak contoh di F # dan C #. Juga, blog Petricek adalah sumber informasi yang bagus.
sumber
Penawaran Pemrograman Berorientasi Objek:
Pemrograman Fungsional, di Haskell atau bahkan di Scala, dapat memungkinkan penggantian melalui mekanisme kelas tipe yang lebih umum. Keadaan internal yang berubah-ubah tidak dianjurkan atau dilarang. Enkapsulasi representasi internal juga dapat dicapai. Lihat Haskell vs OOP untuk perbandingan yang baik.
Pernyataan Norman bahwa "Menambahkan hal baru ke program fungsional mungkin memerlukan pengeditan banyak definisi fungsi untuk menambahkan kasus baru." tergantung pada seberapa baik kode fungsional telah menggunakan kelas tipe. Jika Pencocokan Pola pada Tipe Data Abstrak tertentu tersebar di seluruh basis kode, Anda memang akan menderita masalah ini, tetapi mungkin ini adalah desain yang buruk untuk memulai.
DIedit Referensi dihapus untuk konversi implisit ketika membahas kelas tipe. Dalam Scala, kelas tipe dikodekan dengan parameter implisit, bukan konversi, meskipun konversi implisit adalah cara lain untuk mencapai subtitusi tipe yang kompatibel.
sumber
Jika Anda berada di lingkungan yang sangat padat, maka pemrograman fungsional murni bermanfaat. Kurangnya keadaan yang bisa berubah membuat konkurensi hampir sepele. Lihat Erlang.
Dalam bahasa multi-paradigma, Anda mungkin ingin memodelkan beberapa hal secara fungsional jika keberadaan keadaan yang dapat diubah harus merupakan detail implementasi, dan dengan demikian FP adalah model yang baik untuk domain masalah. Sebagai contoh, lihat daftar pemahaman dalam Python atau std.range dalam bahasa pemrograman D. Ini terinspirasi oleh pemrograman fungsional.
sumber