Генерация классов

Последовал совету Hyborg и написал генератор классов из xml в cpp с помощью xslt.

Впринципе xslt оказался достаточно простым для человека который ни разу с ним не работал.

пример xml  описания

результирующий файл

сам конвертер

Приветствуются мысли о том, как можно это сделать проще 🙂


4 Responses to Генерация классов

  1. как с тобой связаться? есть предложение!

  2. Avatar Hyborg
    Hyborg says:

    С помощью XSLT как-то не наглядно получается, но дело вкуса. Просто, потом редактировать 1000-2000 строк xslt как-то пакостно 🙂

    И ещё, у тебя получается одноразовая генерация класса? При повторной генерации пользовательский код перетирается? Или в C++ есть Partical классы как в .NET?

    Есть идея использовать классы-хранилища-загрузчики для переменных отдельных классов. Без всякого наследования между ними. Пусть классы-пользователи решают проблему доступа к данным.

    Вот пример (я сижу на VB, сильно не плюйся :))

    XML ———————

    CPP ——————-

    public abstract class Object
    {
    public virtual bool LoadValues(string storageName, string storagePrefix, string sceneName, string objectName)
    {
    DataStorage* theDataStorage = DataStorage::Open(storageName);
    return LoadValues(theDataStorage, storagePrefix, sceneName, objectName);
    }

    public abstract bool LoadValues(DataStorage* storage, string storagePrefix, string sceneName, string objectName);
    }

    public class FPSCounter : public Numeric
    {
    private FPSCounterValues* theValues;

    public virtual bool LoadValues(DataStorage* storage, string storagePrefix, string sceneName, string objectName)
    {
    if (!Numeric::LoadValues(storage, storagePrefix, sceneName, objectName))
    return false;
    return theValues->LoadValues(storage, storagePrefix, sceneName, objectName);
    }

    public void DoSomething()
    {
    SetFont(FPSCounterValues->Font);
    }
    }

    public class BaseValues : public Object
    {
    //…
    }

    // Этот класс создаёт генератор
    public class FPSCounterValues : public BaseValues
    {
    private const string FontDefault = «MainFont»;
    private const int FontSizeDefault = 24;
    private const float XBaseDefault = 0.0;

    public string Font;
    public string Text;
    public int FontSize;
    public float XBase;

    public void FPSCounterValues() : BaseValues()
    {
    Font = FontDefault;
    FontSize = FontSizeDefault;
    XBase = XBaseDefault;
    }

    public virtual bool LoadValues(storage, string storagePrefix, string sceneName, string objectName)
    {
    try
    {
    Font = storage->GetStringValue(storage_prefix + «font», FontDefault);
    FontSize = storage->GetIntValue(storage_prefix + «font_size», FontSizeDefault);
    XBase = storage->GetFloatValue(storage_prefix + «x_base», XBaseDefault);
    return true;
    }
    catch(…)
    {
    // Do something…
    }
    return false;
    }
    }

  3. Avatar Hyborg
    Hyborg says:

    А что это блог теги не не понимает, и xml зарезал?

    <?xml version="1.0"?>
    <class name="FPSCounterValues">
    <property name="Text" type="String"/>
    <property name="Font" type="String" default="MainFont" loadable="true"/>
    <property name="FontSize" type="int" default="24" loadable="true"/>
    <property name="XBase" type="float" default="0.0" loadable="true"/>
    </class>

  4. Avatar admin
    admin says:

    Предполагается далее унаследоваться от этого класса и уже там писать пользовательский код. Этот класс — просто хранилище и он не знает что это за данные и как с ними работать