Форум программистов, компьютерный форум, киберфорум
ООП и паттерны
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,936
Записей в блоге: 2

Еще архитектура взаимодействия

26.04.2017, 12:06. Показов 1206. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте

Навеяно соседней темой. Вот сейчас пишу UI (унылая рутинная работа), и засомневался верно ли делаю Принципиальные классы

CObject - объект подлежащий OpenGL рисованию (потенциально большой). Имеет имя
CWindow - окно в котором рисуются объекты CObject и есть их список (listBox). Может быть до 10 окон (наследников)
CDrawer - машина рисования (член окна) которая рулит OpenGL рисованием

Задачка смешная - если юзер выбрал объект в списке - сказать машине что он должен рисоваться подсвеченным/выбранным. Как лучше реализовать эту связь?

С уважением
Игорь
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.04.2017, 12:06
Ответы с готовыми решениями:

Архитектура взаимодействия UI компонентов
Hello world! Имеем WYSIWYG редактор, его UI разбит на виджеты. Предположим что анализ выявил следующие типы виджетов: Список ресурсов,...

Архитектура взаимодействия приложения C++ и БД веб-сайта
Коллеги, прошу помочь мне с архитектурой программного решения. Имеется следующая задача: Есть некоторый сайт с базой данных. По...

Архитектура для сетевого взаимодействия в приложении
Всем новогодний привет!)) Хотел бы поинтересоваться, как кто предпочитает организовывать у себя в проектах взаимодействие с server...

10
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,936
Записей в блоге: 2
28.04.2017, 12:00  [ТС]
Возможно товарищи подумали что это несерьезно, слишком уж простая задачка. Но тут есть что "копнуть".

Самое простое - хранить какие объекты выбраны еще и в машине CDrawer, напр так
C++
1
2
3
4
5
class CDrawer {
 ..
 std::set<const CObject *> mSelectedObjects;
 ..
};
Ну и CWindow заряжает эти данные в машину при выборе в листбоксе. Я реализовал это иначе, но разница не принципиальна - все равно "машина хранит".

Но ведь это дублирование данных и синхронизация 2 копий, что вообще-то не есть хорошо. Не лучше ли чтобы машина обращалась к какому-то интерфейсу с запросом "а выбран ли этот объект?" Но я не вижу простого и удобного способа это сделать. Ну не городить же так
C++
1
2
3
4
class CWindow : ..., public CSelectServer {
..
 virtual bool IsObjectSelected( const CObject * ) const;
..
Ну как-то явно развесисто/избыточно/неадекватно. И, хотя здесь это не имеет значения, производительность явно хужее - рисований обычно куда больше чем смен selection

Оно конечно понятно что такую задачку можно делать как угодно, да и KISS принцип к месту, но все же..
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
28.04.2017, 12:49
Igor3D, из вопроса непонятно как связаны представленные классы. Отсюда противоречия. Например:
Цитата Сообщение от Igor3D Посмотреть сообщение
CWindow - окно в котором рисуются объекты CObject и есть их список (listBox). Может быть до 10 окон (наследников)
Кому принадлежит listBox?
значит ли << Может быть до 10 окон (наследников)>> что в каждом дублируется данный список? Значит ли это так же, что каждое окно наследника имеет указатель на свой экземпляр CDrawer ? И вообще, - "наследники" это порождёнеые родителем (дочерние) или полиморфные наследники?
Или CDrawer это наподобие синглетона, который может работать лишь с одним окном единовременно?
Поэтому то что я скажу может не иметь отношения к действительности.
Можно бы в каждом окне иметь указатель на машину и объект рисования. Метод draw окна получает оба указателя + то что нужно методу draw машины и передаёт ей то что нужно. Главное окно управляет инициализацией и установкой этой пары для своих потомков. Если это целесообразно. То есть, если характеристики (ресурсы) потомка сильно зависят от объекта рисования, то может оказаться лучше удалить старое и создать новое.
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,936
Записей в блоге: 2
28.04.2017, 14:13  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
Кому принадлежит listBox?
Окну (CWindow)
Цитата Сообщение от IGPIGP Посмотреть сообщение
значит ли << Может быть до 10 окон (наследников)>> что в каждом дублируется данный список? Значит ли это так же, что каждое окно наследника имеет указатель на свой экземпляр CDrawer ? И вообще, - "наследники" это порождёнеые родителем (дочерние) или полиморфные наследники?
Да, каждое окно наследника имеет указатель на свой экземпляр CDrawer (или его наследника), который хранит список (указателей) на рисуемые объекты CObject, для каждого окна этот список свой.

Цитата Сообщение от IGPIGP Посмотреть сообщение
Можно бы в каждом окне иметь указатель на машину и объект рисования. Метод draw окна получает оба указателя + то что нужно методу draw машины и передаёт ей то что нужно. Главное окно управляет инициализацией и установкой этой пары для своих потомков.
Ну по существу так и сделано. Кстати я только сейчас увидел еще один вариант - просто подавать selection машине на каждом draw Правда это не очень последовательно - список рисуемых CObject храним в CDrawer, а selection подаем - тогда уж все подавать, т.е. CDrawer ничего не хранит, а только рисует то что подало CWindow. Не думал об этом
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
28.04.2017, 14:17
Цитата Сообщение от Igor3D Посмотреть сообщение
т.е. CDrawer ничего не хранит, а только рисует то что подало CWindow
Это я и имел ввиду. Каждому должно быть известно минимум того, что обеспечивает верное поведение. Иначе придётся везде update'ить при изменении информации.
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,936
Записей в блоге: 2
28.04.2017, 14:59  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
Это я и имел ввиду. Каждому должно быть известно минимум того, что обеспечивает верное поведение. Иначе придётся везде update'ить при изменении информации.
Согласен, резонно. Но давайте немного прикинем. Напр CDrawer должен просчитать суммарный bounding box для всех рисуемых объектов. Делать это на каждом draw накладно. Да и просчитанный bоx явно должен храниться в CDrawer, это чисто дела рисования. Тогда выходит что список рисуемых (который меняется достаточно редко) CDrawer хранить должен
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
28.04.2017, 15:09
Цитата Сообщение от Igor3D Посмотреть сообщение
. Тогда выходит что список рисуемых (который меняется достаточно редко) CDrawer хранить должен
то есть CDrawer рисует несколько объектов одновременно? Тогда помимо списка ещё должна быть инфа о их взаимном размещении на области отрисовки. То есть объекты это части/элементы объекта рисования на самом деле. Я уже запутался. Но как бы там ни было, - тогда этот список и есть объект владения CDrawer. Это значит что CDrawer рисует списки. А то что он это делает по частям это уже его и его окна дело. Впрочем, если кто-то из-вне (главное окно видимо) может добавлять/удалять объекты из списка дочернего, то видимо это имело бы смысл делать методом дочернего окна. Старший передаёт младшему и предлагает добавить/удалить.
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,936
Записей в блоге: 2
28.04.2017, 16:05  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
то есть CDrawer рисует несколько объектов одновременно? Тогда помимо списка ещё должна быть инфа о их взаимном размещении на области отрисовки. То есть объекты это части/элементы объекта рисования на самом деле. Я уже запутался.
Никакого одновременного (в смысле "параллельного") рисования нет, объекты рисуются один за другим. Для рисования нужен не только сам объект но и его матрица трансформации (так решается взаимное размещение). Для каждого объекта матрица вычисляется окном и сохраняется в CDrawer. Возразить против этого трудно, разные окна вычисляют разные матрицы, стало быть членом CObject матрица быть не может. Где ее хранить? Думается однозначно - в CDrawer. Таким образом сделать его "чистым рисовальшиком" (который ничего не хранит а все получает) явно не удается

Однако вернемся к selection. Тут можно продолжать в том же духе - сплавлять все в CDrawer для хранения. Или что-то изобретать?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
28.04.2017, 23:41
Цитата Сообщение от Igor3D Посмотреть сообщение
Никакого одновременного (в смысле "параллельного") рисования нет, объекты рисуются один за другим.
Я и не имел ввиду много-поточности, а хотел сказать о том что картинка состоит из изображений объектов как элементов.
Цитата Сообщение от Igor3D Посмотреть сообщение
Для каждого объекта матрица вычисляется окном и сохраняется в CDrawer.
То есть для каждого объекта в списке она своя? Если так и списком владеет окно, то может в окне хранить и список матриц? Конечно, было бы удобно в самом объекте иметь указатель на матрицу, чтобы не создавать второй список сопряженный с первым. А окно отвечает за инициализацию и освобождение. Вообще, всё это вещи связанные с логикой вычислительного процесса специфичной для данной задачи. Поскольку я плохо её себе представляю, то сказать что-то конкретное вряд ли сумею.

Добавлено через 4 часа 49 минут
Igor3D, простите, но перечитав тему я не понял о чём я писал. То есть:
Цитата Сообщение от Igor3D Посмотреть сообщение
Задачка смешная - если юзер выбрал объект в списке - сказать машине что он должен рисоваться подсвеченным/выбранным.
если listbox и CDrawer члены окна, то в чём загвоздка? При выборе item в listbox возникает событие. Соответственно, поскольку каждый item - имя объекта для рисования, то логично, что каждый item порождает событие в котором можно обратиться к объекту отраженному по имени. В нём же (в событии) можно вызвать функцию отрисовки (в изменённом режиме) на объекте CDrawer через его указатель. Или я опять не понимаю?
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,936
Записей в блоге: 2
29.04.2017, 06:53  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
То есть для каждого объекта в списке она своя? Если так и списком владеет окно, то может в окне хранить и список матриц?
Окно уже имеет указатель на CDrawer. Теперь мы заводим в окне еще какие-то данные (напр матрицы) которые целиком и полностью используются тем же CDrawer'ом. Зачем? Сделать CDrawer образцово-показательным классом спихнув всю черновую работу в окно?

Цитата Сообщение от IGPIGP Посмотреть сообщение
если listbox и CDrawer члены окна, то в чём загвоздка? При выборе item в listbox возникает событие. Соответственно, поскольку каждый item - имя объекта для рисования, то логично, что каждый item порождает событие в котором можно обратиться к объекту отраженному по имени. В нём же (в событии) можно вызвать функцию отрисовки (в изменённом режиме) на объекте CDrawer через его указатель. Или я опять не понимаю?
Все так и есть, вопрос был как обеспечить selection для рисования. Заметим что при смене выбора в listBox мы не рисуем немедленно, а только говорим ОС что часть окна с объектами нуждается в перерисовке. В ответ ОС пошлет событие рисования, там уже непосредственно рисуем.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
29.04.2017, 10:33
Цитата Сообщение от Igor3D Посмотреть сообщение
Зачем? Сделать CDrawer образцово-показательным классом спихнув всю черновую работу в окно?
Хех... По порядку:
Цитата Сообщение от Igor3D Посмотреть сообщение
Зачем?
этоя и пишу говоря:
Цитата Сообщение от IGPIGP Посмотреть сообщение
Конечно, было бы удобно в самом объекте иметь указатель на матрицу, чтобы не создавать второй список сопряженный с первым.
Цитата Сообщение от Igor3D Посмотреть сообщение
Сделать CDrawer образцово-показательным классом спихнув всю черновую работу в окно?
Если матрица задаётся окном, то она CDrawer не нужна (внутри) Это его исходное данное порождаемое другим объектом. Хотя если матрица НЕ задаётся окном то может быть:
Цитата Сообщение от IGPIGP Посмотреть сообщение
было бы удобно в самом объекте (CDrawer ) иметь указатель на матрицу
всё это специфично для задачи и тут конкретики от меня быть не может.
Цитата Сообщение от Igor3D Посмотреть сообщение
Все так и есть, вопрос был как обеспечить selection для рисования.
Если у Вас стандартный listbox то он обеспечивает событие selection_changed для каждого своего item. Или что-то вроде того. Окно получает инфу о том, что изменение выбора произошло , при этом отменяется выбор предыдущего item возможно , или происходит добавление item в группу "избранных". Вызывать ли принудительную перерисовку тут же, или изменить какое то поле типа selected в объекте CDrawer для будущей перерисовки, это зависит от того, что Вы хотите получить в виде поведения от данного действа. Так же как и способ перерисовки (всё или только объект с изменённым состоянием). Я бы во всяком случае не перерисовывал, пока курсор в рабочей области listbox. Мало ли чего и сколько юзер там решит накликать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.04.2017, 10:33
Помогаю со студенческими работами здесь

В указанном dsn архитектура драйвера и архитектура приложения не соответствуют друг другу
Добрый день. При запуске программы выскакивает вот такая вот ошибка. В чем может быть проблема и как ее исправить?

архитектура процессоров и компьютерная архитектура,Intel32. для первокурсников
сабж. кто чем может помочь юному,непонемающему в этой области человеку.желательно книгами.спасибо.

Ошибка "в указанном dsn архитектура драйвера и архитектура приложения"
Вот такая ошибка при нажатии на кнопку &quot;Проверить соединение&quot; Я прочитал, что это возможно из за того, что моя система 64, а...

Какими ещё способами можно ещё сделать?
Задание: Известно, что: 1 в третей степени будет=1 2 в третей степени будет=3+5 3 в третей степени будет=7+9+11 4 в третей...

Взаимодействия
Помогите найти тему: Взаимодействия (interactions) в UML. Понятие взаимодействия (interaction) в языке UML просто не могу ничего...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru