C ++ if语句备选方案

时间:2010-06-30 12:56:42

标签: c++

是我,还是看起来C ++要求更多地使用'if'语句然后C#?

我有这个代码库,它包含很多这样的东西:

if (strcmp((char*)type,"double")==0)

当有太多if语句时,我想知道是不是有点“代码味道”?

我不是说不好,但是字符串比较之类的东西,涉及很多字符串,不能以不同方式完成吗?

是否可以选择编写if语句的序列?

这只是一个例子,它可以是任何类型的IF声明 而不是:

if (string a == "blah") then bla
if (string b == "blah") then blo

8 个答案:

答案 0 :(得分:13)

您执行if (strcmp((char*)type,"double")==0)的原因是因为您不能将“double”设为case-expression并使用switch语句。也就是说,如果您正在进行这些类型的字符串匹配 lot ,您可能需要查看使用std::map<std::string, int>或类似的东西,然后使用地图将字符串转换为然后,您可以将其输入switch

就个人而言,在这些情况下,我是std::map<std::string, int (Handler::*)(void)>之类的粉丝,它让我创建类方法的处理程序映射,但是YMMV。

编辑:我忘了提到:有一个方法字符串映射的另一个好处是你可以在运行时改变它(通常是添加到它)。例如,解析器在知道它正在解析哪种文件后,可以在运行时更改其关键字及其处理程序列表。

答案 1 :(得分:5)

这是代码味道。

要最小化它,您应该(在这种情况下)使用std::string s。然后你的代码变成:

#include <string>
// [...]
std::string type = "whatever";
// [...]
if (type == "double")

这几乎与C#等价物完全相同:要在C#代码中编译此示例代码,只需删除includestd::

通常,如果你发现在C ++中直接使用char *的代码通常是做错了(除了一些罕见的例外)。

在他的回答中

编辑Mike DeSimone addressed the problem of further refactoring this(所以我不会在这里提及:))。

答案 2 :(得分:1)

我认为C ++不需要比C#更多的“ifs”。程序中if语句的数量实际上只是编码风格的问题。您可以通过多态,表驱动方法等技术消除ifs。 C ++和C#都提供了相同的技术。如果用这两种语言编写的程序之间存在差异,我怀疑它与C#与C ++程序员的心态有关。

请注意,我不一定建议“if”消除。根据我的经验,如果陈述往往比替代方案更清晰。直接解决你的第二点:消除链式字符串比较的方法就是使用DFSA。然而,大多数情况下,字符串比较是完全合适的。

答案 3 :(得分:1)

这不是我注意到的;我已经完成了10年的C ++和4年的C#! 当然,if的数量与代码的设计有关,而不是C#和C ++之间的差异?

答案 4 :(得分:1)

要删除任何一种语言的条件表达式,您可以考虑使用Inversion of Control pattern。它具有减少这些的副作用。

答案 5 :(得分:1)

根据'bla'和'blo'的性质,你总是可以尝试使用std :: map,将字符串作为键。

答案 6 :(得分:0)

如果您可以用if替换它们,则代码气味太多switch...case。否则,我没有看到使用if的问题。

也许你在C#中使用了更多的事件驱动编程,而你的C ++代码更顺序?

答案 7 :(得分:0)

实现字符串解析器的方法比无限的if (strcmp...)语句更好。

一种方法可以是字符串和函数指针或仿函数对象之间的映射。

另一种设计可能涉及一系列责任模式,其中字符串被传递给一组对象,这些对象决定它们是否匹配或传递它。

我不知道有关C ++的任何内容,使其比任何其他语言更容易“滥用”。