Як організувати функціональні програми [закрито]


41

Можливий дублікат:
функціональне програмування проти OOP
Як написати керований код за допомогою функціонального програмування?

В OOP вашою базовою одиницею організації для коду є клас. Часто використовувана методологія в Java, C # і подібних мовах полягає в упорядкуванні коду навколо наявності одного файлу для кожного класу з назвою файла, що відповідає імені класу.

Ви можете розглядати кожен із цих класів як одиницю організації для групування єдиного поняття.

Ці класи містяться в просторах імен, які часто дотримуються структури каталогів файлів у рішенні / проекті. Простори імен - це ще один рівень організації.

Як зазвичай організовуються великі проекти з функціональних мов?

Як визначити, як розділити свої функції на різні файли?

Чи використовуються інші одиниці групування поряд з файлами?

Як зазвичай організовано код в одному файлі?


18
@ S.Lott What's stopping you from...Роки та роки програмування з зовсім іншим способом мислення, до того, що код Haskell не подумки обчислює. І звичайно, ви припускаєте, що реальні проекти завжди правильно і акуратно організовані (можливо, вони є, але як нооб, як я це знаю?)
yannis

13
@ S.Lott: Я завжди програмував в OOP. Я дуже цікаво почав займатися функціональними мовами зовсім недавно. Ви кажете: "Навіщо просити тут?". Відповідь: Щоб отримати наставництво та розуміння від людей, які мають досвід (або експертів, як розміщено на сайті), які могли б просвітити мене з цього приводу. Чи не це мета цього сайту? Чи не можна відповісти на всі програмісти або ТАК із запитанням: "чому б ти не дізнався для себе"? Відповідь - так, ви можете. Але причина задавати питання полягає в тому, щоб отримати кращі / швидші результати від того, хто є експертом з цього питання.
Жиль

5
@ S.Lott: якщо він просто читає випадковий код, то як він буде знати, чи є прийняті ними організаційні рішення хорошими чи поганими? І чому вони хороші чи погані?
Carson63000


4
@ S.Lott Підсумовуючи підсумок, маючи експерта з мови чи парадигми визначити добре організований проект, визначити будь-які слабкі сторони / недоліки, які можуть існувати в організації, та пояснити, чому набагато цінніше, ніж просто прочитати код і подивитися на організацію , з припущенням, що він добре структурований.
Томас Оуенс

Відповіді:


32

Я підозрюю, що це залежить від мови. Що стосується функціонального програмування, то я в основному балакався в 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 внизу та логіка в середині.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.