Cara mengatur program fungsional [ditutup]

41

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?

Gilles
sumber
18
@ S.Lott 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?)
yannis
13
@ S.Lott: Saya selalu memprogram dalam OOP. Saya sudah mulai mencoba-coba bahasa fungsional baru-baru ini karena penasaran. Anda berkata: "Mengapa bertanya di sini?". A: Untuk mendapatkan bimbingan dan wawasan dari orang-orang yang memiliki pengalaman (atau menurut pakar situs) yang dapat mencerahkan saya tentang masalah ini. Bukankah itu tujuan situs ini? Tidak dapatkah semua Pemrogram atau pertanyaan SO dijawab dengan: "mengapa Anda tidak mencari tahu sendiri"? Jawabannya adalah ya, Anda bisa. Tetapi alasan untuk mengajukan pertanyaan adalah untuk mendapatkan hasil yang lebih baik / lebih cepat dari seseorang yang ahli dalam bidang ini.
Gilles
5
@ S.Lott: jika dia hanya membaca kode acak, bagaimana dia akan tahu apakah keputusan organisasi yang mereka buat itu baik atau buruk? Dan mengapa mereka baik atau buruk?
Carson63000
4
@ S.Lott Ringkasnya, memiliki pakar dalam bahasa atau paradigma mengidentifikasi proyek yang terorganisasi dengan baik, mengidentifikasi kelemahan / kekurangan yang mungkin ada dalam organisasi, dan menjelaskan mengapa jauh lebih berharga daripada hanya membaca kode dan melihat organisasi. , dengan asumsi bahwa itu terstruktur dengan baik.
Thomas Owens

Jawaban:

32

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 privatedan publicdi 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.ParseDan Project.Run). Jika saya menulis kode yang lebih seperti perpustakaan daripada aplikasi, saya akan mengaturnya berdasarkan apa yang dilakukannya, seperti Data.Listatau 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.Parseyang mendefinisikan representasi internal bahasa dan cara menguraikannya, dan TPL.Runyang menjalankan penerjemah dan berurusan dengan variabel dan IO. Untuk benar-benar mengkompilasi dan menjalankan kode, umumnya ada Mainmodul 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 Mainmodul 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.

Tikhon Jelvis
sumber