ソースコードの保守性を改善するには、ライブラリの中に不自然な依存性をなくさなくてはならない。
そこで気づいたことをメモする。
たぶん、有名な本の有名な言い回しがあることだろうと思うのだが、とりあえず自分なりの表現で書いてみる。
###原則:
ライブラリとして使おうとするモジュールがある。そのモジュールの中に、モジュールの外のスコープの変数に対するexternの記述があってはならない。
externで宣言された変数の存在のために、そのモジュールの単体テストが困難になる。保守性が低下してしまう。だからライブラリとして使おうとする関数の中には、モジュールのスコープの外にある変数に対する参照があってはならない。
###対策1:クラスのデータメンバーへの変更
クラスの中で使われている変数であったら、クラスのデータメンバーとして、その変数を使うように設計変更する。
extern std::string hoge;
とするよりは、
クラスのメソッドの中で値を設定し、それを参照するようにする。
void setHoge(std::string hoge){
this->hoge=hoge;
}
そのようにすれば、クラスを使う側のコードにだけ、当初のhogeだけが記述されるようになる。
そうすることで、設計の不自然さがなくなる。
###対策2:関数の引数を利用することで、モジュールの外に出す。
関数の中でhogeというexternで宣言されている変数のはたしている役割を
void func1(double x);
だったものを
void func1(double x, std::string var);
として
func1(x, hoge);
として参照するようにする。
そうすると、モジュールの中のグローバルスコープで
extern std::string hoge;
とする必要はまったくなくなる。
この対策の記述が、あなたの抱えるソースコードの改善に役立つと幸いです。
付記:
Doxygenを使うと、ヘッダファイルの依存関係をグラフ化できる。
依存性が奇妙な部分があれば、見つけやすい。