Jun. 12th, 2010

metaclass: (Default)
Сижу думаю над шизой.
Имеется описание предметки в виде модели для кодогенерации - хитрозаколдованный набор данных, над которым работают несколько людей и по которому нужно хранить историю.
Для обычной цели "посмотреть кто в прошлом виноват и что делать" истории в виде текстовых diff вполне хватило бы, и набор данных можно представить в любом человеко-машино-читаемом виде (JSON, YAML, итд), засунув его под меркуриал и разбив на несколько файлов по отдельной модели в каждом (там моделей несколько, они зависят друг от друга и работать над ними лучше независимо).
Но вторая цель хранения истории - это генерить патчи для миграции данных, которые эта модель описывает, между версиями модели. Т.е. добавили в модель поле, пару таблиц, еще чего-нибудь навертели - нужно из этого сгенерировать аццкий SQL скрипт, который это все применит к уже работающей базе данных. А тут уже текстовых diff-ов мало.

Можно было бы сделать собственное хранение истории, благо описание самой модели хранится в ней самой и прикрутить к кодогенератору еще и генерацию триггеров аудита изменений особой проблемы нет. Но тогда будет дублирование функциональности меркуриала, причем каждое изменение будет в двух местах - в основных данных, и в логе изменений дописано в конец. Но другого разумного способа сопоставить историю типизированных данных и ее отражение в виде сhangeset-ов меркуриала я не вижу.
metaclass: (Default)
Наткнулся в F# на то, что для строки автоматически не делается upcast до объекта, если в описании функции для этого объекта не написать что это flexible type, т.е. вместо obj - #obj.
Flexible type параметр - это пометка, что функция принимает не только значения строго этого типа, а еще и значения с типами потомков. Соответственно, чтобы передавать любой объект в функцию, нужно писать #obj
Соответственно, если этого не написать, то единственный вариант вызова вместо "fun s" будет "fun (upcast s)". Тип оператор upcast автоматически инферится при компиляции.

Причем эта падла не дает этот flexible type использовать в декларациях типов, в спецификации написано что можно использовать только в member declarations.

Profile

metaclass: (Default)
metaclass

April 2017

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

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 7th, 2025 10:44 pm
Powered by Dreamwidth Studios