Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
6 / 6 / 1
Регистрация: 25.02.2016
Сообщений: 319
1

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

03.07.2017, 09:21. Показов 950. Ответов 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.07.2017, 09:21
Ответы с готовыми решениями:

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

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

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

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

12
зомбяк
1556 / 1195 / 339
Регистрация: 14.05.2017
Сообщений: 3,882
03.07.2017, 10:08 2
Подход что группа связанных модулей хранится в одном массиве - вроде бы оптимальный вариант. Потому что иначе потребуется городить самосинхронизирующиеся массивы в каждом из модулей, что обычно не хорошо, да и независимых групп(контейнеров) модулей может быть несколько. Без взаимных ссылок модуль не сможет определить, к какой именно группе его отнесли.
1
6 / 6 / 1
Регистрация: 25.02.2016
Сообщений: 319
03.07.2017, 11:01  [ТС] 3
TRam_, Вот интересно, может есть какие то готовые паттерны под такой случай? Чтобы сделать все без "спагетти кода" и со всеми правилами "устава".
0
Эксперт С++
8610 / 4173 / 926
Регистрация: 15.11.2014
Сообщений: 9,455
03.07.2017, 12:25 4
Цитата Сообщение от Kertis138 Посмотреть сообщение
Может есть какие то подходы/паттерны, которые дают решение этой проблемы?
1.
WINAPI like pattern

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

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

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

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

То ли я неверно мыслю, то ли действительно это не очень красиво.
Как считаете?
0
зомбяк
1556 / 1195 / 339
Регистрация: 14.05.2017
Сообщений: 3,882
04.07.2017, 04:43 6
Kertis138, в любом случае в каждом объекте должна оказаться ссылка на массив указателей на модули + он или его должны добавить в массив и удалить из массива при разрушении. Реализовать получение ссылки на массив способов масса - через конструктор, через set-метод или даже через глобальную/статическую переменную.
1
6 / 6 / 1
Регистрация: 25.02.2016
Сообщений: 319
04.07.2017, 05:38  [ТС] 7
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
Эксперт С++
8610 / 4173 / 926
Регистрация: 15.11.2014
Сообщений: 9,455
04.07.2017, 05:45 8
Цитата Сообщение от TRam_ Посмотреть сообщение
в каждом объекте должна оказаться ссылка
Цитата Сообщение от TRam_ Посмотреть сообщение
через глобальную/статическую переменную
))))

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

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

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

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

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

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

К примеру есть не один, а несколько контейнеров, которые никак не связаны. Тогда на каждый контейнер нужна своя глобальная переменная, что неудобно из-за разных имен и путаницы. Разве не так?
0
с++
1275 / 518 / 223
Регистрация: 15.07.2015
Сообщений: 2,554
04.07.2017, 05:50 10
Цитата Сообщение от Kertis138 Посмотреть сообщение
А разве использование глобальных переменных не есть плохо?
в больших проектах да, а типа Hello World нет
1
Любитель чаепитий
3671 / 1747 / 543
Регистрация: 24.08.2014
Сообщений: 5,888
Записей в блоге: 1
04.07.2017, 05:52 11
Цитата Сообщение от Antikl Посмотреть сообщение
в больших проектах да, а типа Hello World нет
и сейчас я такой вспоминаю логгеры. )))
1
6 / 6 / 1
Регистрация: 25.02.2016
Сообщений: 319
04.07.2017, 05:52  [ТС] 12
Цитата Сообщение от Antikl Посмотреть сообщение
в больших проектах да, а типа Hello World нет
Суть даже не в размере проекта, а в том, чтобы научится получать красивые и правильные архитектурные решения.
0
Эксперт С++
8610 / 4173 / 926
Регистрация: 15.11.2014
Сообщений: 9,455
04.07.2017, 08:49 13
Лучший ответ Сообщение было отмечено Kertis138 как решение

Решение

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

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

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

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

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

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

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

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

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

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

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

если нужно осуществлять связь между элементами разных контейнеров,
ну или необходимо наладить коммуникацию между объектами,
которые ничего друг о друге не знают,
тогда есть смысл подумать о системе сообщений.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.07.2017, 08:49

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru