![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| SABROG |
|
||||||||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
Хочу сделать разную реакцию программы на получение ответа от сервера на разные типы запросов. Очередь запросов представлена подобным образом:
// псевдокод
Ответ от сервера приходит в один метод типа:
Думал сделать както-то так:
Но я бы хотел иметь возможность точно определять какого типа объект класса в рантайме. Как я понимаю это единственный вариант при использовании примера выше без использования RTTI:
У кого есть мысли как это лучше организовать? |
||||||||||
|
|||||||||||
| djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 8 Всего: 39 |
Для dynamic_cast используется RTTI. В вашем случае для doStuff..() он не нужен, проще и правильнее организовать специфичные действия прямо в виртуальном do(). Лично я использую проверку на тип только в таких случаях:
То есть проверяю принадлежность объекта к текущему наследованному типу. -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 15 Всего: 118 |
зачем очередь представлена как вектор?... впрочем, не так и важно.
без RTTI - можно ввести поле enum в AbstractRequest и по нему ориентироваться, т.е. без dynamic_cast<>. Нечто вроде: 1) класс RequestFile, RequestHtml наследники от AbstractRequest , получают данные в методе do(). 2) классы обработчики реквестов, их экземпляры подтягиваются в конце do() (ну или у вас где dinamic_cast) через фабрику.. вот тут можно разрулить - подтягивать ли фабрикой новые экземпляры обработчиков, или выдавать singleton-ы.... Фабрика может судить о том что ей создать исходя из поля в AbstractRequest Сумбурно как-то.. но наверно можно развить идею -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
Вот оно как...
Вообще я до конца не определился. Хочу сделать смену состояний конечного автомата в зависимости от типа запроса, но если каменный цветок не выйдет, то чтобы не пришлось делать рефакторинг классов, но похоже этого не избежать никаким образом. Значит придется сначала сидеть на структуре с кастомной проверкой типа, а если график состояний не выйдет уже думать о переходе на виртуальные методы. |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
SABROG, тебе не кажется, что этот вопрос в данном разделе не очень уместен?
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
SABROG, имхо разбивать на классы лучше не по запросам, а по обработчикам..
|
|||
|
||||
| SABROG |
|
||||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
Вопрос как бы по дизайну, я не знаю как подобное решают профессиональные программисты.
Я не совсем понял о чем идет речь. Структура остается структурой, но завести 2 класса в которые она будет передаваться и где будет происходить обработка, типа этого?
Или ты имеешь ввиду шаблонные классы с типовой специализацией? |
||||||
|
|||||||
| jonie |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 15 Всего: 118 |
вместо
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
||||
|
|||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
Я понял, но нужно рассмотреть несколько реализаций фабрик, которая мне бы подошла, а то ведь тот же паттерн Factory завязывается на виртуальном наследовании, а у меня тут поле Type. Я где-то видел фабрику, которая генерила объекты по строковому параметру типа f->create("automobile"), вероятно мне придется сделать что-то похожее, но типа такого f->create(Request::HtmlPage), ну и request->doStuff(). |
|||
|
||||
| jonie |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 15 Всего: 118 |
Это сообщение отредактировал(а) jonie - 25.5.2010, 21:16 -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
||||
|
|||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
Значит я все-таки не до конца тебя понял. Ты предлагаешь оставить структуру как есть, но добавить класс, который будет "плодить" функторы разных классов в зависимости от Type'a? Abstract Factory |
|||
|
||||
| jonie |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 15 Всего: 118 |
В общем идея в том чтобы отделить друг от друга максимально запрос, обработчик ответа, и создающего обработчик объекта.
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
||||
|
|||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
Почитал документацию к примерам фабрик PapaFactory и дошел до такого текста:
То есть у меня вообще 2 выходит. Как бы там ни было продолжу копать в направлении фабрик для саморазвития и возможности расширения функционала кода в перспективе. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |