Kemungkinan Duplikat:
Pemrograman Fungsional vs. OOP
Bagaimana cara menulis kode yang dapat dikelola dengan pemrograman fungsional?
Dalam OOP, unit dasar organisasi Anda untuk kode adalah kelas. Metodologi yang sering digunakan di Java, C # dan bahasa serupa adalah untuk mengatur kode Anda di sekitar memiliki satu file untuk setiap kelas dengan nama file mengikuti nama kelas.
Anda dapat mempertimbangkan masing-masing kelas ini sebagai unit organisasi untuk mengelompokkan konsep tunggal.
Kelas-kelas ini berada di dalam ruang nama yang sering mengikuti struktur direktori dari file dalam solusi / proyek. Ruang nama adalah tingkat organisasi yang lain.
Bagaimana biasanya proyek besar dalam bahasa fungsional diatur?
Bagaimana Anda menentukan cara membagi fungsi Anda menjadi file yang berbeda?
Apakah unit pengelompokan lain di samping file digunakan?
Bagaimana kode biasanya diatur dalam satu file?
sumber
What's stopping you from...
Bertahun-tahun pemrograman dengan pola pikir yang sama sekali berbeda, sampai-sampai kode Haskell tidak menghitung secara mental. Dan tentu saja Anda mengasumsikan bahwa proyek-proyek nyata selalu terorganisir dengan benar dan rapi (mungkin memang begitu, tetapi bagaimana seorang pemula tahu saya?)Jawaban:
Saya curiga ini tergantung pada bahasa. Sejauh pemrograman fungsional, saya sebagian besar mencoba-coba Haskell, jadi saya akan menjelaskan cara kerjanya di sana.
Kode Haskell disusun menjadi "modul" yang pada dasarnya hanya kumpulan fungsi dan tipe data. Setiap modul adalah satu file. Modul adalah campuran antara kelas Java dan paket Java - ruang lingkup yang tepat dari apa yang modul bervariasi. Modul juga memiliki kendali atas fungsi dan tipe konstruktor mana yang akan diekspor, dan mana yang disembunyikan; ini mirip dengan
private
danpublic
di Jawa.Dalam program saya sendiri, saya suka agar modul melakukan satu hal, secara semantik; ini membuat mereka seperti kelas Java kecuali bahwa mereka mungkin mendefinisikan beberapa tipe data. Modul yang saya gunakan dari perpustakaan standar, seperti
Data.List
, lebih mirip paket - mereka menyediakan satu set fungsi utilitas yang sama. Ini juga sangat mirip dengan kelas Java statis sepertijava.util.Arrays
.Modul-modul ini juga seperti paket-paket Java yang dapat disarangkan untuk kejelasan (saya tidak berpikir ini memiliki efek pada kode itu sendiri). Secara umum, untuk satu proyek, saya memberinya nama (katakanlah
Project
) dan minta semua modul saya menjadi bagian dari ini (mis.Project.Parse
DanProject.Run
). Jika saya menulis kode yang lebih seperti perpustakaan daripada aplikasi, saya akan mengaturnya berdasarkan apa yang dilakukannya, sepertiData.List
atauControl.Monad
. Satu perbedaan utama dari bahasa lain adalah bahwa Haskell mendorong pembatasan IO dan menempatkan semuanya di satu tempat. Sejumlah besar modul tidak memiliki IO sama sekali, dan untuk setiap proyek yang diberikan, saya ingin memiliki modul semurni mungkin.Sebagai contoh, saya sedang mengerjakan bahasa pemrograman sederhana yang saya panggil TPL (tanpa alasan yang bagus). Untuk ini saya telah membuat dua modul sederhana:
TPL.Parse
yang mendefinisikan representasi internal bahasa dan cara menguraikannya, danTPL.Run
yang menjalankan penerjemah dan berurusan dengan variabel dan IO. Untuk benar-benar mengkompilasi dan menjalankan kode, umumnya adaMain
modul yang akhirnya menjadi titik masuk program.Ada kebebasan yang signifikan dalam mengatur fungsi-fungsi dalam file; inilah yang ingin saya lakukan. Saya mendefinisikan tipe data saya ke atas, sebelum digunakan di tempat lain. Tepat setelah mendefinisikan tipe data, saya menerapkan apa pun yang saya butuhkan untuk menjadikannya bagian dari kacamata ketik yang sesuai - ini seperti menerapkan antarmuka. Lalu saya ikuti dengan logika dan berbagai fungsi pembantu, yang sesuai. Akhirnya, saya ingin memiliki semua fungsi IO saya di bagian paling bawah dengan
main
. Ini memperjelas apa yang sedang dilakukan IO dan di mana program dimulai.Jadi, dalam ringkasan: fungsi terkandung dalam modul, yang masing-masing terdiri dari satu file. Beberapa modul dapat membentuk program atau perpustakaan; yang pertama biasanya mencakup
Main
modul yang merupakan titik masuknya. Di dalam file, ada opsi yang berbeda untuk organisasi, tetapi saya lebih suka mengelompokkan tipe data di dekat bagian atas, IO di dekat bagian bawah dan logika di tengah.sumber