简化复杂的方法

时间:2014-02-03 11:04:18

标签: c++ c simplify

我有一个方法基本上是if - else的长列表,其深度可变(有时非常深),因为它解释了一个字节数组并依赖于每个字节的值做一些不同的事情,例如从数组中“读取”更多内容并再次检查它们的某些值,或者它有直接的操作。像这样:

char current = array[current_index ++];
if(current == 1)
{
    char something = array[current_index ++];
    if(something == 2)
    {
         // open the fridge
    }
    else
    {
         char something_else = array[current_index ++];
         if(something_else == 3)
         {
             // make me a cake
         }
         else
         {
             // bring me a beer
         }
    }
}
else
if(current == check_this(another_variable))
{
     // so something else
}

我正在努力简化整个混乱局面。因此,为了摆脱if的第一级,我创建了一个函数指针数组,将if的主体提取到特定的函数中,基本上看看数组是否有一个元素用于给定current并执行该函数(作为副作用,这会略微降低执行速度并大大降低可读性)。

一个简短的例子

命令列表:

1 - 食物 2 - 喝 3 - 回家 4 - 温暖 5 - 冷 6 - 肉 7 - 番茄

所以:1 4 6 - 会给我烤肉(或者至少根据申请的实施情况而定) 和2 7 - 会给我番茄汁...... 和3 - 退出。

编辑switch - case构造在此方案中并不总是可用,因为有时会检查current与函数的返回值。

所以问题是:我很好奇你会用什么其他技术来解决这类问题。

3 个答案:

答案 0 :(得分:2)

您可以使用与Command模式类似的内容。创建一个字典,其中键可能是array中元素的值,值将是指向相应函数的指针,如:

{
1 = (*open_the_fridge),
2 = (*make_me_a_cake),
...
}

然后你可以遍历array并执行相应的功能。

伪代码:

func_map{1=(*open_the_fridge), 2=(*make_me_a_cake),...}
for (i = 0; i < length(array); i++) {
    (*get_value_from_dict(func_map, array[i]))();
}

答案 1 :(得分:0)

它看起来像决策树 - 您可以使用所有可能的结果组合来初始化此树,然后编写一个循环来搜索输入组合并返回结果。结果可以是字符串或命令(如其他答案所示)

答案 2 :(得分:0)

根据您对评论的回答,我认为您应该更改您的&#34;范例&#34;并将您的数组结构转换为具有有意义属性的元组或对象。 关键是看起来并非所有&#34;执行路径&#34;将需要相同数量的参数,但OO封装应该帮助您处理。 因此,您必须在生成数组的原点解决问题。 如果这是不可能的,因为它是一个你无法修改的库或代码,你应该编写一个适配器,以便你可以正确处理。

然后,在问题C和C ++标签中指定。根据您想要采取的方法,社区可以提供有关特定解决方案的更多详细信息。

工厂(或类似工厂)模式可以帮助您创建适当的对象或元组。 一种更简单的方法可能是更改方法的签名以获取3个参数:操作,参数,指定的对象类型。