it-swarm-id.com

Pemrograman Fungsional vs. OOP

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?

95
GSto

Saya akan mengatakan bahwa itu lebih Pemrograman Fungsional vs Pemrograman Imperatif.

Perbedaan terbesar adalah bahwa pemrograman Imperatif adalah tentang Mengontrol aliran sedangkan pemrograman fungsional adalah tentang Aliran data . Cara lain untuk mengatakannya adalah bahwa pemrograman fungsional hanya menggunakan ekspresi sementara dalam pemrograman imperatif keduanya ekspresi dan pernyataan digunakan.

Misalnya, dalam imperatif variabel pemrograman dan loop adalah umum ketika menangani keadaan, sedangkan dalam fungsional memprogram keadaan ditangani melalui melewati parameter, yang menghindari efek samping dan tugas.

Kode semu imperatif untuk fungsi untuk 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 Menjinakkan Efek dengan Pemrograman Fungsional oleh Simon Peyton-Jones untuk pengantar yang baik untuk konsep-konsep fungsional.

69
Jonas

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 kira 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 adalah 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 memberi 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.

16
Brian R. Bondy

(Jawaban ini diadaptasi dari jawaban untuk 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 set tetap 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 set tetap hal-hal , dan ketika kode Anda berkembang, Anda terutama menambahkan yang baru operasi 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 menyebutnya "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.

10
Norman Ramsey

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 FP bahasa 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 case-test, yang dapat dijalankan kembali jika objek telah berubah dan mencapai dengan cara ini modularitas.

Ini hanya aspek kecil, tapi saya pikir layak untuk disebutkan.

5
Edgar Klerks

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 overlay apa yang terjadi sebelumnya ntuk mempengaruhi tampilan perubahan .

2
Mario T. Lanza