我有两个函数,它们只在一个参数(不同的结构)上有所不同,几乎完成相同的处理,导致大量的代码重复。请参阅以下简化示例:
struct foo {
int a;
};
struct bar {
int a;
int b;
};
foo(struct foo *f) {
do_b();
// error handling
f->a = 1;
do_c();
// error handling
do_d();
// error handling
}
bar(struct bar *b); {
do_a();
// error handling
b->b = 2;
do_b();
// error handling
b->a = 1;
do_c();
// error handling
do_d();
// error handling
}
是否有一些聪明的方法只使用一个功能来消除代码重复?
答案 0 :(得分:4)
是的,但不是你想象的那样。保持类型安全是非常有益的,摆脱它(使用指向void或struct interitance的指针)并不符合你的最佳利益。
如果由于某些有意义的原因有两种不同的类型被定义为单独的类型,那么 应该有两个单独的函数来获取这些类型。
在这种情况下你应该做的是删除这些功能中的重复:
first( int* a )
{
do_b();
// error handling
*a = 1;
do_c();
// error handling
do_d();
// error handling
}
foo(struct foo *f) {
first( &f->a );
}
bar(struct bar *b); {
do_a();
// error handling
b->b = 2;
first( &b->a );
}