Saya telah mendengar banyak pembicaraan tentang penggunaan bahasa fungsional seperti Haskell pada akhir-akhir ini. Apa saja perbedaan besar, pro dan kontra dari pemrograman fungsional vs pemrograman berorientasi objek?
Saya telah mendengar banyak pembicaraan tentang penggunaan bahasa fungsional seperti Haskell pada akhir-akhir ini. Apa saja perbedaan besar, pro dan kontra dari pemrograman fungsional vs pemrograman berorientasi objek?
Jawaban:
Saya akan mengatakan bahwa itu lebih Pemrograman Fungsional vs Pemrograman Imperatif .
Perbedaan terbesar adalah bahwa pemrograman Imperatif adalah tentang aliran Kontrol sedangkan pemrograman Fungsional adalah tentang aliran data . Cara lain untuk mengatakannya adalah bahwa pemrograman fungsional hanya menggunakan ekspresi sedangkan dalam pemrograman imperatif baik ekspresi dan pernyataan digunakan.
Sebagai contoh, dalam variabel pemrograman imperatif dan loop adalah umum ketika menangani keadaan, sedangkan dalam pemrograman fungsional negara ditangani melalui parameter yang lewat, yang menghindari efek samping dan tugas.
Kode pseudo imperatif untuk fungsi menghitung jumlah daftar (jumlah disimpan dalam variabel):
int sumList(List<int> list) {
int sum = 0;
for(int n = 0; n < list.size(); n++) {
sum = sum + list.get(n);
}
return sum;
}
Kode pseudo fungsional untuk fungsi yang sama (jumlah dilewatkan sebagai parameter):
fun sumList([], sum) = sum
| sumList(v::lst, sum) = sumList(lst, v+sum)
Saya merekomendasikan presentasi Efek Menjinakkan dengan Pemrograman Fungsional oleh Simon Peyton-Jones untuk pengenalan yang baik untuk konsep-konsep fungsional.
Pemrograman fungsional didasarkan pada model deklaratif dan berakar dari kalkulus lambda. Ini menawarkan banyak konsep hebat yang dapat dipinjam dari bahasa yang lebih penting seperti C ++ dan C #.
Beberapa contoh termasuk transparansi referensial, fungsi lambda, fungsi kelas satu, evaluasi malas dan bersemangat, dan kekekalan.
Jika tidak ada yang lain belajar pemrograman fungsional berguna untuk konsep-konsep yang dikandungnya. Ini akan mengubah cara Anda melakukan pemrograman dan berpikir tentang pemrograman. Dan saya akan menebak bahwa di masa depan pemrograman fungsional akan sama pentingnya dengan pemrograman berorientasi objek.
Untuk memulai, Anda dapat memilih untuk menggunakan bahasa fungsional murni seperti Haskell, atau Anda dapat menggunakan bahasa hibrida seperti F # .
Sebagian besar universitas yang bagus akan mencakup pemrograman fungsional dan jika Anda bersekolah, saya sangat menyarankan Anda mengikuti kursus itu.
Apa saja perbedaan besar, pro dan kontra dari pemrograman fungsional vs pemrograman berorientasi objek?
Pemrograman berorientasi objek yang baik bagus karena memungkinkan Anda untuk memodelkan masalah kompleks Anda menjadi hierarki sehingga Anda dapat menyederhanakan masalah. Tapi itu menjadi sangat sulit ketika Anda mulai mempertimbangkan pemrograman multi-threaded saat menggunakan objek yang bisa berubah. Dalam kasus seperti itu Anda perlu menggunakan banyak objek sinkronisasi dan hampir tidak mungkin untuk menyempurnakan aplikasi besar.
Di situlah pemrograman fungsional masuk. Karena hal-hal seperti pemrograman fungsional immutability benar-benar menyederhanakan program multi-threaded. Itu membuatnya hampir sepele mudah untuk memparalelkan sesuatu ketika Anda tahu bahwa diberi input X ke fungsi itu akan selalu menghasilkan Y. Juga Anda tahu bahwa variabel (atau nilai dalam pemrograman fungsional) tidak dapat mengubah penggunaan pertengahan dari utas lainnya.
(Jawaban ini diadaptasi dari jawaban ke pertanyaan tertutup di StackOverflow .)
Salah satu perbedaan besar antara pemrograman fungsional dan pemrograman berorientasi objek adalah bahwa masing-masing lebih baik pada jenis evolusi perangkat lunak yang berbeda:
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.
Tidak ada yang nyata versus. Mereka bisa saling melengkapi dengan sempurna. Ada bahasa FP, yang mendukung OOP. Tetapi komunitas berbeda dalam cara mereka menangani modularitas.
Pengguna bahasa FP cenderung mencapai modularitas melalui hukum matematika. Dan lebih suka bukti untuk menunjukkan kepatuhan dengan hukum mereka.
Dalam imperatif OOP pengguna cenderung menangkap perilaku objek dalam kasus-uji, yang dapat dijalankan kembali jika objek telah berubah dan mencapai dengan cara modularitas ini.
Ini hanya aspek kecil, tapi saya pikir itu layak disebutkan.
Sebuah analogi:
Anda menerima lamaran pekerjaan. Anda mengisi nama, informasi kontak, dan riwayat kerja Anda. Setelah selesai, Anda tidak lagi memiliki aplikasi kosong.
Sekarang bayangkan sebaliknya bahwa sebelum menulis Anda melapisinya dengan selofan yang jelas. Anda menulis nama Anda. Anda menambahkan selofan selembar lagi. Anda menulis informasi kontak Anda. Lebih banyak selofan. Anda menulis riwayat kerja Anda. Setelah selesai, Anda masih memiliki aplikasi kosong yang belum tersentuh. Anda juga memiliki tiga lembar selofan yang masing-masing menangkap efek perubahan tunggal yang terpisah.
Yang pertama (OOP) menganut gagasan mengubah hal-hal di tempat sementara yang terakhir (FP) menolaknya. Keduanya adalah paradigma manajemen negara. Keduanya dapat, menggunakan strategi yang berbeda, menangkap efek dari menyelesaikan lamaran kerja. OOP mengubah instrumen awal secara langsung, sementara FP menutupi apa yang terjadi sebelumnya untuk mempengaruhi penampilan perubahan .