Я модернизируя конструкцию, где данные были слегка в сочетание с пользовательским интерфейсом:эффективно проходит уведомление между развязанным дизайном слоями
class Object {
UI * ui;
};
class UI {
Object * object;
};
Это было достаточно просто нажать уведомления об обновлениях к пользовательскому интерфейсу через указатель пользовательского интерфейса, но новые требования для того, чтобы данные были полностью отделены от пользовательского интерфейса, а также для разных объектов, чтобы иметь несколько различных представлений пользовательского интерфейса, поэтому один указатель на пользовательский интерфейс больше не делает этого и не может быть частью уровня данных.
Невозможно использовать что-то вроде QObject
и сигналы из-за его накладных расходов из-за высокого количества объектов (в диапазоне от сотен миллионов) и QObject
в несколько раз больше, чем самый большой объект в иерархии. Для части пользовательского интерфейса это не имеет большого значения, поскольку только часть объектов видна за раз.
Я реализовал реестр UI, который использует многошаговую систему для хранения всех пользовательских интерфейсов, используя Object *
в качестве ключа, чтобы иметь возможность получать пользовательский интерфейс (ы) для данного объекта и отправлять уведомления, но поиск и регистрация и отмена регистрации пользовательских интерфейсов представляет значительные накладные расходы, учитывая высокий показатель объекта.
Так что мне было интересно, есть ли какой-либо шаблон дизайна для отправки уведомлений между развязанными слоями с меньшими накладными расходами?
Прояснение: большинство изменений выполняется на стороне пользовательского интерфейса, элементы пользовательского интерфейса содержат указатель на связанный объект, так что это не проблема. Но некоторые изменения, внесенные в некоторые объекты со стороны интерфейса, приводят к изменениям, которые происходят в связанных объектах в слое данных, которые невозможно предсказать, чтобы запросить обновление пользовательских интерфейсов объекта. Фактически одно изменение пользовательского интерфейса, сделанного для одного объекта, может привести к каскаду изменений для других объектов, поэтому мне нужно иметь возможность уведомлять их возможные представления пользовательского интерфейса для обновления, чтобы отразить эти изменения.
@FabioCeconello - нет, это идея, 'Object' не должно быть связано с UI на всех.Создание пользовательских интерфейсов происходит только на стороне пользовательского интерфейса, по умолчанию создается только пользовательский интерфейс для корневого объекта, и оттуда пользователь может развернуть и свернуть разные ветви. – dtech
Похоже, что фактическая проблема связана с эффективностью регистрации/отмены регистрации UI * производительности *, а не с фактическим дизайном. Вы могли бы ускорить процесс, сохранив массив или коллекцию элементов пользовательского интерфейса, которые соответствуют объекту модели (может быть применим * составной шаблон *), но он может не полностью удовлетворить требование, которое объекты не должны знать об их интерфейсе. – dasblinkenlight
@ dasblinkenlight - это моя дилемма. Пытаясь понять, как и торт, и съесть его тоже. Наличие массива пользовательских интерфейсов для каждого объекта звучит как прямое решение, но оно загрязняет объектную модель и вводит еще больший объем памяти - массив имеет не только указатель, но и размер и емкость. 12 дополнительных байтов на объект без какого-либо пользовательского интерфейса составляют 1 гигабайт памяти в типичном сценарии объекта размером 100 мил на 32-битной платформе, уже 1/3 адресной памяти. Я бы скорее сохранил данные пользовательского интерфейса только для объектов, которые на самом деле имеют его. – dtech