metaclass: (дзедline)
metaclass ([personal profile] metaclass) wrote2013-02-20 05:04 pm
Entry tags:

Записи, макросы, скала, вывод типов, SQL

В очередной раз, в связи с макросами подниму свой любимый вопрос:
Можно ли поиметь в языках типа скалы строгую типизацию, не объявляя типы записей заранее?

Идея в следующем: у меня в Clojure большая часть DSL основана на том, что я могу в любое место описания строк-колонок-ячеек отчета (условно говоря, Excel-like таблица фиксированной формы, заполняемая автоматом из проводок) в любой момент добавить атрибут типа :skip-in-vat true и обработать его. При этом мне нужно это изменить ровно в двух местах - описание документа ("данные") и расчетный алгоритм ("код"). Типов тут нет, а вместо них - структуры данных, скомбинированные из словарей, массивов и атомарных данных.

Но с динамически типизированными языками, а особенно с Clojure с ее destructring и прагматичным подходам к совместимости типов имеется постоянно проблема вида "сунул лишние скобки, на место числа попал массив и через 100500 вызовов когда дело дошло до суммирования, оператор + сдох от попытки просуммировать ссылку на массив со стек-трейсом на три страницы". Причем если мне такие ошибки чинить достаточно легко, то менее опытным коллегам это вырывает мозг.

В F# и прочих типизированных языках же мне придется сначала ползти в описание записи (если там записи вообще есть), добавлять поле или хуже того - еще один вариант для алгебраического типа, править вызовы конструкторов (если оверлоадинга нет) и прочая и прочая.

Кроме того, часто хочется такого: "тип записи создается в SQL запросе и далее используется в функции, обрабатывающей результат запроса". В clojure это опять же - словарь, с кейвордами в качестве ключей.

Языки же кроме F#, Scala и Clojure можно не рассматривать вообще - на них аналогичные задачи или сводятся к "наняли 100 ртишников по одному на объект предметной области и написали вручную" или к "написали самодельный лисп с хаскелем на дельфи/C#" или к "используем безумные ORM с еще более дикими, чем SQL языками и внешними декларативными описаниями".
Т.е. я не говорю, что они не пригодны - но затраты ресусов на решение задачи на таких языках заметно больше.

[identity profile] plumqqz.livejournal.com 2013-02-20 08:51 pm (UTC)(link)
Если поля не оказалось - программа должна при запуске уведомить о том, что версия устарела - это значит, что в наше отсутствие схема БД изменилась и никаких гарантий работоспособности мы дать не можем.
"Вывести список заказов невозможно, так как имя пользователя неизвестно"? Ну пусть...

Но требуется уточнение, что вы имеете в виду под этим: административное решение "маша не должна видеть поле username" или техническую реализацию в некоторых СУБД, позволяющих выделять права на select в разрезе отдельных полей таблиц?
Имеется в виду административное решение путем технической реализации. Ну как я в бытность работы "в одном крупном телекоме" мог видеть номера телефонов, а вот колонка с ФИО владельца мне просто не показывалась - не было такой.

В обоих случаях, насколько я понимаю, пользователи с разными правами используют разные запросы к БД
Нет. В одном случае в select * from msisdn есть колонка с фио, в другом - ее нет.

[identity profile] metaclass.livejournal.com 2013-02-20 09:12 pm (UTC)(link)
Ага, значит выводом типов за нас занимается СУБД все таки.
Я правда, слышал, что select * from делать не принято, но в этом случае по другому не получится.

Подобная реализация подразумевает специфическую организацию системы. Как минимум, двухзвенку вместо трехзвенки, или вудуизм с протаскиванием аутентификационного токена пользователя от клиента, через сервер приложений до СУБД.
И, насколько я понимаю, этот функционал с запиливанием доступа к полям работает по разному (если вообще присутствует) в разных СУБД?