Лучший способ избежать тысячи заявлений?

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

Для каждого из действий есть автоматически сгенерированная функция (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 ответов

Решение

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

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

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

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


MyAbstractClass *ac = Factory::getHandlerFor(data);
ac->perform(parameters);

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

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

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

Другие вопросы по тегам