私はCで書かれた古いレガシーコードをリファクタリングしているところです。コードは非常に緊密に結合されており、明確な論理的で緩く結合されたモジュールにリファクタリングするのに苦労しています。
私の初期の反復では、論理モジュールを確認することができましたが、多くの関数がシステムの他の部分についての深い知識を持っているため、密結合が問題を引き起こしています。
これを修正する方法は、extern宣言を使用することです。以下の擬似コードは、状況を説明していると思います。
論理的に分離した2つのモジュール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()が解決されます(関数定義はモジュール内にあります)。
上記で説明したスキームは期待どおりに機能しますか、それとも私が見逃している落とし穴がありますか?