Пост навеян свежим
ПФП. Статья про circumflex, вот этим вот:
// Выбрать все города Швейцарии, вернуть Seq[City]:
SELECT (ci.*) FROM (ci JOIN co) WHERE (co.code LIKE ”ch”)
ORDER_BY (ci.name ASC) listСтоило ли огород городить, если на выходе всё равно получается нечто, что
(
Read more... )
Comments 64
Реквестирую наглядных примеров, в которых статически типизированные запросы ломаются, а динамически типизированные нет.
И где же конфликт со статической типизацией в отображении кода модели в схему БД? Через reflection вполне можно реализовать (и реализуют) автоматическую миграцию схемы.
Reply
> статически типизированные запросы ломаются,
> а динамически типизированные нет
В такой формулировке, это невозможно даже теоретически - динамическая типизация, это частный случай даже самой примитивной статической.
Reply
Reply
Соорудить, всего лишь, параметрический полиморфизм с Hindley-Milner'ом, навроде ML'евой системы типов, это уже не элементарная задача, хотя и вполне доступная подготовленному человеку.
В то время, как динамические типы способен соорудить любой студент хоть на сишечке. Ну, с поправкой - качественно лямбды не любой соорудит - к сожалению, образование 95% студентов по "компьютерным" специальностям этого не позволяет.
Так что, "частнослучайенность" этих понятий качественно различная.
Reply
Если же их вдруг надо как-то обсчитывать, то проще и быстрее это в самой базе и сделать, а не таскать записи по памяти или того хуже, сети.
Типичное использование --- получить из базы рекордсет, преобразовать к списку типизированных сущностей, засунуть в шаблонизатор и отдать строку на веб. И обратно --- получить набор строк с веба, засунуть в типизированные сущности и засунуть в базу, которая сама по себе типизируется.
Если срезать немного углов, то можно получить из базы прямо сразу XML и отдать его на веб:
select xmlelement(name person, xmlattributes(p.age as a age, p.salary as salary)) from person p where ...
Запросы такие генерятся в рантайме из метаинформации, которая засасывается из базы. Прочие части CRUD тоже генерируются, соответственно консистентность базы запросам достигается сама собой ( ... )
Reply
> Запросы такие генерятся в рантайме из метаинформации, которая засасывается из базы. Прочие части CRUD тоже генерируются, соответственно консистентность базы запросам достигается сама собой.
Вот! :) Это ровно то, что я и предлагаю :)
Только у меня вся генерация происходит на компиляции проекта, а такой "метаинформацией" служит DSL.
PS: Десятое правило Гринспена: "Любая достаточно сложная программа на C или Фортране содержит заново написанную, неспецифицированную, глючную и медленную реализацию половины языка Common Lisp"
Reply
Только у меня вся генерация происходит на компиляции проекта, а такой "метаинформацией" служит DSL.
Да зачем он, если метаинформация сама по себе в БД уже есть?
PS: Десятое правило Гринспена: "Любая достаточно сложная программа на C или Фортране содержит заново написанную, неспецифицированную, глючную и медленную реализацию половины языка Common Lisp"
Ничего похожего на лисп тут нету, да и метапрограммирование как-то тоже не пригодилось
Reply
Ну это смотря что первично: схема бд или типы языка. В принципе, ничто не мешает и по описанию таблицы объекты генерить.
> Ничего похожего на лисп тут нету, да и метапрограммирование как-то тоже не пригодилось
Потому что весь процесс происходит в рантайме. А метапрограммирование пригодилось бы для генерации "instance Read Something" по метаданным из базы, которые иначе при неконсистентности скомпилируются нормально, но дадут ошибку на рантайме.
Reply
Reply
Reply
Reply
Зато при серьезном изменении схемы или декларации объектов бд я могу максимально автоматизировать рефакторинг кода путем изменения макроса (кодогенератора), а не ползать по всему проекту и изменять каждый запрос руками.
Reply
что-то я не вижу такого макроса (кодогенератора) для общего случая.
Reply
Reply
Но почему же, в лиспе можно отловить ошибку и (если изменения были минорными) прямо в рантайме перекомпилировать необходимые классы и методы.
А вообще тут смысл даже не в консистентности, а в автоматизации последующего за серьезными изменениями рефакторинга кода. Даже если типизация что-то сумела отловить, все равно править проект надо во всех местах руками. А вот кодогенератор не только гарантирует консистентность, он еще и берет на себя эту рутину.
Reply
а все места --- это какие?
Reply
Reply
Leave a comment