Karena bahasa mesin (misalnya, 0110101000110101
) bahasa komputer umumnya berevolusi ke bentuk abstraksi yang lebih tinggi, umumnya membuatnya lebih mudah untuk memahami kode ketika diterapkan pada masalah. Assembler adalah abstraksi atas kode mesin, C adalah abstraksi atas assembler, dll.
Desain berorientasi objek tampaknya sangat baik dalam memungkinkan kita untuk memodelkan masalah dalam hal objek, misalnya, masalah sistem pendaftaran program universitas dapat dimodelkan dengan Course
kelas, Student
kelas, dll. Kemudian, ketika kita menulis solusinya dalam bahasa OO, kami memiliki kelas serupa yang mendapatkan tanggung jawab dan yang umumnya bermanfaat untuk desain, terutama untuk memodulasi kode. Jika saya memberikan masalah ini kepada 10 tim independen yang menyelesaikannya dengan metode OO, umumnya 10 solusi akan memiliki kelas yang berkaitan dengan masalah yang sama. Mungkin ada banyak perbedaan ketika Anda mulai masuk ke dalam penggabungan dan interaksi dari kelas-kelas tersebut, sehingga tidak ada yang namanya "kesenjangan representasi nol."
Pengalaman saya dengan Pemrograman Fungsional sangat terbatas (tidak ada penggunaan dunia nyata, hanya program jenis Hello World). Saya gagal melihat bagaimana bahasa tersebut memungkinkan pemetaan solusi FP dengan mudah ke masalah (dengan kesenjangan representasi yang rendah) seperti yang dilakukan bahasa OO.
Saya mengerti keuntungan FP sehubungan dengan pemrograman bersamaan. Tetapi apakah saya kehilangan sesuatu, atau apakah FP bukan tentang mengurangi kesenjangan representasional (membuat solusi lebih mudah dipahami)?
Cara lain untuk bertanya: apakah kode FP dari 10 tim berbeda yang menyelesaikan masalah dunia nyata yang sama memiliki banyak kesamaan?
Dari Wikipedia tentang Abstraksi (ilmu komputer) (penekanan pada saya):
Bahasa pemrograman fungsional umumnya menunjukkan abstraksi yang terkait dengan fungsi , seperti abstraksi lambda (membuat istilah menjadi fungsi beberapa variabel), fungsi orde tinggi (parameter adalah fungsi), abstraksi braket (membuat istilah menjadi fungsi dari variabel).
Kesenjangan representasional dapat berpotensi meningkat, karena [beberapa] masalah dunia nyata tidak dimodelkan dengan mudah dengan abstraksi semacam itu.
Cara lain yang saya lihat mengurangi kesenjangan representasional adalah dalam menelusuri elemen solusi kembali ke masalah. Kode 0
's' dan ' in ' 1
sangat sulit dilacak, sedangkan Student
kelasnya mudah dilacak. Tidak semua kelas OO melacak dengan mudah ke ruang masalah, tetapi banyak yang melakukannya.
Bukankah abstraksi FP selalu perlu dijelaskan untuk mencari tahu bagian mana dari ruang masalah yang mereka selesaikan (selain dari masalah matematika )?OK - saya bagus di bagian ini. Setelah melihat lebih banyak contoh, saya melihat bagaimana abstraksi FP sangat jelas untuk bagian masalah yang diekspresikan dalam pemrosesan data.
Jawaban yang diterima untuk pertanyaan terkait Bisakah UML digunakan untuk memodelkan program Fungsional? - mengatakan "Programer fungsional tidak memiliki banyak kegunaan untuk diagram." Saya benar-benar tidak peduli apakah itu UML, tapi itu membuat saya bertanya-tanya tentang abstraksi FP menjadi mudah dimengerti / dikomunikasikan, jika tidak ada diagram yang banyak digunakan (dengan asumsi jawaban ini benar). Sekali lagi, tingkat penggunaan / pemahaman FP saya sepele, jadi saya mengerti tidak perlu diagram pada program FP sederhana.
Desain OO memiliki fungsi / kelas / tingkat paket abstraksi, dengan enkapsulasi (kontrol akses, penyembunyian informasi) di masing-masing, yang membuat pengelolaan kompleksitas menjadi lebih mudah. Ini adalah elemen yang memungkinkan pergi dari masalah ke solusi dan kembali dengan lebih mudah.
Banyak jawaban berbicara tentang bagaimana analisis dan desain dilakukan dalam FP dengan cara yang analog dengan OO, tetapi tidak ada yang mengutip apa pun tingkat tinggi sejauh ini (paul mengutip beberapa hal menarik, tetapi tingkat rendah). Saya melakukan banyak Googling kemarin dan menemukan beberapa diskusi yang menarik. Berikut ini adalah dari Program Fungsional Refactoring oleh Simon Thompson (2004) (penekanan tambang)
Dalam mendesain sistem berorientasi objek, dapat diterima bahwa desain akan mendahului pemrograman. Desain akan ditulis menggunakan sistem seperti UML yang didukung dalam alat-alat seperti Eclipse. Pemrogram pemula mungkin belajar pendekatan desain visual menggunakan sistem seperti BlueJ. Pekerjaan pada metodologi serupa untuk pemrograman fungsional dilaporkan dalam FAD: Analisis Fungsional dan Desain , tetapi sedikit pekerjaan lain yang ada. Mungkin ada sejumlah alasan untuk ini.
Program fungsional yang ada adalah skala yang tidak memerlukan desain. Banyak program fungsional kecil, tetapi yang lain, seperti Glasgow Haskell Compiler, substansial.
Program fungsional secara langsung memodelkan domain aplikasi, sehingga membuat desain tidak relevan. Sementara bahasa fungsional memberikan berbagai abstraksi yang kuat, sulit untuk membantah bahwa ini menyediakan semua dan hanya abstraksi yang diperlukan untuk memodelkan dunia nyata.
Program fungsional dibangun sebagai serangkaian prototipe yang berkembang.
Dalam tesis PhD yang dikutip di atas , manfaat menggunakan Analisis dan metodologi desain (ADM) diuraikan secara independen dari paradigma. Tetapi argumen dibuat bahwa ADM harus sejajar dengan paradigma implementasi. Artinya, OOADM bekerja paling baik untuk pemrograman OO dan tidak diterapkan dengan baik pada paradigma lain seperti FP. Berikut adalah kutipan yang bagus yang saya pikir memparafrasekan apa yang saya sebut kesenjangan representasional:
kita dapat berdebat panjang lebar tentang paradigma mana yang memberikan dukungan terbaik untuk pengembangan perangkat lunak, tetapi seseorang mencapai paket pengembangan yang paling alami, efisien dan efektif ketika seseorang tetap berada dalam paradigma tunggal mulai dari deskripsi masalah hingga implementasi dan pengiriman.
Berikut adalah set diagram yang diusulkan oleh FAD:
- diagram ketergantungan fungsi yang menyajikan fungsi dengan yang digunakannya dalam implementasinya;
- type dependency diagram yang menyediakan layanan yang sama untuk tipe; dan,
- diagram dependensi modul yang menyajikan tampilan arsitektur modul sistem.
Ada studi kasus di bagian 5.1 dari tesis FAD, yang merupakan sistem untuk mengotomatisasi produksi data yang berkaitan dengan liga sepak bola. Persyaratannya adalah 100% fungsional, misalnya, memasukkan hasil sepak bola, menghasilkan tabel liga, tabel penilaian, tabel kehadiran, mentransfer pemain antar tim, memperbarui data setelah hasil baru, dll. Tidak disebutkan bagaimana FAD bekerja untuk menyelesaikan persyaratan non-fungsional didokumentasikan , selain menyatakan bahwa "fungsionalitas baru harus diizinkan dengan biaya minimal", sesuatu yang hampir mustahil untuk diuji.
Sayangnya, terlepas dari FAD, saya tidak melihat referensi modern untuk bahasa pemodelan (visual) yang diusulkan untuk FP. UML adalah paradigma lain, jadi kita harus melupakannya.