Russian Qt Forum
Ноябрь 25, 2024, 20:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Расширение данных  (Прочитано 16344 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Август 03, 2017, 11:56 »

Добрый день

Объект имеет обширный набор "параметров" организованных в виде дерева. Доступ к параметру осуществляется по уникальному ключу (ID), напр (псевдокод)
Код
C++ (Qt)
const int DIFFUSE_ID = 2070;
...
Param * param = object->GetParam(DIFFUSE_ID);
Сам нод дерева (param) нужен редко, зато очень часто его значение, напр
Код
C++ (Qt)
double value = object->GetParamValue(DIFFUSE_ID, currentTime);
Таких вызовов тысячи. Все работает, все хорошо. Но вот понадобилось дерево сделать динамическим, т.е. узлы могут добавляться и удаляться. С точки зрения дерева это выглядит так
Цитировать
...
  MATERIAL_ID     // Нод "материал" (все как сейчас)
    DIFFUSE_ID
    LUMA_ID
    ....
  MATERIAL_ID2     //  Еще один нод "материал" (теперь их может быть много)
    DIFFUSE_ID
    LUMA_ID
...
Как лучше всего адаптировать имеющийся (не маленький) код к этому изменению?

Спасибо
« Последнее редактирование: Август 03, 2017, 11:57 от Igors » Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #1 : Август 03, 2017, 13:37 »

не совсем понятно что меняется при удалении и добавлении узла
ведь есть указатель на объект и по нему получить можно параметр
чтото еще изменилось ?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Август 04, 2017, 09:44 »

не совсем понятно что меняется при удалении и добавлении узла
ведь есть указатель на объект и по нему получить можно параметр
чтото еще изменилось ?
Ткперь DIFFUSE_ID уже не является однозначным ключом. Напр Что должен делать объект чтобы получить значение не из первого а из второго узла "материал"?
Записан
Bepec
Гость
« Ответ #3 : Август 04, 2017, 19:25 »

Ну, или добавить ещё 1 параметр как "родителя", или сделать привязку к текущему узлу.

Как я вижу без изменения основных вызовов( добавляется только установка текущего параметра)
Код:
const int MATERIAL_ID = 2070;
...
// получаем DIFFUSE_ID из MATERIAL_ID
object->setCurrentParam(MATERIAL_ID);
double value1 = object->GetParamValue(DIFFUSE_ID, currentTime);

// получаем DIFFUSE_ID из MATERIAL_ID1
object->setCurrentParam(MATERIAL_ID1);
double value2 = object->GetParamValue(DIFFUSE_ID, currentTime);

Или же вариант с добавлением параметра
Код:
const int MATERIAL_ID = 2070;
...
// получаем DIFFUSE_ID из MATERIAL_ID
double value1 = object->GetParamValue(MATERIAL_ID, DIFFUSE_ID, currentTime);

// получаем DIFFUSE_ID из MATERIAL_ID1
double value2 = object->GetParamValue(MATERIAL_ID1, DIFFUSE_ID, currentTime);

Ну ещё можно зафигачить GetParamValue со значением по умолчанию для поддержки старого кода. Т.е. до первого найденного параметра DiffuseId

PS других вариантов, без масштабных изменений не вижу.
« Последнее редактирование: Август 04, 2017, 19:29 от Bepec » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Август 05, 2017, 10:57 »

Число параметров нода "материал" - где-то от 100 до 200 (точно не мерял). Число вызовов этих параметров - тысячи. При этом механизм GetParamValue используется повсеместно, не только для материала.

"Адаптация" вовсе не означает "менять как можно меньше", да, хотелрсь бы, но др соображения могут быть более важны. Напр здесь главное - обеспечить надежность вызовов, нужно сделать так чтобы старое GetParamValue выдавало ошибку компиляции при обращении к параметру материала (но продолжало работать для другого). Да, я получу тонны ошибок и буду править возможно неск дней - вот поэтому и надо очень тщательно продумать на что менять.
Код:
object->setCurrentParam(MATERIAL_ID);
double value1 = object->GetParamValue(DIFFUSE_ID, currentTime);
Нет той самой надежности

Код:
// получаем DIFFUSE_ID из MATERIAL_ID1
double value2 = object->GetParamValue(MATERIAL_ID1, DIFFUSE_ID, currentTime);
Не пресекается старый вызов. И кто ответит за MATERIAL_ID1? Это уже не константа

 
Записан
Bepec
Гость
« Ответ #5 : Август 06, 2017, 12:38 »

Если, как вы говорите, констант больше нет - надо всё переписывать.

Ну потому что кирпичей нет, а из треугольников домик не построишь.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Август 07, 2017, 07:05 »

Если, как вы говорите, констант больше нет - надо всё переписывать.
Понятно что надо, вопрос каким образом. На что менять существующие вызовы?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Август 07, 2017, 11:38 »

Я пока вижу такую схемку

1) Переименовать все константы нода "материал", напр X_DIFFUSE_ID вместо DIFFUSE_ID, это вызовет массовые ошибки компилятора, ну и хорошо

2) Править ошибки заменяя
Код
C++ (Qt)
double value = object->GetParamValue(DIFFUSE_ID, currentTime);
На
Код
C++ (Qt)
double value = object->GetMaterialValue(materialIndex, X_DIFFUSE_ID, currentTime);
Ну и по месту откуда-то брать тот materialIndex. В самом объекте мапы
Код
C++ (Qt)
double CObject::GetMaterialValue( uint materialIndex, uint  paramIndex, double currentTime )
{
 Q_ASSERT(materialIndex < m_MaterialMaps.size());
 int ID = m_MaterialMaps[materialIndex].value(paramIndex); // получаем реальное уникальное ID
 Q_ASSRERT(ID);
 return GetParamValue(id, currentTime);
}
При создании/удалении материалов парить m_MaterialMaps их владельцев. Критикуем, пинаем

Да, и неужели нет такого паттерна?  Улыбающийся
Записан
Bepec
Гость
« Ответ #8 : Август 07, 2017, 13:14 »

Паттерны это дерево. Вы счас к нему всё и сводите.
А переделка с одного паттерна на другой к паттернам не относится Улыбающийся

PS у вас нечего критиковать, вы привели мой второй вариант Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Август 07, 2017, 13:56 »

Паттерны это дерево.
Думал, может человек повзрослел (после длительного отсутствия). Какое там - все та же трещетка, абы чего написать, авось что-то да в масть. Идите отсюда, вертихвост эдакий  Плачущий
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #10 : Август 07, 2017, 14:20 »

Думал, может человек повзрослел (после длительного отсутствия). Какое там - все та же трещетка, абы чего написать, авось что-то да в масть. Идите отсюда, вертихвост эдакий  Плачущий

О_о
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #11 : Август 07, 2017, 14:41 »

а если сделать ключи в виде "пути"?

objectPtr->GetParamValue("MATERIAL_ID2/DIFFUSE_ID");
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Bepec
Гость
« Ответ #12 : Август 07, 2017, 19:08 »

Так это будут те же ключи Веселый
И проблему igors с тем, что ему переписывать всё придётся не исправят Веселый

to Igors я тебя тоже, !адекват, люблю Веселый
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Август 08, 2017, 10:28 »

а если сделать ключи в виде "пути"?

objectPtr->GetParamValue("MATERIAL_ID2/DIFFUSE_ID");
Проблема та же - где взять MATERIAL_ID2? (в смысле чему оно соответствует) Только здесь еще отягощенная строками.

Владелец - конечно объект. Юзер указывает что желает еще материал, может еще и еще (хотя и редко). Ну накидать их всех в дерево - дело несложной техники, имеющиеся структуры данных это позволяют. Но как их затем удобно использовать?
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #14 : Август 10, 2017, 10:57 »

Проблема та же - где взять MATERIAL_ID2? (в смысле чему оно соответствует)

А это называется "контрактом" между тем, кто спрашивает (он то знает, что ему надо) и тем, кого спрашивают. Обе стороны должны понимать, что это такое:

const QByteArray MATERIAL_ID2 = "Material2";

(например)
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.137 секунд. Запросов: 23.