[ C++で開発 ]

実装デザイン(パッケージ編)

パッケージに関する実装デザイン

ディレクトリ構成

シンプルで伝統的なディレクトリ構成

もっともよく目にする構成で、実装デザインを何も考えないとこのディレクトリ構成になります。小さなプログラムであればこの構成でも耐えられますが、ちょっと大きくなったり、複数開発者で共同作業すると作業に非効率が発生し、品質が劣化します。

シンプルなディレクトリ構成
[project top]
    +--- [include]
    |        a.h
    |        b.h
    |         :
    +--- [lib]
    |        libaaa.so
    |        libbbb.so
    +--- [src]
             a.cpp
             b.cpp
               :
注)ディレクトリ名には[]をつけている

複数パッケージのディレクトリ構成

複数のパッケージから構成されるディレクトリ構成です。

ディレクトリのトップレベルでパッケージ毎に分割

プロジェクトのトップレベルで、各パッケージ毎にディレクトリを用意します。各パッケージ用のディレクトリの中に、パッケージを構成するすべてのファイルを収容します。

複数パッケージのディレクトリ構成
[project top]
    +--- [base]
    |        +--- [include]
    |        |        base_a.h
    |        |        base_b.h
    |        |           :
    |        +--- [lib]
    |        |        libbase.so 
    |        +--- [src]
    |                 base_a.cpp
    |                 base_b.cpp
    |                    : 
    +--- [data]
    |        +--- [include]
    |        |           :
    |        +--- [lib]
    |        |        libdata.so
    |        +--- [src]
    |                    :
    :
注)ディレクトリ名には[]をつけている

パッケージの独立性が高いので、パッケージ毎に異なる組織(場所)で開発するなどに優位です。また、ファイルをリポジトリ管理している場合、開発に必要なディレクトリが固まっているので管理がしやすいなどの優位もあります。

include, srcディレクトリの下にパッケージディレクトリを置く

プロジェクトのトップレベルは、シンプルなディレクトリ構成と同様ファイルの種類別ディレクトリですが、それぞれの種類別ディレクトリの下にパッケージ毎のディレクトリを設けます。

複数パッケージのディレクトリ構成
[project top]
    +--- [include]
    |        +--- [base]
    |        |        base_a.h
    |        |        base_b.h
    |        |           :
    |        +--- [data]
    |        |        data_a.h
    |        |        data_b.h
    |        :           :
    +--- [lib]
    |        +--- [base]
    |        |        libbase.so
    |        +--- [data]
    |        |        libdata.so
    |        :           :
    +--- [src]
             +--- [base]
             |        base_a.cpp
             |        base_b.cpp
             |           : 
             +--- [data]
             |        data_a.cpp
             |        data_b.cpp
             :           :
注)ディレクトリ名には[]をつけている

パッケージ分割しているものの、全体が割と一枚岩で設計されている場合、ビルド設定ファイル(Makefile等)の記述が楽になります。が、保守性は少々低下します。