Лучший способ избежать тысячи заявлений? - PullRequest
4 голосов
/ 22 марта 2009

У меня, по сути, есть эта проблема: сейчас у нас есть система, в которой в качестве входных данных она получает строку, и она в основном говорит ДЕЙСТВИЕ:.

Для каждого из действий есть автоматически сгенерированная функция (Rational Rose GRRR), например

bouncer_comm.chatMessage("data goes here").sendAt(msg->sapIndex0());
bouncer_comm.askforname().sendAt(msg->sapindex0());

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

Прямо сейчас, мой единственный вариант - создать сто или около того операторов if, где я делаю:

if(action == "CHAT")  bouncer_comm.chatMessage("data goes here").sendAt(msg->sapIndex0());

Что действительно раздражает.

Каков наилучший способ избежать этого? Я смотрел / пробовал бесчисленные вещи, это действительно старая версия рациональной розы (до 2к) и да.

Если у кого-то есть идеи, которые были бы удивительны.

Ответы [ 5 ]

12 голосов
/ 22 марта 2009

Мне нравится идея @ cobbal о хэше указателя на функцию выше, но вы можете заменить эту условную логику полиморфизмом.

см .: http://c2.com/cgi/wiki?ReplaceConditionalWithPolymorphism

6 голосов
/ 22 марта 2009

Здесь могут хорошо работать указатели функции хранения хеша

2 голосов
/ 22 марта 2009

Я использовал полиморфизм в сочетании с заводским рисунком. Я сократил много если к этому:


MyAbstractClass *ac = Factory::getHandlerFor(data);
ac->perform(parameters);
1 голос
/ 22 марта 2009

Я думаю, что самой простой является карта boost :: functions.

0 голосов
/ 22 марта 2009

Вы можете использовать boost :: bind или boost :: function и карту. Это позволит вам вызывать правильную функцию, даже если вы знаете, что каждая функция имеет разное количество параметров.

Если вам не нужен дополнительный код, вы можете использовать функциональные объекты и наследование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...