code.google.com Василиса это развитие идеи CGML, который из простого компактного сереализатора превратился в тул для связи данных из разных источников. К примеру у нас есть некий сравочник, который меняется редко и сложен по структуре, пользовательские данные, которые ссылаются на объекты из этого справочника и клиент-серверный протокол, который может ссылаться и на то и на другое. Сравочник в базе хранить смысла не имеет, передавать его на клиент по средством какого-то особого механизма тоже. Имеет смысл загружать этот справочник в память клиента и сервера, как блоб. Имеет смысл смысл хнанить пользовательские данные в БД. Вопрос: как все это дело связать в одное единое, хм.. пространство имен? Вот тут по и приходит на помощь Василиса. По сути это прострой язык для описания структур данных с поддержкой полиморфизма и множественного наследования. Из этого языка генерируются исходники для разных платформ. Исходники предствляют из себя модели (классы с геттерами и стеерами), структруры (классы с геетерами и конструкторами содеражщими параметры), и трейты (суть интерфейсы). Модели и структуры имеют методы выдачи и приемки данных. В случае с со структорой это функции приемки и выдачи полной информации, а с моделями еще приемка и отдача changeset. Эти методы принимают интерфейсы, реализация которых определят способ передачи или сохранения этих моделей/cтруктур (Worker). Worker'ы связываются в цепочки, что позволяет организовать связанность данных. Можно грабить корованы.
Раз уж пошла такая пьяна, и сегодня вечером изрыгаю текст, что в обычные дни для меня не характерно, напишу ка я про свой новый чудо-проект: Рассово Русскуй Православный Дата Фреймворк Василиса. // функция map определенная в классе Lambda, где Function<A, B> итерфейс с едиственным методом B apply(A v)
public static <A, B> List<B> map(List<A> l, Function<A, B> f) {
final List<B> r = new ArrayList<B>();
for (A e: l) r.add(f.apply(e));
return r;
}
Вот пример ее использования
Lambda.map(mylist, new Function<Integer, String>() {
@Override
public String apply(Integer v) {
return v.toString();
}
});
Вывод: функциональный подход хорош только в тех случаях, когда язык специально приспособлен для этого, на пример, как в Scala: mylist.map( x => x.toString ).
object makeLazy {
def apply(resolver) = new Lazy(resolver)
}
class Lazy [T] (private val resolver: Unit => T) {
lazy val t: T = resolver()
}
github.com Я уже кидал наверно ссылку. Круто, поддерживает зависимости из мавен, всякие автокомплиты, подсветка ошибок. Выглядит серьезнее чем то, что есть в идее или эклипсе.
Короче смотрите, какая тема.