Edited at

extern をC++のライブラリから取り除く

More than 1 year has passed since last update.

ソースコードの保守性を改善するには、ライブラリの中に不自然な依存性をなくさなくてはならない。

そこで気づいたことをメモする。

たぶん、有名な本の有名な言い回しがあることだろうと思うのだが、とりあえず自分なりの表現で書いてみる。


原則:

ライブラリとして使おうとするモジュールがある。そのモジュールの中に、モジュールの外のスコープの変数に対する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を使うと、ヘッダファイルの依存関係をグラフ化できる。

依存性が奇妙な部分があれば、見つけやすい。