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
dan public
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 seperti java.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
Dan Project.Run
). Jika saya menulis kode yang lebih seperti perpustakaan daripada aplikasi, saya akan mengaturnya berdasarkan apa yang dilakukannya, seperti Data.List
atau Control.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, dan TPL.Run
yang menjalankan penerjemah dan berurusan dengan variabel dan IO. Untuk benar-benar mengkompilasi dan menjalankan kode, umumnya ada Main
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.
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?)