25
Сен

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

   Posted by: admin   in MagicEngine, Новости

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

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

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

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

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

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

Tags:

This entry was posted on Четверг, Сентябрь 25th, 2008 at 10:22 and is filed under MagicEngine, Новости. You can follow any responses to this entry through the RSS 2.0 feed. Both comments and pings are currently closed.

4 comments so far

 1 

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

Сентябрь 25th, 2008 at 15:33
Hyborg
 2 

С помощью 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;
}
}

Сентябрь 25th, 2008 at 21:21
Hyborg
 3 

А что это блог теги не не понимает, и 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>

Сентябрь 25th, 2008 at 21:25
admin
 4 

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

Сентябрь 25th, 2008 at 23:07