Немного о проблеме, которую я хочу решить этими "версиями". Вот пример из геймдева: у нас есть работающая онлайн-игра и 100500 (на самом деле это очень мало) персонажей у которых есть два инвентаря. Внезапно оказывается, что второй инвентарь не нужен. Что мы делаем? Пишем скрипт, который переместит содержимое второго инвентаря в первый, останавливаем все, пускаем скрипт, меняем модель. Трудоемкость, время простоя, шанс допустить ошибку высоки, по этому обычно все оставляют, как есть, на уровне логиги вставляется какой-ниубудь костыль. Чем дольше проект живет, чем труднее будет вностить такие изменения. Можно конено уповать на "правильную, гибкую архитектуру", но мы то знаем.
Собственно что такое версии в Василисе? Это блок кода с номером в который оборачивается содержимое модели для этой версии. Для каждой версии дожна быть определеа функция-конвертор из предыдущей версии (за этим следит Василиса). После генерации кода для записи будет доступна только последняя версия, но предыдущие можно будет прочесть и актуализировать автомотическом режиме. Удобно.
Функции-конверторы будут писаться на хитром статически-типизированном лиспе, который будет попадать в рузультирующий код, как есть, в виде строки, и итерпретироваться.
model Person<WorldType> extends Actor {
trait BodyPart {
weight of int
}
trait Face {
beauty of float
}
struct Leg extends BodyPart {
length of float
}
struct Eye extends BodyPart include Face {
vigilance of float
}
name of string
age of int
legs of list<Leg>
face of set<face>
}
code.google.com Василиса это развитие идеи CGML, который из простого компактного сереализатора превратился в тул для связи данных из разных источников. К примеру у нас есть некий сравочник, который меняется редко и сложен по структуре, пользовательские данные, которые ссылаются на объекты из этого справочника и клиент-серверный протокол, который может ссылаться и на то и на другое. Сравочник в базе хранить смысла не имеет, передавать его на клиент по средством какого-то особого механизма тоже. Имеет смысл загружать этот справочник в память клиента и сервера, как блоб. Имеет смысл смысл хнанить пользовательские данные в БД. Вопрос: как все это дело связать в одное единое, хм.. пространство имен? Вот тут по и приходит на помощь Василиса. По сути это прострой язык для описания структур данных с поддержкой полиморфизма и множественного наследования. Из этого языка генерируются исходники для разных платформ. Исходники предствляют из себя модели (классы с геттерами и стеерами), структруры (классы с геетерами и конструкторами содеражщими параметры), и трейты (суть интерфейсы). Модели и структуры имеют методы выдачи и приемки данных. В случае с со структорой это функции приемки и выдачи полной информации, а с моделями еще приемка и отдача changeset. Эти методы принимают интерфейсы, реализация которых определят способ передачи или сохранения этих моделей/cтруктур (Worker). Worker'ы связываются в цепочки, что позволяет организовать связанность данных. Можно грабить корованы.
Раз уж пошла такая пьяна, и сегодня вечером изрыгаю текст, что в обычные дни для меня не характерно, напишу ка я про свой новый чудо-проект: Рассово Русскуй Православный Дата Фреймворк Василиса.