我正在重构一些用 C 编写的旧遗留代码。这些代码耦合非常紧密,我正在努力将其重构为清晰的逻辑、松散耦合的模块。
在我早期的迭代中,我设法确定了逻辑模块 - 但是紧密耦合给我带来了问题,因为许多功能都对系统的其他部分有深入的了解。
我打算解决这个问题的方法是使用 extern 声明。希望下面的伪代码解释了这种情况:
假设我有两个逻辑上独立的模块 Foo 和 FooBar。每个模块都将被构建到一个单独的库中(FooBar 模块依赖于 Foo 模块)。
/*######################################*/
/* Foo Module */
/*######################################*/
/* Foo.h */
#ifndef FOO_MODULE_H
#define FOO_MODULE_H
void foo(int id);
int do_something();
...
#endif /* FOO_MODULE_H */
/* Foo.c */
#include "Foo.h"
extern int foobar(); /* defined in FooBar module (a separate library) */
void foo(int id){
int var;
switch (id){
case 1:
var = do_something();
break;
case 2:
/* the module that gets here, has the required functions defined in it */
var = foobar();
}
return var;
}
/*###############################*/
/* FOOBar module */
/*###############################*/
/* FooBar.h */
#ifndef FOOBAR_MODULE_H
#define FOOBAR_MODULE_H
#include "Foo.h"
int foobar();
void do_something_else();
...
#endif /* FOOBAR_MODULE_H */
/* source file */
int foobar(){
return 42;
}
void do_something_else(){
int ret = foo(2);
printf("Function returned: %d", ret);
}
这是将现有代码重构为逻辑上独立的模块同时允许链接到 libfoo.so 和 libfoobar.so 的可执行文件继续正常工作的有效方法吗?
我的基本假设是,仅链接到 libfoo.so 的模块将无法解析foobar()
- 但这应该没问题,因为它们不需要该函数,因此它们永远不必调用它。另一方面,对于链接到 libfoobar.so 的模块,当它们调用时foo()
,`foobar() 将被解析(函数定义在模块中)。
我上面描述的方案会按我的预期工作,还是有一些我遗漏的问题?