我基本上遇到了这个问题:现在,我们有一个系统,它获取一个字符串作为输入,它基本上是说ACTION:。
对于每个动作,都有一个自动生成的函数(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());
这真的很烦人。
避免这种情况的最佳方法是什么?我看过/试过无数的东西,这是理性玫瑰的真正旧版本(前2k),是的。
如果有人有任何令人惊讶的想法。
答案 0 :(得分:12)
我喜欢@ cobbal关于上面的函数指针哈希的想法,但你可以用多态来替换这个条件逻辑。
请参阅:http://c2.com/cgi/wiki?ReplaceConditionalWithPolymorphism
答案 1 :(得分:6)
哈希存储函数指针在这里可以正常工作
答案 2 :(得分:2)
我使用了多态与工厂模式相结合。我减少了很多,如果这样:
MyAbstractClass *ac = Factory::getHandlerFor(data);
ac->perform(parameters);
答案 3 :(得分:1)
我认为最简单的是boost :: functions的地图。
答案 4 :(得分:0)
你可以使用boost :: bind或boost :: function和一个地图。这将允许您调用正确的函数,甚至知道每个函数都有不同的参数量。
如果您不想要任何额外的代码,可以使用函数对象和继承。