C/C++言語のソースコードのファイル間の関係の解析

Enterprise Architectでは、C言語のソースコード解析を行う場合には最低限の情報のみを読み込んで、「1ファイル=1クラス」として表現しています。Enterprise Architectで読み込む際には#include文は解析対象外ですので、ファイル間の関係を確認するという用途では利用できません。また、#defineで定義した内容をどこで利用しているのか、という点も、ソースコードの解析や修正の際には重要ですが、通常の機能では、#defineの宣言や利用も解析対象ではありません。

この制限を解決するために、アドインを活用することができます。これにより、ファイル間の関係や、ディレクトリ(フォルダ)間の関係などを把握するためにEnterprise Architectを活用することができます。以下の内容はC言語を想定した内容ですが、C++言語の場合でも同じ解析ができます。パッケージ間の解析や関係マトリックスでの表示については、Java等のその他の言語での利用も可能です。

解析手順

解析のための手順は次の通りです。

1. Enterprise Architectでの読み込み

Enterprise Architectで対象のソースファイルを読み込みます。なお、C言語の場合には、読み込み対象として、既定値の.hだけでなく.cも対象にして、ファイル単位での解析を行います。.cも対象にする場合には、以下の図のように、「ファイルの拡張子」の欄で「.c」と「.h」の両方を読み込むように設定します。C++言語(およびその他のオブジェクト指向言語)の場合にはクラス単位での解析となりますので、既定値のままヘッダファイルのみを対象にします。

(→操作方法はここをクリック)

○操作方法
プロジェクトブラウザで読み込み先となるパッケージを選択した状態で、プロジェクトブラウザの上部にあるツールバーの右端のメニューボタンを押し、「ソースコードの生成と読み込み」→「ソースディレクトリの読み込み」を実行します。表示される画面では、上の画像を参考に、読み込む位置などの設定を行ってください。

なお、C言語の場合には、事前に設定が必要な場合があります。ソースコードを読み込んでもクラスが生成されない場合には、「ホーム」リボン内の「オプション」パネルにある「プロジェクト」を実行してオプション画面を表示させ、「C」の設定グループにある「オブジェクト指向のサポート」を、「False」に設定してください。

ソースファイルの読み込みの詳細については、ヘルプファイルやPDFドキュメント「ソースコードの生成と読み込み 機能ガイド」をご覧ください。なお、読み込んだクラス図のクラス(ファイル)・クラスの操作(関数)・クラスの属性(グローバル変数)からは、ソースコードを表示することができます。ショートカットキーはCtrl+EあるいはF12です。

2. ステレオタイプの追加

C言語を対象にする場合、.hと.cの両方を読み込むと、モデル内には同名のクラスが2つ存在することになります。片方は.hから生成されたもので、もう片方が.cから生成されたものです。この2つを区別するために、headerおよびsourceのステレオタイプを追加することができます。

(→操作方法はここをクリック)

○操作方法
「アドイン・拡張」リボン内の「アドインメニュー」パネルに表示される「C/C++言語のソース解析」→「source,headerステレオタイプの追加」の項目を実行してください。ステレオタイプが追加され、クラス図内で判別できるようになります。「アドイン・拡張」リボン内に「C/C++言語のソース解析」の項目がない場合には、アドインのダウンロードとインストールが必要です。

さらに、Enterprise Architectが持つステレオタイプごとに自動的に色をつける機能を利用して、ヘッダファイル=黄色・ソースファイル=水色・構造体(struct)=オレンジ のような色づけをすると見分けやすいです。ステレオタイプごとの色の設定は、ヘルプファイルの「ステレオタイプの設定」のページをご覧ください。

(→操作方法はここをクリック)

○操作方法
「プロジェクト」リボン内の「リファレンス情報」パネルにある「UMLに関連する定義」を実行します。表示される画面で、「ステレオタイプ」の欄に「header」・対象要素として「クラス」を指定します。画面左下の「既定の色」の「内部」の色を、希望する色に設定してから「保存」ボタンを押して、設定の追加ができます。繰り返す場合には、「新規」ボタンを押して内容を消去してから追加してください。

なお、C++言語の場合には、上記のステレオタイプの設定や色の設定は不要です。

次に、目的に応じて次の「3a. include関係の追加」か「3b. define関係の追加」のいずれかを行います。両方を行うと項目間の関係の意味が不明瞭になりますのでお勧めしません。(2つプロジェクトファイルを作成してそれぞれソースコードを読み込み、別々に解析する事をお勧めします。)

3a. include関係の追加

対象のファイル間にて、include文での呼び出し・被呼び出しの関係を依存関係で表現します。

include文は、"で囲まれているファイル名のみが対象になります。また、#ifdefの類はすべて無視し、#include宣言のみを探して処理しています。C++言語の場合には、自動的に.cppファイルも探索します。なお、同名のヘッダファイルがある場合には、パスが異なる場合でも正常に動作しません。

解析した内容は、下の図のように「関係マトリックス」の機能を利用してマトリックス形式で表現することもできます。なお、下の図のようにファイル名で表示する場合には、右上のオプションボタンを押し、「オプション」→「別名で表示」にチェック を実行してください。

(→操作方法はここをクリック)

○操作方法
「アドイン・拡張」リボン内の「アドインメニュー」パネルに表示される「C/C++言語のソース解析」→「include関係の解析と追加」の項目を実行します。処理内容は、出力サブウィンドウに表示されます。
関係マトリックスは、「モデル」リボン内の「トレーサビリティ」パネルにある「関係マトリックス」を実行すると表示されます。上部に設定領域がありますので、「ソース」と「ターゲット」には、ソースコードを読み込んだパッケージを指定してください。「種類」はいずれも「クラス」に設定し、「接続」として「依存」を選択してください。


(ソースとターゲットのパッケージとして、ソースコードを読み込んだパッケージを指定します。要素の種類は「クラス」・接続の種類は「依存」を指定します。)

3b. define関係の追加

define文で定義されているマクロと、そのマクロの呼び出し(利用)の関係を依存関係で表現します。

実行すると、プロジェクトブラウザ内で選択されているパッケージに「DefinedObjects」パッケージを作成し、ソースファイル内のdefineされている文字列を、クラス要素として追加します。そして、このdefineを示すクラス要素に対して、そのdefineを利用しているそれぞれのソースファイル・ヘッダファイルとの間に依存関係を自動的に作成します。

作成後は、上記3aのように関係マトリックスを利用して状況を把握することもできます。

(→操作方法はここをクリック)

○操作方法
「アドイン・拡張」リボン内の「アドインメニュー」パネルに表示される「C/C++言語のソース解析」→「define関係の解析と追加」の項目を実行します。処理内容は、出力サブウィンドウに表示されます。

ここまでを実行すると、ファイル(あるいはクラス)単位でのクラス図を作成することができます。ディレクトリ間の関係を解析したい場合には、次に進みます。

4. ディレクトリ間の関係の解析

既存の無料アドインの「パッケージ間依存関係追加アドイン」を利用すると、ディレクトリ間の関係を図として表現することができます。C++の場合は、名前空間を利用している場合は名前空間が対象になります。

パッケージ図を1つ新規に作成し、ソースコードの読み込みで作成されたパッケージをプロジェクトブラウザからパッケージ図にすべてドロップしてください。その後、アドインを実行すると、ディレクトリ(パッケージ)単位での解析結果を確認することができます。

(→操作方法はここをクリック)

○操作方法
まず、新規にパッケージ図を作成します。プロジェクトブラウザでパッケージを右クリックして「ダイアグラムの追加」を実行し、「UML 構造図」グループにある「パッケージ図」を追加します。追加したパッケージ図に、解析対象となるパッケージを、プロジェクトブラウザからドラッグ&ドロップで配置してください。すべて配置したら、「アドイン・拡張」リボン内の「アドインメニュー」パネルから、依存関係追加アドインを実行してください。

また、関係マトリックス機能を利用すると、関係をマトリックス形式で確認することもできます。CSV形式で出力すればExcelなどで編集できます。

(→操作方法はここをクリック)

○操作方法
関係マトリックスは、「モデル」リボン内の「トレーサビリティ」パネルにある「関係マトリックス」を実行すると表示されます。上部に設定領域がありますので、「ソース」と「ターゲット」には、ソースコードを読み込んだパッケージを指定してください。「種類」はいずれも「パッケージ」に設定し、「接続」として「依存」を選択してください。

解析例

以下の内容は、オープンソースの「4p」(http://www.umlautllama.com/projects/4p/)の一部を対象にこの機能を利用した例です。

Enterprise Architectで読み込んだ場合(このページの手順「1」が完了した段階)には、1ファイル=1クラスとなります。構造体・共用体については、別のクラスとして抽出されます。以下の図は、読み込んだ結果です。ほとんどのクラスが、独立していることがわかります。


(この図は、読み込みが完了したモデルに新しいクラス図を作成し、すべてのクラス要素を配置しました。その後、属性と操作を非表示にした状態で、自動レイアウトを実行しています。)

次に、アドインでのinclude解析を実行します。これにより、ファイル間の関係をクラス図に反映することができます。以下の図は、解析結果を反映した図(このページの手順「3a」まで完了した段階)です。

この結果を基にパッケージ図を作成し、「依存関係追加アドイン」を実行すると、以下のパッケージ図のようにディレクトリ間の呼び出し関係を確認することができます。なお、表示されている数値は、include文で呼ばれている回数です。(実際の処理の呼び出し回数ではありません。)

←Windowsのディレクトリ構成   ↓解析結果のパッケージ図

Enterprise Architectの関係マトリックス機能を利用すると、以下のようなマトリックス形式で関係を確認することもできます。この内容は直接編集できませんが、CSVファイルに出力してExcelなどで活用することができます。


(ソースとターゲットのパッケージとして、ソースコードを読み込んだパッケージを指定します。要素の種類は「パッケージ」・接続の種類は「依存」を指定します。)

このようにして現状を目に見える形で把握することで、問題点の把握や改善案の検討に役立ちます。

C言語のソースコードのファイル間の関係の解析のアドインの利用について

C言語のソースコードのファイル間の関係の解析のアドインは、サポートが有効なお客様は誰でも利用できます。

アドインのダウンロードはこちらから。インストール方法は、リンク先のページの上部をご覧ください。