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

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

Comments 64

antage April 14 2011, 23:56:17 UTC
Мне кажется, вы лукавите. Вы привели настолько простой пример, что он просто не может сломаться при изменении схемы таблицы. SELECT (cities.*) FROM cities тоже будет трудно сломать добавлением всего лишь ещё одного поля.
Реквестирую наглядных примеров, в которых статически типизированные запросы ломаются, а динамически типизированные нет.

И где же конфликт со статической типизацией в отображении кода модели в схему БД? Через reflection вполне можно реализовать (и реализуют) автоматическую миграцию схемы.

Reply

nivanych April 15 2011, 04:23:14 UTC
> примеров, в которых
> статически типизированные запросы ломаются,
> а динамически типизированные нет

В такой формулировке, это невозможно даже теоретически - динамическая типизация, это частный случай даже самой примитивной статической.

Reply

swizard April 15 2011, 07:31:38 UTC
А статическая типизация -- это частный случай DSL :)

Reply

nivanych April 15 2011, 07:44:05 UTC
DSL - тоже частный случай. А толку?
Соорудить, всего лишь, параметрический полиморфизм с Hindley-Milner'ом, навроде ML'евой системы типов, это уже не элементарная задача, хотя и вполне доступная подготовленному человеку.
В то время, как динамические типы способен соорудить любой студент хоть на сишечке. Ну, с поправкой - качественно лямбды не любой соорудит - к сожалению, образование 95% студентов по "компьютерным" специальностям этого не позволяет.
Так что, "частнослучайенность" этих понятий качественно различная.

Reply


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 тоже генерируются, соответственно консистентность базы запросам достигается сама собой ( ... )

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


anonymous April 15 2011, 03:12:31 UTC
awesome!

Reply


gabriel_pages April 15 2011, 04:42:25 UTC
все сломается, когда в базе уже будет пара сотен записей и кто-то зачет поменять структуру, скажем добавить поле.

Reply

metaclass April 15 2011, 05:07:52 UTC
Все сломается с треском, когда на эту таблицу будут ссылаться 100 других таблиц, 1000 триггеров и хранимых процедур.

Reply

swizard April 15 2011, 07:38:37 UTC
Конечно, но статическая типизация нам тут тем более не поможет :)

Зато при серьезном изменении схемы или декларации объектов бд я могу максимально автоматизировать рефакторинг кода путем изменения макроса (кодогенератора), а не ползать по всему проекту и изменять каждый запрос руками.

Reply

rastafarra April 15 2011, 07:44:22 UTC
> Зато при серьезном изменении схемы или декларации объектов бд я могу максимально автоматизировать рефакторинг кода путем изменения макроса (кодогенератора)

что-то я не вижу такого макроса (кодогенератора) для общего случая.

Reply


thedeemon April 15 2011, 05:54:41 UTC
Хм. Я так понимаю, есть три сущности: 1) код на языке Х, 2) SQL запросы и 3) база. В одном случае нам гарантируют консистентность 1 и 2, а в другом обеспечивается согласованность 1-2-3 в момент сборки, но в рантайме согласованность 2 и 3 все равно никто не гарантирует, т.к. база может меняться. К вопросу статической или динамической типизации это вообще не относится. Никто не мешает в статическом случае добавить проверку соотвествия 1-2 и 3 в момент сборки или, что еще лучше, в момент запуска программы.

Reply

swizard April 15 2011, 07:43:25 UTC
> но в рантайме согласованность 2 и 3 все равно никто не гарантирует, т.к. база может меняться

Но почему же, в лиспе можно отловить ошибку и (если изменения были минорными) прямо в рантайме перекомпилировать необходимые классы и методы.

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

Reply

rastafarra April 15 2011, 07:45:38 UTC
> править проект надо во всех местах руками.

а все места --- это какие?

Reply

swizard April 15 2011, 07:50:09 UTC
Где выполняются типизированные запросы к бд и из результатов конструируются объекты языка

Reply


Leave a comment

Up