С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
6 / 6 / 1
Регистрация: 25.02.2016
Сообщений: 342

Архитектура для коммуникации объектов

03.07.2017, 09:21. Показов 1146. Ответов 12
Метки нет (Все метки)

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

Есть базовый объект, который является контейнером и хранит в себе другие объекты (модули).

C++
1
2
3
4
5
6
7
8
class Container
{
public:
    void add(...);
    void get(...);
private:
    std::vector<Module*> modules;
}
Каждый модуль имеет право общаться с другими модулями. А именно, получает ссылку на него и выполняет какие то действия.
Как это общение корректно и красиво реализовать?

Делал так, что каждый модуль при создании получает ссылку на Container, в котором содержится и далее простым get(...) получает другой модуль. Но тут идет взаимная ссылка контейнера на модуль и модуля на контейнер, что мне не очень нравится + приходится инициализировать эту ссылка ну базовый контейнер при создании модуля.

Может есть какие то подходы/паттерны, которые дают решение этой проблемы?
Буду благодарен за любые ответы!
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.07.2017, 09:21
Ответы с готовыми решениями:

Архитектура нейронной сети для детекции черно-белых объектов
У меня есть подобные картинки: Требуется детектировать на них черные объекты (на этой картинке кругленькие, но бывают и чуть...

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

Протокол для надёжной коммуникации по RS485.
Здравствуйте, друзья :) ! На очередной итерации моего Мармезонского балета мне понадобилось установить более менее надёжное соеденение...

12
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
03.07.2017, 10:08
Подход что группа связанных модулей хранится в одном массиве - вроде бы оптимальный вариант. Потому что иначе потребуется городить самосинхронизирующиеся массивы в каждом из модулей, что обычно не хорошо, да и независимых групп(контейнеров) модулей может быть несколько. Без взаимных ссылок модуль не сможет определить, к какой именно группе его отнесли.
1
6 / 6 / 1
Регистрация: 25.02.2016
Сообщений: 342
03.07.2017, 11:01  [ТС]
TRam_, Вот интересно, может есть какие то готовые паттерны под такой случай? Чтобы сделать все без "спагетти кода" и со всеми правилами "устава".
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
03.07.2017, 12:25
Цитата Сообщение от Kertis138 Посмотреть сообщение
Может есть какие то подходы/паттерны, которые дают решение этой проблемы?
1.
WINAPI like pattern

данный способ любят юзать при разработке виндузятных проектов.
Container - обычная глобальная переменная.
модули обращаются к нему по имени.
и через него получают доступ к другим модулям.

2.
система сообщений.
объекты могут посылать друг другу сообщения,
где бы они ни находились.
1
6 / 6 / 1
Регистрация: 25.02.2016
Сообщений: 342
04.07.2017, 04:35  [ТС]
TRam_, Вот интересно, может есть какие то готовые паттерны под такой случай? Чтобы сделать все без "спагетти кода" и со всеми правилами "устава".
Цитата Сообщение от hoggy Посмотреть сообщение
1.
WINAPI like pattern
данный способ любят юзать при разработке виндузятных проектов.
Container - обычная глобальная переменная.
модули обращаются к нему по имени.
и через него получают доступ к другим модулям.
2.
система сообщений.
объекты могут посылать друг другу сообщения,
где бы они ни находились.

Первый вариант слишком некрасивый, на мой взгляд. Не то, что нужно.
Второй уже ближе к правде. А можете подробней рассказать, что за система сообщений?

Добавлено через 15 часов 40 минут
Цитата Сообщение от TRam_ Посмотреть сообщение
Подход что группа связанных модулей хранится в одном массиве - вроде бы оптимальный вариант. Потому что иначе потребуется городить самосинхронизирующиеся массивы в каждом из модулей, что обычно не хорошо, да и независимых групп(контейнеров) модулей может быть несколько. Без взаимных ссылок модуль не сможет определить, к какой именно группе его отнесли.
Меня всегда смущает, что в каждый модуль надо как-то протягивать эту ссылку. Как то не красиво смотрится - передавать все через конструктор.
А если передавать через set-метод, то это похоже на логический костыль.
friend функции - как какое то нарушение инкапсуляции.

То ли я неверно мыслю, то ли действительно это не очень красиво.
Как считаете?
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
04.07.2017, 04:43
Kertis138, в любом случае в каждом объекте должна оказаться ссылка на массив указателей на модули + он или его должны добавить в массив и удалить из массива при разрушении. Реализовать получение ссылки на массив способов масса - через конструктор, через set-метод или даже через глобальную/статическую переменную.
1
6 / 6 / 1
Регистрация: 25.02.2016
Сообщений: 342
04.07.2017, 05:38  [ТС]
TRam_,

А корректно при взаимной ссылке в include писать как-то так?:

CONTAINER.H
C++
1
2
3
4
5
6
class Module1;
class Module2;
...
class ModuleN;
 
class Container {...};
MODULEI.h
C++
1
2
3
#include "Container.h
 
class Modulei{...};
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
04.07.2017, 05:45
Цитата Сообщение от TRam_ Посмотреть сообщение
в каждом объекте должна оказаться ссылка
Цитата Сообщение от TRam_ Посмотреть сообщение
через глобальную/статическую переменную
))))

Добавлено через 6 минут
Цитата Сообщение от Kertis138 Посмотреть сообщение
Первый вариант слишком некрасивый, на мой взгляд
самое красивое и изящное решение))

Цитата Сообщение от Kertis138 Посмотреть сообщение
что за система сообщений?
тут где то на форуме были темы)

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

с технической же точки зрения,
там под капотом такое волшебство,
что при любых раскладах,
накладные расходы будут побольше,
чем в первом случае)

самые быстрые, что я видел - "статические",
когда средства связи разворачиваются времени компиляции,
под капотом держат статические контейнеры.

так что если вас смущает одна лишняя переменная в объекте,
то первый способ - то, что доктор прописал))
1
6 / 6 / 1
Регистрация: 25.02.2016
Сообщений: 342
04.07.2017, 05:48  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
так что если вас смущает одна лишняя переменная в объекте,
то первый способ - то, что доктор прописал))
А разве использование глобальных переменных не есть плохо?

К примеру есть не один, а несколько контейнеров, которые никак не связаны. Тогда на каждый контейнер нужна своя глобальная переменная, что неудобно из-за разных имен и путаницы. Разве не так?
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
04.07.2017, 05:50
Цитата Сообщение от Kertis138 Посмотреть сообщение
А разве использование глобальных переменных не есть плохо?
в больших проектах да, а типа Hello World нет
1
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
04.07.2017, 05:52
Цитата Сообщение от Antikl Посмотреть сообщение
в больших проектах да, а типа Hello World нет
и сейчас я такой вспоминаю логгеры. )))
1
6 / 6 / 1
Регистрация: 25.02.2016
Сообщений: 342
04.07.2017, 05:52  [ТС]
Цитата Сообщение от Antikl Посмотреть сообщение
в больших проектах да, а типа Hello World нет
Суть даже не в размере проекта, а в том, чтобы научится получать красивые и правильные архитектурные решения.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
04.07.2017, 08:49
Лучший ответ Сообщение было отмечено Kertis138 как решение

Решение

Цитата Сообщение от Kertis138 Посмотреть сообщение
А разве использование глобальных переменных не есть плохо?
не конечно)
широко применяемая практика.

Цитата Сообщение от Kertis138 Посмотреть сообщение
К примеру есть не один, а несколько контейнеров, которые никак не связаны. Тогда на каждый контейнер нужна своя глобальная переменная, что неудобно из-за разных имен и путаницы. Разве не так?
у вас в программе будет туева куча разных переменных,
которые никак не связанны.
но путаницы не возникает.
не так ли?

у глобальных переменных есть свои недостатки.
но точно не из-за путаницы имен)

а так вообще, любой подход можно изгадить,
если подходить к нему бездумно, и фанатично.

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

Цитата Сообщение от Kertis138 Посмотреть сообщение
научится получать красивые и правильные архитектурные решения.
чем отличается "красивое и правильное решение" от "не красивого и не правильного"?

красивое и правильное - простое, практичное,
не создает проблем ни себе, ни людям.

не красивое и не правильное - замороченное решение,
в котором без 100 грамм не разберёшься переусложненное на ровном месте.

вопрос к вам: зачем делать сложно,
если можно сделать просто,
и получить тот же самый профит?

если предполагается, что контейнер может быть только один,
используйте глобальную точку доступа
(сингелтон или глобальная переменная)

если контейнеров может быть множество,
сделайте ссылку на родительский контейнер для ребенка.

если нужно осуществлять связь между элементами разных контейнеров,
ну или необходимо наладить коммуникацию между объектами,
которые ничего друг о друге не знают,
тогда есть смысл подумать о системе сообщений.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.07.2017, 08:49
Помогаю со студенческими работами здесь

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

Межпотоковые коммуникации
В учебнике Шилдта встретил программу по теме Межпотоковые коммуникации, не могу понять как здесь работает boolean valueSet? Что за чем...

Сети и коммуникации
Здравствуйте, дали такое задание по сетям и коммуникациям, ничего толкового найти в интернете не могу , сам в этой области совсем чайник,...

Интерфейс и лаги в коммуникации
Есть у нас претендующая на реалтайм программа, использующая интерфейс, написанный на WPF (Правильный вопрос, нафига она на винде, да еще...

3 пути коммуникации в модели TCP/IP
Здравствуйте, уважаемые! Согласно описанию модели TCP IP, возможны следующие пути коммуникации между субъектами одноранговых и...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru