Толочь воду в ступе

Apr 15, 2011 00:43

Пост навеян свежим ПФП. Статья про circumflex, вот этим вот:

// Выбрать все города Швейцарии, вернуть Seq[City]:
SELECT (ci.*) FROM (ci JOIN co) WHERE (co.code LIKE ”ch”)
ORDER_BY (ci.name ASC) listСтоило ли огород городить, если на выходе всё равно получается нечто, что ( Read more... )

article, typing, orm, common lisp, macros, sql, dsl, lisp, metaprogramming, pfp

Leave a comment

dmzlj April 15 2011, 01:39:48 UTC
А я что-то вообще не понимаю, зачем нам сдался маппинг объектов из базы на какие-то объекты в языке. В 90% случаев они просто преобразовываются к какому-то виду, что бы их засунуть в шаблонизатор и отобразить на вебне;

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

Типичное использование --- получить из базы рекордсет, преобразовать к списку типизированных сущностей, засунуть в шаблонизатор и отдать строку на веб. И обратно --- получить набор строк с веба, засунуть в типизированные сущности и засунуть в базу, которая сама по себе типизируется.

Если срезать немного углов, то можно получить из базы прямо сразу XML и отдать его на веб:

select xmlelement(name person, xmlattributes(p.age as a age, p.salary as salary)) from person p where ...

Запросы такие генерятся в рантайме из метаинформации, которая засасывается из базы. Прочие части CRUD тоже генерируются, соответственно консистентность базы запросам достигается сама собой.

Ошибки в рантайме возможны, да --- но их все равно нужно проверять, если мы работаем с базой --- ведь кто-то мог и саму базу удалить.

Если вдруг ВНЕЗАПНО понадобится отобразить эти записи на объекты языка, всегда можно сделать, например,

instance Read Something

Все равно же нам обычно нужен в контексте какого-то бизнес-метода не весь объект целиком, а какой-то его разрез, о котором этот метод знает.

Я это все к чему? Я в хаскелле забил эту ботву типизировать, потому что непонятно, зачем оно нужно. Если же вдруг понадобится, но явно не всю базу, а отдельные разрезы отдельных таблиц в каких-то отдельных случаях.

Reply

swizard April 15 2011, 08:07:40 UTC
Отличный ответ, спасибо :)

> Запросы такие генерятся в рантайме из метаинформации, которая засасывается из базы. Прочие части CRUD тоже генерируются, соответственно консистентность базы запросам достигается сама собой.

Вот! :) Это ровно то, что я и предлагаю :)

Только у меня вся генерация происходит на компиляции проекта, а такой "метаинформацией" служит DSL.

PS: Десятое правило Гринспена: "Любая достаточно сложная программа на C или Фортране содержит заново написанную, неспецифицированную, глючную и медленную реализацию половины языка Common Lisp"

Reply

dmzlj April 15 2011, 09:08:13 UTC

Только у меня вся генерация происходит на компиляции проекта, а такой "метаинформацией" служит DSL.

Да зачем он, если метаинформация сама по себе в БД уже есть?

PS: Десятое правило Гринспена: "Любая достаточно сложная программа на C или Фортране содержит заново написанную, неспецифицированную, глючную и медленную реализацию половины языка Common Lisp"

Ничего похожего на лисп тут нету, да и метапрограммирование как-то тоже не пригодилось

Reply

swizard April 15 2011, 09:19:50 UTC
> Да зачем он, если метаинформация сама по себе в БД уже есть?

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

> Ничего похожего на лисп тут нету, да и метапрограммирование как-то тоже не пригодилось

Потому что весь процесс происходит в рантайме. А метапрограммирование пригодилось бы для генерации "instance Read Something" по метаданным из базы, которые иначе при неконсистентности скомпилируются нормально, но дадут ошибку на рантайме.

Reply

thesz April 15 2011, 10:28:29 UTC
В моём случае всё сложней.

У меня нет шаблонизатора, а есть структура проектов с файлами, которые надо уметь редактировать и всё такое.

Плюс дополнительные объекты - системы сборки, привязанные к сообщениям об ошибках и архитектурам процессоров.

И тп, и тд.

Это CAD, не опердень.

Поэтому у меня так, а не иначе. ;)

Reply

dmzlj April 15 2011, 11:55:02 UTC
Мм, в принципе мысль о том, что генерацию SQL требуется заворачивать в какие-то конструкты я принимаю только в том случае, если мы как-бы сразу говорим, что у нас БД --- всего-лишь persistence layer. Т.е. по большому счету, KV-хранилище. Иначе обертку на языке для генерации SQL можно писать весь остаток жизни.

Reply

thesz April 15 2011, 12:10:32 UTC
http://queue.acm.org/detail.cfm?id=1961297 видал?

Мне язык запросов в виде LINQ выражений нравится ранними проверками, плюс не надо учить ещё один ЯП.

Reply


Leave a comment

Up