是我,还是看起来C ++要求更多地使用'if'语句然后C#?
我有这个代码库,它包含很多这样的东西:
if (strcmp((char*)type,"double")==0)
当有太多if语句时,我想知道是不是有点“代码味道”?
我不是说不好,但是字符串比较之类的东西,涉及很多字符串,不能以不同方式完成吗?
是否可以选择编写if语句的序列?
这只是一个例子,它可以是任何类型的IF声明 而不是:
if (string a == "blah") then bla
if (string b == "blah") then blo
答案 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#代码中编译此示例代码,只需删除include
和std::
。
通常,如果你发现在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 ++的任何内容,使其比任何其他语言更容易“滥用”。