Как лучше создавать объект обертку (без методов) в NodeJS C++ модуле?

У меня есть некоторый C++ класс, точнее v8::CpuProfileNode, и в данный момент я занимаюсь рефакторингом проекта v8-profiler доставшегося мне по наследству.

Текущая реализация обертки объявляет каждое свойство как get property, и описывает соответствующий get метод:

Persistent<ObjectTemplate> ProfileNode::node_template_;

void ProfileNode::Initialize() {
  node_template_ = Persistent<ObjectTemplate>::New(ObjectTemplate::New());
  node_template_->SetInternalFieldCount(1);
  node_template_->SetAccessor(String::New("functionName"), ProfileNode::GetFunctionName);
  ...
}

Handle<Value> ProfileNode::GetFunctionName(Local<String> property, const AccessorInfo& info) {
  HandleScope scope;
  Local<Object> self = info.Holder();
  void* ptr = self->GetPointerFromInternalField(0);
  Handle<String> fname = static_cast<CpuProfileNode*>(ptr)->GetFunctionName();
  return scope.Close(fname);
}

...

Handle<Value> ProfileNode::New(const CpuProfileNode* node) {
  HandleScope scope;
  
  if (node_template_.IsEmpty()) {
    ProfileNode::Initialize();
  }
  
  Local<Object> obj = node_template_->NewInstance();
  obj->SetPointerInInternalField(0, const_cast<CpuProfileNode*>(node));
  return scope.Close(obj);
}


В итоге если описать так каждое свойство, это становится монструозным.

Я хочу просто создавать объект со свойствами:

//Persistent<ObjectTemplate> ProfileNode::node_template_;

//delete Initialize method
//delete GetFunctionName method

Handle<Value> ProfileNode::New(const CpuProfileNode* node) {
  HandleScope scope;
  
  Local<Object> obj = Object::New();
  obj->Set(String::New("functionName"), node->GetFunctionName());
  ...
  //Указатель не нужен - методов не будет
  //obj->SetPointerInInternalField(0, const_cast<CpuProfileNode*>(node));
  return scope.Close(obj);
}


Как видите, это намного короче, а результат вроде бы тот же. Является ли нижний пример обременительным по памяти или производительности?
Имею ли я право писать подобную реализацию или get методы предпочтительнее?
  • Вопрос задан
  • 2727 просмотров
Решения вопроса 1
icelaba
@icelaba
Знаю и умею всё
Если вам геттеры сеттеры не нужны - то подход сразу определить значение свойства
самый что ни на есть нормальный,
Чтобы код выглядел поприятней рекомендую сразу использовать
библиотеку v8-convert (a.k.a. cvv8) https://code.google.com/p/v8-juice/wiki/V8Convert
примеры:
https://code.google.com/p/v8-juice/wiki/ConvertingTypes
Я с ужасом вспоминаю как выглядел код без CastToJS и CastFromJS функционала
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы