C ++ Factory с использованием lua - PullRequest
2 голосов
/ 12 марта 2011

У меня был скрипт с:

  • Пользовательский язык, используемый только для данных
  • Загружен с использованием класса Script из C ++
  • У меня были теги типа Type и т. Д.
  • Интерфейс для получения значения для тега - Script :: GetValue (Tag, T & value)

Сценарий использовался так:

Script* script("someFile");
script->GetValue("Type", type);
Object* obj = CreateObject(type);
obj->Load(script);

Где Load функции from object использовались для загрузки остальных параметров obj. Теперь я изменил язык сценария на lua. Мои вопросы:

Должен ли я сохранить этот способ создания объектов (используйте lua только для данных) или я должен выставить фабрику в lua и использовать ее из lua, что-то вроде этого (в lua):

CreateObject("someType")
SetProperty(someObj, someProperty, someValue)

Прежде всего я хочу знать, какой из них быстрее, первый или второй подход. У вас есть другие предложения? Поскольку я рефакторинг этой части, я открыт для других предложений. Я хочу сохранить lua, потому что это быстро, легко интегрируется и мало.

Ответы [ 3 ]

1 голос
/ 17 марта 2011

Вы можете разрешить вашей среде сценариев создавать объекты C ++ или нет, в зависимости от ваших потребностей. tolua ++ использует все метатабельные функции, позволяющие очень просто манипулировать вашими типами c ++ в lua.

Например, это объявление:


// tolua_begin
class SomeCppClass
{
public:
   SomeCppClass();
   ~SomeCppClass();

   int some_field;
   void some_method();
};
// tolua_end

Будет автоматически генерировать привязки lua, чтобы разрешить этот scua: l 1006 *


#!lua
-- obj1 must be deleted manually
local obj1 = SomeCppClass:new() 
-- obj1 will be automatically garbage collected 
local obj2 = SomeCppClass:new_local()

obj1.some_field = 3 -- direct access to "some_field"
obj2:some_method() -- direct call to "some_method"

obj1:delete()

Преимущество этого метода в том, что ваш код lua будет очень соответствовать основному коду C ++. Смотри http://www.codenix.com/~tolua/tolua++.html

0 голосов
/ 14 марта 2011

Первый подход, скорее всего, будет быстрее, но второй подход, вероятно, приведет к уменьшению кода инициализации объекта (при условии, что вы инициализируете много объектов).Если вы выберете первый подход, вы можете сделать это вручную.Если вы выберете второй подход, вы можете использовать библиотеку привязок, такую ​​как Luabind , чтобы избежать ошибок и ускорить время реализации, предполагая, что вы делаете это для нескольких типов объектов и типов данных.

Самый простой подход, вероятно, будет просто использовать Lua для данных;если вы хотите разоблачить фабрику и использовать ее через Lua, сначала убедитесь, что она того стоит.

0 голосов
/ 13 марта 2011

В подобных ситуациях я предпочитаю устанавливать связанную функцию C, которая принимает в качестве аргумента таблицу параметров.Итак, скрипт Lua будет выглядеть следующим образом:

CreateObject{
    Type = "someType"'
    someProperty = someValue,
    -- ...
}

Эта таблица будет на вершине стека в функции обратного вызова, и все параметры могут быть доступны по имени, используя lua_getfield .

Вы также можете захотеть исследовать изолированную среду вашего Lua .

...