Как будет реализован "Модель" в веб-приложении Rails-типа на функциональном языке программирования?

В инфраструктурах веб-разработки MVC, таких как Ruby on Rails, Django и CakePHP, HTTP-запросы направляются на контроллеры, которые извлекают объекты, которые обычно сохраняются в хранилище базы данных. Эти объекты представляют такие вещи, как пользователи, сообщения в блогах и т.д., И часто содержат логику в своих методах для разрешений, выборки и/или изменения других объектов, проверки и т.д.

Эти рамки очень объектно ориентированы. Я недавно читал о функциональном программировании, и, похоже, он обладает огромными преимуществами, такими как тестируемость, краткость, модульность и т.д. Однако большинство примеров, которые я видел для функционального программирования, реализуют тривиальные функции, такие как quicksort или последовательность fibonnacci, а не сложные webapps. Я рассмотрел несколько "функциональных" веб-фреймворков, и все они, похоже, прекрасно реализуют представление и контроллер, но в основном пропускают всю часть "модель" и "постоянство". (Я больше говорю о таких каркасах, как Compojure, которые должны быть чисто функциональными, и что-то вроде Lift, которое удобно использовать OO-часть Scala для модели, но исправьте меня, если я ошибаюсь здесь.)

Я не видел хорошего объяснения того, как функциональное программирование может быть использовано для предоставления метафоры, которую предоставляет программирование OO, то есть табличная карта для объектов и объектов может иметь методы, которые обеспечивают мощную инкапсулированную логику, такую ​​как разрешение и валидация. Также вся концепция использования SQL-запросов для сохранения данных, похоже, нарушает концепцию "побочных эффектов". Может ли кто-нибудь объяснить, как слой модели будет реализован в функционально запрограммированной веб-каркасе?

Ответ 1

Не желая bash объектно-ориентированных фреймворков MVC - я не знаю Rails, но Django - отличное программное обеспечение для моего глаза - я не уверен, что Object-Relational Mapping является особенно хорошая метафора 1.

Конечно, на языке OO может показаться естественным думать о таблицах в терминах объектов, но на функциональном языке вполне естественно думать о таблицах в терминах таблиц. Одна строка может быть легко представлена ​​с использованием типа алгебраических данных (в Haskell и других статически типизированных функциональных языках) или карты (a.k.a. словарь, ассоциативная структура, сопоставляющая ключи со значениями); таблица затем становится последовательностью строк, которая, в конце концов, даже на уровне БД. Таким образом, не существует специального отображения из конструкции БД таблицы для какой-либо другой конструкции, доступной на языке программирования; вы можете просто использовать таблицы с обеих сторон. 2

Теперь это никоим образом не означает, что необходимо использовать SQL-запросы для манипулирования данными в БД, исходя из преимуществ абстракции над пристрастиями RDBMS. Поскольку вы используете тег Clojure, возможно, вас может заинтересовать ClojureQL, встроенный DSL для связи с различными БД в общий способ. (Обратите внимание, что он перерабатывается только сейчас.) Вы можете использовать некоторые такие DSL для извлечения данных; манипулировать данными, полученными таким образом, используя чистые функции; затем отобразить некоторые результаты и, возможно, сохранить некоторые данные обратно в БД (используя тот же DSL).


1 Если вы думаете, что сравнение технологии с войной во Вьетнаме немного экстремально, я согласен, но это не значит, что статья не очень хорошо описывает, почему возможно, вы не захотите утонуть в болоте ORM.

2 Обратите внимание, что вы можете использовать один и тот же подход на языке OO и абстрактно над базами БД таким же образом, как это делается на языках FP (см. следующий параграф). Конечно, ваша структура MVC больше не будет похожа на Rails.

Ответ 2

Взгляните на Закрепить структуру веб-приложений для примера того, как можно реализовать структуру MVC на языке функционального программирования. Conjure использует clj-record для слоя модели, который поддерживает ассоциации и проверки.