模块化功能执行不同操作的算法?

时间:2013-12-22 08:42:06

标签: c++ algorithm optimization

有时我会遇到需要多次执行一组代码但稍作修改的情况。考虑以下两种情况:

Case 1:
A
B
C

Case 2:
A
D
C

//A, B, C, D are used to represent a set of code lines

现在B&中的代码行之间没有相似之处。 D所以我在我的应用程序中创建了两个不同的函数。 但是,与BD相比,AC中的代码量非常小。 我不能仅为A&创建单独的功能。 C因为它们使用了一些常见变量,将这些变量作为参数传递会非常混乱。

所以看起来我的问题只有一个解决方案。 将两个案例合并为一个函数,并通过将bool作为参数传递给此函数来选择其中一个案例。然而,这导致维持非常大的尺寸功能。 所以我正在寻找一些更好的选择,因为我相信很多人肯定会遇到过这种情况。

修改 为了简单起见,我们只考虑一个字符串变量myString

A intialises it with some value.

B/D modify it according to some conditions.

C uses myString for some purpose, say write to file.

总而言之,有这样的数据流:

Case 1:
A -> B -> C

Case 2:
A -> D -> C

只是有很多数据流将每个集合分成不同的函数。

4 个答案:

答案 0 :(得分:1)

我能想到的选项:

  • 创建一个以A,B,C和D为函数的类。

    所有常见变量都可以是此类的成员变量。

  • 创建一个只存储所有公共变量的类。

    这可以通过引用传递给A,B,C和D(所以你只需传递一个变量)。

  • 考虑尝试重构它们,以便最大限度地减少它们使用的常见变量的数量。

    这可以在上述任何一种情况下完成,也可以单独使用。

    在不知道你究竟在做什么的情况下,我无法真正告诉你这是否可行,但你应该牢记这一点。虽然上面提到的参数类只是一个变量,但它实际上只是一堆变量的包装器 - 一个人仍然应该尝试最小化它们的数量。

答案 1 :(得分:0)

您可以做的一件事是将B和D定义为仿函数类:

// this is a functor
struct B_add {
  B_add(int x) : x_(x) {}
  int operator()(int y) { return x_ + y; }
  void set_x(int x) { x_ = x; }

private:
  int x_;
};

struct D_mult {
  D_mult(int x) : x_(x) {}
  int operator()(int y) { return x_ * y; }
  void set_x(int x) { x_ = x; }

private:
  int x_;
};

然后在long_function_that_takes_either_B_or_D

template <typename F> 
void long_function_that_takes_either_B_or_D(F & f) 
{
    A...

    f.set_x(result_of_a);
    int result_for_c = f(); //B or D

    C...
}

主:

int main(int argc, char **argv) {
    long_function_that_takes_either_B_or_D(B_add(42));
    long_function_that_takes_either_B_or_D(D_mult(24));
    return 0;
}

答案 2 :(得分:0)

它制动OO设计,但我认为你可以尝试将它安排到一个类

#include <stdio.h>

class SimpleClass
{
    public:
    SimpleClass(void){}
    void someFunction(void (* zprintf)(const char *) ) //zprintf is pointer to  B or D functionality
    {
        printf("calling zprintf function\n"); //This is your A code
        zprintf("hey");
        printf("called zprintf function\n"); //This is your C code
    }   
    ~SimpleClass(void)
     {}
};

然后像这样使用它:

void zprintf1(const char * str )
{
    printf("i'm printing %s\n", str);
}


void zprintf2(const char * str )
{
   printf("I don't want to print %s\n", str);
}

。 。

SimpleClass simpleClass;
simpleClass.someFunction(zprintf1);
simpleClass.someFunction(zprintf2);

这是一个我知道的黑客,但你可以让它变得更漂亮。

答案 3 :(得分:-1)

使用define生成代码。

// A
if (runB)
    // B
else 
    // D
// C