有时我会遇到需要多次执行一组代码但稍作修改的情况。考虑以下两种情况:
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
所以我在我的应用程序中创建了两个不同的函数。
但是,与B
或D
相比,A
或C
中的代码量非常小。
我不能仅为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
只是有很多数据流将每个集合分成不同的函数。
答案 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