Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Передать данные структуре объектов


Автор: _Y_ 8.6.2014, 10:28
Программа динамически строит структуру объектов принадлежащих к разным подклассам одного суперкласса. На картинке изображено дерево из кружочков-объектов, но это для простоты. Одни и те же структуры объектов могут параллельно входить в разные ветки: на картинке объекты, принадлежащие повторно используемой структуре залиты серым.

user posted image

В каждом классе прописан метод, скажем implement, получающий данные. Естественно, обрабатывающий их и возвращающий результат. Обработка ведется как собственным кодом, так и включенным в этот код вызовом методов implement агрегированных объектов. Данные поступают из программы вызовом метода implement на корневого объекта (красненького) и обрабатываются всем деревом. В общем - ничего необычного: все дерево это динамически формируемая функция обработки данных.

Теперь специфика. На левой картинке нижняя часть дерева залита эеленым. Это объекты работающие с данными. Черная верхушка только вызывает чужие методы implement и обрабатывает их результаты. Никаких проблем у меня с этим нет.

Правая картинка - расширенный вариант задачи. На вход (методу implement красненького объекта) подается не один набор данных, а несколько. Каждый должен обрабатываться в своей ветке дерева. Обработка разных наборов обозначена разными цветами. Как видите, в пределах одного обращения к дереву, один и тот же набор может обрабатываться в нескольких ветках и одна и та же структура объектов (серые) может обрабатывать разные данные. 

Перераспределения "обязанностей" не происходит. Т.е. еще при формировании дерева известно какая ветка какой набор данных будет обрабатывать.

Левое дерево - частный случай правого: массив передаваемых наборов данных состоит из одного элемента. Работает на ура. А вот с правым заморочки. Не получается у меня сообразить как красиво-элегантно передавать данные такой структуре. Ну или как ветка структуры должна определять какой набор данных использовать. С какой стороны ни подойду - сплошные костыли расти начинают.

Посоветуйте 



Автор: Pavia 8.6.2014, 11:24
1. Передавать все данные всем. К примеру спуская по дереву.
2. Вызывать всех поочерёдно и они выбирают нужные данные из очереди сообщений или массива данных.
3. Оптимизация 2. Нижнее обработчики при формировании дерева сообщают верхним какие данные они обрабатывают, т.е регистрируют тип данных с которым они работают. При поступлении данных верхний элемент проверяет на соответствие тип данных зарегистрированным и спускает вниз только те которые зарегистрированы. 

С учётом что у вас половина серых точек т.е  которые работают с разными данными, то наверно не стоит заниматься оптимизацией и спускать все данные вниз по дереву. И если будет не хватать скорости, то оптимизировать некоторые ветки отфильтровывая(отбрасывая) не нужные данные. Конечно это напоминает костыли, но ихмо это нормально для ООП.

Автор: _Y_ 8.6.2014, 11:34
Pavia,
1. Все данные всем это именно то, что я и делаю.
2. А вот с тем, чтобы объекты выбирали нужные им данные и проблема. Закрашенные серым структуры это один и тот же набор объетков, ссылка на который имеется в разных ветках дерева. В результате в одном случае этот набор объектов должен обработать один набор данных, а в другом - другой.
3. Без оптимизации, думаю, можно обойтись на начальном этапе.

Автор: Pavia 8.6.2014, 12:04
_Y_
Цитата(_Y_ @  8.6.2014,  11:34 Найти цитируемый пост)
А вот с тем, чтобы объекты выбирали нужные им данные и проблема. 

А в чём проблема? Объекты не знают какие данные их какие нет? Тогда кто это определяет?

Автор: _Y_ 8.6.2014, 12:29
Pavia, можно сделать так, чтобы объекты знали какие данные их, а какие нет. Но, есть объекты, обрабатывающие разные данные в зависимости от того, в какой ветке дерева эти объекты сидят (зеленые структуры на правой картинке). Фактически, объект может знать какие данные НЕ его, но не знает какой какой из СВОИХ наборов данных обрабатывать при данном обращении.

Подумал я еще чуть над пунктом 3 Вашего предидущего поста. Вот такое решение должно работать и не будет очень уж костыльным.

Создается еще один подкласс того же типа. Объект этого подкласса не будет выполнять каких-то практических действий с данными, но будет знать какой (единственный) из наборов данных, поступивших сверху, передавать вниз. При формировании дерева, в дерево вставляются объекты этого подкласса, инициализированные указанием пропускаемого набора данных (в данном "картиночном" случае знающие "цвет" нужного набора). На картинке такие "фильтраторы" показаны прямоугольниками.

user posted image
Попробую сделать так. Получится - помечу вопрос как решенный. Но буду рад и советам с  решениями элегантнее этого. Спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)