Как будет реализована «Модель» в веб-приложении типа Rails на функциональном языке программирования? - PullRequest
11 голосов
/ 30 апреля 2010

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

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

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

Ответы [ 2 ]

6 голосов
/ 30 апреля 2010

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

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

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


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

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

1 голос
/ 21 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...