LoginSignup
7
7

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-11-17

ソースコードの保守性を改善するには、ライブラリの中に不自然な依存性をなくさなくてはならない。
そこで気づいたことをメモする。
たぶん、有名な本の有名な言い回しがあることだろうと思うのだが、とりあえず自分なりの表現で書いてみる。

原則:

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

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7