避免一千个 if 语句的最佳方法是啥?
Posted
技术标签:
【中文标题】避免一千个 if 语句的最佳方法是啥?【英文标题】:Best way to avoid a thousand if statements?避免一千个 if 语句的最佳方法是什么? 【发布时间】:2009-03-21 21:24:28 【问题描述】:我基本上有这个问题:现在,我们有一个系统,它获取一个字符串作为输入,它基本上说 ACTION:。
对于每一个动作都有一个自动生成的函数(Rational Rose GRRR),比如
bouncer_comm.chatMessage("data goes here").sendAt(msg->sapIndex0());
bouncer_comm.askforname().sendAt(msg->sapindex0());
bouncer_comm
返回一个RTOutSignal
,由于玫瑰使用的奇怪结构,我无法手动创建它们。
现在,我唯一的选择是创建一百个左右的 if 语句,我这样做:
if(action == "CHAT") bouncer_comm.chatMessage("data goes here").sendAt(msg->sapIndex0());
这真的很烦人。
避免这种情况的最佳方法是什么?我已经看过/尝试了无数的东西,这是一个非常旧版本的理性玫瑰(pre 2k),是的。
如果有人有任何想法,那就太棒了。
【问题讨论】:
【参考方案1】:我喜欢@cobbal 对上面函数指针哈希的想法,但你可以用多态性替换这个条件逻辑。
见:http://c2.com/cgi/wiki?ReplaceConditionalWithPolymorphism
【讨论】:
多态在这里可能是最好的,结合某种工厂。不同的命令意味着不同的命令子类。 多态绝对是最好的,更符合 C++ 的习惯【参考方案2】:哈希存储函数指针在这里可以很好地工作
【讨论】:
您能详细说明一下吗?我尝试制作函数指针的映射,但由于它们采用不同的值,因此会导致问题。 如果这是 C 而不是 C++,我会同意,但既然是后者,就不得不支持多态方法 如果每个方法都有不同的签名,那么避免使用函数指针可能是您的兴趣所在。 说实话,我对 boost 知之甚少。听起来这些其他建议会更好。【参考方案3】:我将多态性与工厂模式结合使用。我为此减少了很多如果:
MyAbstractClass *ac = Factory::getHandlerFor(data);
ac->perform(parameters);
【讨论】:
【参考方案4】:我认为最简单的是 boost::functions 的映射。
【讨论】:
【参考方案5】:您可以使用 boost::bind 或 boost::function 和一个映射。这将允许您调用正确的函数,即使知道每个函数都有不同数量的参数。
如果您不想要任何额外的代码,您可以使用函数对象和继承。
【讨论】:
以上是关于避免一千个 if 语句的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章