У меня есть некоторый 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 методы предпочтительнее?