Я підозрюю, що це залежить від мови. Що стосується функціонального програмування, то я в основному балакався в Haskell, тому я збираюся пояснити, як це працює там.
Код Haskell організований у "модулі", які в основному є сукупністю функцій та типів даних. Кожен модуль - це один файл. Модуль - це щось поєднання між класом Java та пакетом Java - точний обсяг того, що модуль робить, різниться. Модуль також контролює, які функції та тип конструкторів потрібно експортувати, а які - ховати; це схоже на private
і public
на Java.
У моїх власних програмах, я хотів би мати модулі зробити один предмет, семантичний; це робить їх схожими на клас Java, за винятком того, що вони можуть визначати кілька типів даних. Модулі, які я використовую зі стандартної бібліотеки, схожі Data.List
, більше схожі на пакети - вони надають набір аналогічних функцій утиліти. Це також дуже схоже на статичні Java-класи java.util.Arrays
.
Модулі також схожі на пакети Java, оскільки вони можуть бути вкладені для ясності (я не думаю, що це не впливає на сам код). Загалом, для одного проекту я даю йому ім’я (скажімо Project
) і всі мої модулі є частиною цього (наприклад, Project.Parse
і Project.Run
). Якби я писав код, який більше нагадував бібліотеку, ніж додаток, я б організував її на основі того, що вона робила, як-от Data.List
або Control.Monad
. Основна відмінність від інших мов полягає в тому, що Haskell закликає обмежувати IO і розміщувати все це в одному місці. Велика кількість модулів взагалі не робить IO, і для будь-якого проекту я люблю, щоб якомога більше модулів було чистими.
Як приклад, я працюю над простою мовою програмування, яку я називаю TPL (без поважних причин). Для цього я створив два простих модуля: TPL.Parse
який визначає внутрішнє представлення мови та спосіб її розбору, і TPL.Run
який запускає інтерпретатор та має справу зі змінними та IO. Насправді для компіляції та запуску коду, як правило, є Main
модуль, який в кінцевому підсумку є точкою входу програми.
Існує значна свобода в організації функцій у файлі; це саме те, що я люблю робити. Я визначаю свої типи даних у верхній частині, перш ніж їх використовувати в іншому місці. Одразу після визначення типів даних я реалізую все, що мені потрібно, щоб зробити їх частиною відповідних класів - це на зразок реалізації інтерфейсу. Тоді я дотримуюся логіки та різних допоміжних функцій, якщо це доречно. Нарешті, мені подобається, що всі мої функції вводу-виводу в кінці закінчуються main
. Це дає зрозуміти, що саме робить будь-який IO і з чого починається програма.
Отже, підсумовуючи: функції містяться в модулях, кожен з яких складається з одного файлу. Кілька модулів можуть складати програму або бібліотеку; перший, як правило, включає Main
модуль, який є його точкою входу. У файлі є різні варіанти організації, але я вважаю за краще групувати типи даних вгорі, IO внизу та логіка в середині.
What's stopping you from...
Роки та роки програмування з зовсім іншим способом мислення, до того, що код Haskell не подумки обчислює. І звичайно, ви припускаєте, що реальні проекти завжди правильно і акуратно організовані (можливо, вони є, але як нооб, як я це знаю?)