metaclass: (Default)
200 килобайт кода (5000 строк) на F# из модели, содержащей 81(типы)+44(таблицы)+276(поля) записей в БД генерит 1.1 мегабайта sql+xml+C# (22 тысяч строк).

Что меня в моем стиле писанины на F# немного напрягает, так это постоянно получающиеся в исходниках строки по 100-150 символов, т.к. на широкоэкранном монике они не мешают, а получающиеся методы сильно читабельнее, т.к. в основном весь смысл строки где-нибудь в начале ("какой ADT создаем") а дальше идут только параметры.

И вот с этими параметрами такая длина и вылазит - осмысленный набор конструкторов данных для половины ADT содержит что-то вроде None, из-за чего эти None путаются между собой и стандартным типом Option (он же - Maybe, т.е. Option.None == Nothing) и для них приходится явно указывать префиксы имени типа (ReadOnlyFieldModifier.None, CSharpVisibility.None, CSharpModifier.None). Сокращать имена типов не хочу, они осмысленные, Можно было бы добавить коротенькие префиксы прямо в имена конструкторов данных, тогда можно было бы обойтись без явного указания имени типа.

Еще было бы неплохо поиметь "параметры по умолчанию", типа вместо параметра пишешь _, а компилятор подставляет то, что мы указали дефолтным где-нибудь в описании функции или конструктора. При небольшом количестве параметров это лечится функциями - умными конструкторами, а при большом задолбаться перебирать комбинации.

Вуду^5

Mar. 31st, 2010 05:40 pm
metaclass: (Default)
Генерил кодогенератором опердень, понадобилось добавить способ описания предикатов проверки прав доступа пользователей (типа "этот пользователь видит только данные своего филиала, или же только относящиеся к налоговой инспекции в городе где этот филиал"). Ну отдельные проверки понятно - запрос типа "exists(select 1 from UserDepartments where UserID=current_user and DeptID=OperdenTable_DeptID)" но мне понадобилось их объединять в итоговый предикат отдельно описанными логическими функциями.
Не нашел ничего лучше, как вкрутить первый попавшийся в гугле под руки парсер s-выражений на F#, который был там приведен как пример использования fsyacc и fslex, затем буквально за 5 минут написал конвертор этих выражений в условия для where в sql-запросах.

Т.е., ко всей этой опердени на смеси SQL,F#,дельфи и жутких xml-метаданных еще добавилось и подмножество лиспа :)

Кстати, весь модуль опердени (2 справочника, 4 ведомости, куча проверок, внешних ключей и зависимостей от других модулей)), ради которого это все затевалось, за полдня на оном безумии сделала специально вышедшая из декрета сотрудница.

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

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 25th, 2017 12:39 am
Powered by Dreamwidth Studios