如何避免写开关盒太久?

时间:2010-10-25 06:05:12

标签: c++

在我目前的项目中,有很多代码使用 切换语句太多的情况。

Switch(c)
{
case CASENUMBERONE:
//50-100 lines of code in each code
...
case CASENUMBERTWENTY:
..
}


//thousands of lines of macro definition in another file
#define CASENUMBERONE 1
...
#define CASENUMBERTWENTY 20
...

编程风格似乎不合理。 怎么避免这个?

9 个答案:

答案 0 :(得分:15)

取决于

  • 您可以为每个案例编写一个函数。如果您担心性能问题,可以内联它们,但在现实生活中,由于更好的指令缓存一致性,实际上可能会因为单独的功能而获得性能提升。

  • 如果所有可能的整数值都接近并非常密集,您可以创建一个跳转表。如果满足某些条件,这就是许多编译器内部为开关/外壳做的事情。跳转表是一个函数指针数组,整数是它的索引。显然,你需要进行边界检查和NULL检查。

  • 您可以重新设计代码以使用多态并调用虚函数。

答案 1 :(得分:3)

正如@Zain所说,将每个案例的代码分解为函数/方法(这不是一般建议,而是对过长函数的建议)。

另外,考虑使用例如一个函数指针数组。

然后你可以说handler[c](): - )

更好的是,这些案例可能不是解决原始问题的好方法。

也许使用带有虚方法的基类型会有所帮助(不使用它是导致过长且荒谬的switch语句的常见原因。)

干杯&第h。,

答案 2 :(得分:1)

我不会说这种风格似乎合情合理。鉴于你没有给我们太多的帮助,我所能做的只是概括。将每个“case”放入一个单独的函数中,而不是在交换机中内联。您可以创建一个函数指针数组,这些函数指针引用给定案例中的每个函数,但这取决于您所覆盖的案例。您还可以使用面向对象和多态来为您调用每个函数。

我发现很难相信你在这些案件中找不到任何共性。

答案 3 :(得分:1)

我同意您的评估,即代码写得不好。您将不得不使用好的技术重写遗留代码,或提供有效隐藏错误代码的抽象层;通过这种方式,您可以在闲暇时重写坏代码,抽象层将使用遗留代码绑定新的优秀代码。

与往常一样,您应该为这些函数编写每个I / O对的测试,以找出拆分它们的位置以及它们如何结合在一起;测试还可以让你在不受惩罚的情况下进行重构。

旧的C ++代码太乱了,风格如下:/

答案 4 :(得分:1)

1500行=(每箱50-100行)* 20

你是对的。这是不合理的。

方法/函数尝试过多地执行方式

将其分解为适合某些实例变量,功能或类别的较小对象/函数。 (必要时重复)

(另外,那些定义是邪恶的)

答案 5 :(得分:0)

我认为您应该为每个案例创建单独的方法,并根据要求调用它们。

答案 6 :(得分:0)

继承对象,或者你应该尝试使用数组,取决于你如何使用switch

答案 7 :(得分:0)

除了创建数组或函数指针和跳转表之外,您还可以创建函数指针的映射。为此,boost :: assign :: map_list_of非常有用。

然后您可以使用find方法获取所需的元素。如果地图中缺少元素,则抛出异常或断言。

答案 8 :(得分:0)

一种方法是使用多态性:

不是在函数foo中放入一个巨大的case语句并使用某个参数调用它,而是使用虚方法。您将使用虚方法编写基类,然后为您当前拥有的每个case语句编写派生类。对于您当前拥有的每个case语句,您都可以覆盖基类虚方法。

例如,不是调用ptr-> foo(c),而是调用ptr-> foo()。这样编译器和虚拟表将为您进行切换。