pImpl イディオムとは C++ のクラス設計において private 変数や private メソッドをヘッダファイルに配置しないための手法です。
このプロジェクトでは、多くの C++ のクラスで pImpl イディオムを使っています。
例として、長方形の辺の長さをコンストラクタで受け取り、面積を返すクラスを考えます。 pImpl イディオムを使わない場合、例えば以下のような実装になります。
ヘッダ
ソース
また pImpl を使った場合は、以下のような実装になります。
ヘッダ
ソース
pImpl イディオムを使うと、ヘッダファイルから private 変数の x_, y_ という変数がなくなるかわりに pimpl という private 変数が追加されています。また、ソースコードからは area() 関数が pImpl 構造体に移動しています。
この変更により実現できたことは「ヘッダファイルから実装の詳細を取り除く」ということです。このことにより、
という利点が得られます。
大抵の場合、ヘッダファイルが変更されると、そのヘッダファイルを include しているソースコードのコンパイルも必要になります。つまり Rectangleon.h というファイルを3つのソースコードが include している場合は、それら 3つのソースコードの再コンパイルが必要になります。
pImpl イディオムを用いて、コードの変更が Rectangleon.h から Rectangleon.cpp になれば、再コンパイルが必要になるのは Rectangleon.cpp 1つのみにできます。
また、最後に pImpl イディオムを導入するデメリットを説明します。
pImpl イディオムを導入すると、クラスのコンストラクタ時に pImpl オブジェクトを new するコストと pimpl の変数やメソッドにアクセスするときに pimpl オブジェクトを介してアクセスするだけのコストが生じます。また、コードは多少繁雑になります。