Как организовать функциональные программы [закрыто]

41

Возможный дубликат:
функциональное программирование против ООП
Как написать управляемый код с функциональным программированием?

В ООП вашей основной единицей организации для кода является класс. Часто используемая методология в Java, C # и аналогичных языках состоит в том, чтобы организовать ваш код вокруг одного файла для каждого класса с именем файла после имени класса.

Вы можете рассматривать каждый из этих классов как единицу организации, объединяющую в себе единую концепцию.

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

Как обычно организованы крупные проекты на функциональных языках?

Как определить, как разделить ваши функции на разные файлы?

Используются ли другие единицы группировки помимо файлов?

Как код обычно организован в одном файле?

жилль
источник
18
@ S.Lott What's stopping you from...Годы и годы программирования с совершенно другим мышлением, в том смысле, что код на Haskell не вычисляется мысленно. И, конечно, вы предполагаете, что реальные проекты всегда правильно и аккуратно организованы (может быть, они есть, но как нуб, как я, должен знать?)
Яннис
13
@ S.Lott: я всегда программировал в ООП. Я начал играть на функциональных языках совсем недавно из любопытства. Вы говорите: «Зачем спрашивать здесь?». A: Чтобы получить наставничество и понимание от людей с опытом (или от экспертов, как об этом говорится на сайте), которые могли бы просветить меня по этому вопросу. Разве это не цель этого сайта? Разве нельзя ответить на все вопросы программистов или ТАК: «Почему бы вам самим не узнать»? Ответ да, вы можете. Но причина задать вопрос состоит в том, чтобы получить лучшие / более быстрые результаты от кого-то, кто является экспертом в этой области.
Жиль
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 поощряет ограничение ввода-вывода и размещение всего этого в одном месте. Большое количество модулей вообще не выполняет ввод-вывод, и для любого конкретного проекта мне бы хотелось, чтобы как можно больше модулей было чистым.

Например, я работаю над простым языком программирования, который я называю TPL (без веской причины). Для этого я создал два простых модуля: TPL.Parseкоторый определяет внутреннее представление языка и как его анализировать, и TPL.Runкоторый запускает интерпретатор и имеет дело с переменными и IO. Для фактической компиляции и запуска кода, как правило, существует Mainмодуль, который в конечном итоге является точкой входа в программу.

Существует значительная свобода в организации функций в файле; это именно то, что мне нравится делать. Я определяю свои типы данных в верхней части, прежде чем они будут использованы в другом месте. Сразу после определения типов данных я реализую все, что мне нужно, чтобы сделать их частью соответствующих им классов типов - это похоже на реализацию интерфейса. Затем я следую логике и различным вспомогательным функциям, в зависимости от ситуации. Наконец, мне нравится, когда все мои функции ввода-вывода находятся в самом низу и заканчиваются на main. Это проясняет, что именно делает любой ввод-вывод и где запускается программа.

Итак, в заключение: функции содержатся в модулях, каждый из которых состоит из одного файла. Несколько модулей могут составлять программу или библиотеку; первый обычно включает в себя Mainмодуль, который является его точкой входа. Внутри файла есть разные варианты организации, но я предпочитаю группировать типы данных вверху, ввод-вывод внизу и логику посередине.

Тихон Джелвис
источник