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

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

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

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

11
задан Sam Ritchie 4 October 2011 в 17:31
поделиться

2 ответа

Не желая разбивать объектно-ориентированные фреймворки MVC - я не знаю Rails, но Django, на мой взгляд, является отличным программным обеспечением - я ' Я не уверен, что объектно-реляционное отображение особенно удачная метафора 1 .

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

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


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

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

6
ответ дан 3 December 2019 в 11:03
поделиться

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

1
ответ дан 3 December 2019 в 11:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: