Форум программистов, компьютерный форум CyberForum.ru

Задача дизайна - прокинуть детали низкоуровневой реализации на более высокий уровень и вернуть обратно - C++

Восстановить пароль Регистрация
 
 
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
22.11.2016, 13:37     Задача дизайна - прокинуть детали низкоуровневой реализации на более высокий уровень и вернуть обратно #1
Привет!

Задача возникла на работе. Мозговым штурмом было предложено 100500 реализаций, одно из них выбрали, но хотелось бы посмотреть на альтернативные варианты

Итак - есть RPC канал, который реагирует на события AMQP сервера (используется событийная модель). Из RPC канала нужно асинхронно ответить на сообщение, для этого AMQP нужны данные, о которых знает только AMQP. Т.е. эти данные нужно прокинуть из AMQP в RPC, и RPC потом должен эти данные вернуть. Чтоб все было кошерно нужно:
1. Чтобы RPC не знал об AMQP (транспорт должен быть заменяемым)
2. Не нужно заставлять пользователя (т.е. RPC) что-то куда-то прокидывать

Чтоб было понятней (очень упращенный вариант)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// AMQP
void AmqpServer::mainLoop()
{
    // что-то делаем, в итоге получаем сообщение
   // при этом есть некий ID, который нужно знать при отправке ответа
   
    _messageHandler->onMessageReceived(message/*, также нужно как-то прокинуть упомянутый ID*/);
}
 
void AmqpServer::sendResponse (std::string response, /* и еще нужно знать упомянутый выше ID*/)
{
    // отправляем сообщение, используя ID
}
 
// RPC
void RpcChannel::onMessageReceived (std::string message/*, нужен еще ID*/)
{
    // обработали сообщение, сформировали ответ
 
    _responseHandler->sendResponse(response/*, плюс нужно вернуть ID*/);
}
Вариант с кешированием IDшников на стороне сервера сразу отметаем по ряду причин. Есть предложения?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.11.2016, 13:37     Задача дизайна - прокинуть детали низкоуровневой реализации на более высокий уровень и вернуть обратно
Посмотрите здесь:

C++ Удалить самый высокий лист в дереве
Можно ли переделать проект из более поздней Visual Studio в более раннюю? Visual C++
C++ Как вернуть обратно к switch
C++ Задача Robot. Найти количество единичных квадратов, на которых робот побывал более одного раза
C++ Найти слова, которые состоят из 3х и более букв и имеют более 2х гласных
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
 Аватар для vxg
2669 / 1680 / 158
Регистрация: 13.01.2012
Сообщений: 6,281
22.11.2016, 13:57     Задача дизайна - прокинуть детали низкоуровневой реализации на более высокий уровень и вернуть обратно #2
Kastaneda, для тех кто не знает что такое AMQP и RPC можно сформулировать или технические особенности этих заклинаний здесь принципиальны? если да, то этого почему-то не видно по примеру
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
22.11.2016, 14:03  [ТС]     Задача дизайна - прокинуть детали низкоуровневой реализации на более высокий уровень и вернуть обратно #3
Цитата Сообщение от vxg Посмотреть сообщение
Kastaneda, для тех кто не знает что такое AMQP и RPC можно сформулировать или технические особенности этих заклинаний здесь принципиальны? если да, то этого почему-то не видно по примеру
Технические особенности не принципиальны. Попробую объяснить - AMQP это протокол передачи данных (по сети), используется в качестве транспорта. RPC - это тоже протокол, но более высокого уровня, ему без разницы через какой транспорт к нему пришло сообщение, хоть через HTTP.

Если проводить аналогию, то можно представить, что вместо AMQP имеется ввиду TCP, а вместо RPC - HTTP. И теперь представим, что для отправки HTTP ответа уровень HTTP должен знать о каких-то деталях реализации TCP, понятно, что это не правильно. И у нас получается, что уровень RPC должен знать об AMQP.
vxg
Модератор
 Аватар для vxg
2669 / 1680 / 158
Регистрация: 13.01.2012
Сообщений: 6,281
22.11.2016, 14:10     Задача дизайна - прокинуть детали низкоуровневой реализации на более высокий уровень и вернуть обратно #4
Kastaneda
то есть имеем объект 1-го уровня через который проходят данные попадающее объекту 2-го уровня и объекту 2-го уровня нужно знать об этих данных нечто доступное лишь объекту 1-го уровня?
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
22.11.2016, 14:14  [ТС]     Задача дизайна - прокинуть детали низкоуровневой реализации на более высокий уровень и вернуть обратно #5
vxg, да и задача в том, чтобы оградить объект 2-го уровня от этих знаний, т.к. чисто теоретически тип объекта 1-го уровня может быть другим и иметь другую реализацию.
vxg
Модератор
 Аватар для vxg
2669 / 1680 / 158
Регистрация: 13.01.2012
Сообщений: 6,281
22.11.2016, 14:19     Задача дизайна - прокинуть детали низкоуровневой реализации на более высокий уровень и вернуть обратно #6
Kastaneda, если объект 1-го уровня может вызвать обработчик объекта 2-го уровня во время приема данных (вместо вызова обработчика неким стандартным механизмом) и передать в этом обработчике нужные данные наверное это самое естественное решение кроме кэша
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
22.11.2016, 14:24  [ТС]     Задача дизайна - прокинуть детали низкоуровневой реализации на более высокий уровень и вернуть обратно #7
Цитата Сообщение от vxg Посмотреть сообщение
если объект 1-го уровня может вызвать обработчик объекта 2-го уровня во время приема данных (вместо вызова обработчика неким стандартным механизмом) и передать в этом обработчике нужные данные наверное это самое естественное решение кроме кэша
Оно выглядит просто, но оно не правильное. Завтра мы меняем AMQP на тот же HTTP и нам данные AMQP не нужны - придется переписываться код. Или мы хотим использовать 2 вида транспорта одновременно - тогда вообще получится несовместимость.
vxg
Модератор
 Аватар для vxg
2669 / 1680 / 158
Регистрация: 13.01.2012
Сообщений: 6,281
22.11.2016, 15:13     Задача дизайна - прокинуть детали низкоуровневой реализации на более высокий уровень и вернуть обратно #8
Kastaneda, если вы владеете структурой данных прикрепляйте нужную информацию нижнего уровня в экстру
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
22.11.2016, 16:37  [ТС]     Задача дизайна - прокинуть детали низкоуровневой реализации на более высокий уровень и вернуть обратно #9
vxg, нужно передать 2 поля (в примере в 1-ом посте показал одно просто для примера), но в идеале кол-во полей должно быть любым, поэтому поле extra будет непонятно какого типа (не void* же делать).
Цитата Сообщение от vxg Посмотреть сообщение
если вы владеете структурой
можно варьировать как угодно, пока есть возможность менять интерфейсы/сигнатуры.
vxg
Модератор
 Аватар для vxg
2669 / 1680 / 158
Регистрация: 13.01.2012
Сообщений: 6,281
22.11.2016, 16:45     Задача дизайна - прокинуть детали низкоуровневой реализации на более высокий уровень и вернуть обратно #10
Kastaneda, ну так сделать это поле std::list<VARIANT>

Добавлено через 38 секунд
или лучше std::map<std::string, VARIANT> что бы уж с именами)

Добавлено через 2 минуты
хотя с именами не айс, нужны цифровые идентификаторы)

Добавлено через 25 секунд
что бы проверились в CT и можно было спать спокойно
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
23.11.2016, 07:38  [ТС]     Задача дизайна - прокинуть детали низкоуровневой реализации на более высокий уровень и вернуть обратно #11
Цитата Сообщение от vxg Посмотреть сообщение
или лучше std::map<std::string, VARIANT> что бы уж с именами)
Была такая идея, но это решение попахивает)
vxg
Модератор
 Аватар для vxg
2669 / 1680 / 158
Регистрация: 13.01.2012
Сообщений: 6,281
23.11.2016, 09:02     Задача дизайна - прокинуть детали низкоуровневой реализации на более высокий уровень и вернуть обратно #12
Kastaneda, идеал - это когда вы знаете поля которые вам нужны - тогда экстра это просто структура с вашими полями. Если поля неизвестны и могут меняться то иного способа кроме абстрактного списка логически вроде нет
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
23.11.2016, 09:27  [ТС]     Задача дизайна - прокинуть детали низкоуровневой реализации на более высокий уровень и вернуть обратно #13
Цитата Сообщение от vxg Посмотреть сообщение
идеал - это когда вы знаете поля которые вам нужны - тогда экстра это просто структура с вашими полями
Тогда верхний уровень будет знать о деталях реализации нижнего. И, если разработчик наркоман, то он может их даже переписать эти данные на верхнем уровне. Этого хочется избежать.
vxg
Модератор
 Аватар для vxg
2669 / 1680 / 158
Регистрация: 13.01.2012
Сообщений: 6,281
23.11.2016, 09:33     Задача дизайна - прокинуть детали низкоуровневой реализации на более высокий уровень и вернуть обратно #14
Kastaneda,
1 верхний уровень хочет знать что то что не дает ему стандартная реализация. для этого мы делаем экстру. если экстра различная для разных реализаций нижнего уровня (что само по себе странно ибо как тогда работает верхний уровень если он не знает какие доп данные ему нужны), то можно на верхнем уровне различать экстры по типам. например экстра TCP или экстра UDP и соответственно по разному с ними работать.
2 если разработчик неадекват, то он может просто не использовать ваши данные. если есть желание защитить сами данные из-за того что они используются еще где-то в цепочке можно возвращать их не в структуре, а в объекте с доступом к полям через get функции.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
23.11.2016, 09:51  [ТС]     Задача дизайна - прокинуть детали низкоуровневой реализации на более высокий уровень и вернуть обратно #15
Цитата Сообщение от vxg Посмотреть сообщение
верхний уровень хочет знать что то что не дает ему стандартная реализация.
В том то и дело, что верхнему уровню это не надо. Теоретически можно на нижнем уровне все кешировать и на верх ничего не отдавать, но кешировать нельзя по ряду причин. Поэтому приходится отдавать это на верх.
vxg
Модератор
 Аватар для vxg
2669 / 1680 / 158
Регистрация: 13.01.2012
Сообщений: 6,281
23.11.2016, 12:43     Задача дизайна - прокинуть детали низкоуровневой реализации на более высокий уровень и вернуть обратно #16
Цитата Сообщение от Kastaneda Посмотреть сообщение
В том то и дело, что верхнему уровню это не надо
это даже проще. тогда нижний уровень что ему надо положит в экстру и что надо из нее возьмет
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6176 / 2905 / 284
Регистрация: 04.12.2011
Сообщений: 7,730
Записей в блоге: 3
23.11.2016, 12:58     Задача дизайна - прокинуть детали низкоуровневой реализации на более высокий уровень и вернуть обратно #17
Цитата Сообщение от Kastaneda Посмотреть сообщение
Итак - есть RPC канал, который реагирует на события AMQP сервера (используется событийная модель). Из RPC канала нужно асинхронно ответить на сообщение, для этого AMQP нужны данные, о которых знает только AMQP. Т.е. эти данные нужно прокинуть из AMQP в RPC, и RPC потом должен эти данные вернуть.
Kastaneda, как я понимаю (из сказанного):
-RPC не знает и не изменяет указанные данные, а пропускает их транзитом
-AMQP использует указанные данные как id для идентификации в момент получения ответа собственного состояния на момент отправки сообщения на которое данный ответ получен.
Верно?
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
23.11.2016, 13:15  [ТС]     Задача дизайна - прокинуть детали низкоуровневой реализации на более высокий уровень и вернуть обратно #18
IGPIGP, да, все верно. Грубо говоря AMQP при отправке ответа добавляет в ответ данные, по которым можно понять на какой именно запрос этот ответ. И это детали реализации AMQP.

vxg, получается "кишками наружу")
vxg
Модератор
 Аватар для vxg
2669 / 1680 / 158
Регистрация: 13.01.2012
Сообщений: 6,281
23.11.2016, 13:24     Задача дизайна - прокинуть детали низкоуровневой реализации на более высокий уровень и вернуть обратно #19
Цитата Сообщение от IGPIGP Посмотреть сообщение
использует указанные данные как id для идентификации в момент получения ответа собственного состояния на момент отправки сообщения на которое данный ответ получен
ооо... *откидывается на спинку кресла и начинает думать*
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.11.2016, 13:37     Задача дизайна - прокинуть детали низкоуровневой реализации на более высокий уровень и вернуть обратно
Еще ссылки по теме:

Детали реализации конструктора класса C++
C++ Из функции вернуть более одного значения

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

Или воспользуйтесь поиском по форуму:
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6176 / 2905 / 284
Регистрация: 04.12.2011
Сообщений: 7,730
Записей в блоге: 3
23.11.2016, 13:37     Задача дизайна - прокинуть детали низкоуровневой реализации на более высокий уровень и вернуть обратно #20
Цитата Сообщение от vxg Посмотреть сообщение
откидывается на спинку кресла и начинает думать
Андрей Ефимыч?
Цитата Сообщение от Kastaneda Посмотреть сообщение
да, все верно
И как я понимаю, кешировать нельзя из-за того что не на все сообщения могут быть ответы.
Тогда совет vxg, это выход.
Я бы добавил, что стоит проанализировать имеющийся пакет в прямом сообщении. На предмет есть ли там место для "комментария" в виде id.
Важно ещё проанализировать количество различных состояний дифференцируемых на предмет обработки ответа, чтобы понять какой длины поле следует выбрать.
Yandex
Объявления
23.11.2016, 13:37     Задача дизайна - прокинуть детали низкоуровневой реализации на более высокий уровень и вернуть обратно
Ответ Создать тему
Опции темы

Текущее время: 02:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru