避免一千个 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 语句的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Nuxt 处理登录\注销按钮以避免闪烁内容的最佳方法是啥?

避免android片段中内存泄漏的最佳方法是啥

避免错误包含相同文件的最佳方法是啥?

避免 maven-jar 的最佳方法是啥?

使用 ENSURE 避免代码分析警告的最佳替代方法是啥?

在 java-8 中处理或避免 NPE 的最佳方法是啥?