среда, 11 августа 2010 г.

После отсутствия.

Всегда хочется писать что-то монументальное, но это к сожалению не всегда получается. Я тут все ждал и ждал, когда появится интересная тема, что бы написать большую пребольшую статью, но тема так и не появилась. Что бы блог не простаивал без дела, попробую писать сюда про всякие рабочие моменты, сообщения про которые не умещаются в твиттере.

Для работы в своих проектах мы используем разнообразные предметно-ориентированные языки. Один из них служит для описания структур данных (будем называть его SL). Структуры описанные на нем используются для клиент-серверного обмена. Иметь промежуточный язык очень удобно, когда клиентская и серверная части написаны на разных платформах и языках (к примеру Flash и <подставьте сюда то, что вам больше нравится>). Многие в этом случае пишут свой код дважды. В нашем случае транслятор SL подготавливает структуры данных и методы сереализации под все используемые в проекте платформы.

В OCaml есть такая интересная штука, как Variants. В Scala подобную роль выполняют Case Classes. Поддержка такой языковой конструкции есть и в SL. К сожалению почти во всех императивных языках ее поддержки нет, что создает сложности для трансляции кода из SL в эти языки. На пример для AS3 нет способа реализовать подобное типобезопасно. Недавно понадобилось сделать кодогенерцию SL в Java.

// SL
variant game-resource
float money
float energy

// Генерированный код.
public class PGameResource {

public interface Matcher {
void energy(float value);
void money(float value);
}

private Object __storage;
private byte __variance;

public void match(Matcher matcher) {
switch (__variance) {
case 0:
matcher.energy((Float) __storage);
break;
case 1:
matcher.money((Float) __storage);
break;
}
}

public void set_energy(float value) {
__variance = 0;
__storage = value;
}
public void set_money(float value) {
__variance = 1;
__storage = value;
}

// ...
}


// Разбор
value.match(new PGameResource.Matcher() {
public void money(float value) {
quest.reward.add(new AddResourceAction<Quest>(
FunholeResourceKind.MONEY,
value));
}
public void energy(float value) {
quest.reward.add(new AddResourceAction<Quest>(
FunholeResourceKind.ENERGY,
value));
}
});

Вообще я не слишком искушен в Java, так что если среди читателей есть Java-программисты, то было бы здорово выслушать их мнения.

3 коммент.:

  1. Чета я вообще не понимаю что и зачем ты делаешь и какая из всего этого мораль.

    ОтветитьУдалить
  2. > Чета я вообще не понимаю что и зачем ты делаешь и какая из всего этого мораль.

    Я же выше объяснил, что за синтаксическая конструкция. Она очень удобна и применяется у нас повсеместно.

    ОтветитьУдалить
  3. Лех, завязывай, пошли пить пиво!

    ОтветитьУдалить