プログラム理解のための付加注釈 DocumentTag の提案
田中 昌弘 ††

石尾 隆 †

井上 克郎 †

大阪大学 大学院情報科学研究科〒 560-8531 大阪府豊中市待兼山町 1-3

オブジェクト指向プログラミングでは，カプセル化や継承・多相性などの機構によって，情報隠ぺいを実現している．その結果，ある 1 つのプログラム要素の詳細な動作を理解したいという場合であっても，継承やメソッド呼び出しによって関連するモジュールを調査する必要がある．これに対して，プログラム理解支援を目的としたツールや手法は多数提案されているが，開発者が理解した内容を効果的に記録・再利用する手段はあまり提供されていない．そこで本研究では，ソースコードの読解において理解した内容を効果的に記録するための付加注釈 DocumentTag を提案する．DocumentTag は，ソースコード上の識別子に対して直接記述する注釈であり，また，他の関連する識別子へと同一の注釈を関連付ける注釈伝播ルールを備えたものである．DocumentTag を統合開発環境 Eclipse の拡張機能として実装し，注釈伝播が情報の提示に有効であることを確認した．

DocumentTag: Source Code Documentation Environment toSupport Program Comprehension
Masahiro Tanaka††Takashi Ishio†

Katsuro Inoue†

Graduate School of Information Science and Technology, Osaka University
1-3 Machikaneyama-cho, Toyonaka, Osaka 560-8531, Japan

Object-Oriented Programming provides several mechanisms such as encapsulation, inheritance and polymorphism
for developers to hide implementation detail of a functional unit. Developers who want to inspect precise behaviorof a module have to inspect a number of modules that related to the module using class hierarchy and method callrelation. While many approaches are proposed to support program comprehension, a few tools focus on documentation of the result of comprehension tasks. In this paper, we propose a new documentation named DocumentTagfor developers to write a document for an identifier. DocumentTag has propagation rules that propagates the document of an identifier to other related identifiers. We have implemented DocumentTag as an Eclipse plug-in andconducted a case study. The result shows that DocumentTag effectively provides documents to developers.

-1-1umentTag の記述・閲覧ができる機能を持った

まえがき

構を効果的に用いることで，コーディング，テスEclipse プラグインの実装を行い，DocumentTagによる注釈伝播の有効性を評価する適用実験を行った．具体的には学生 4 人に対して，Java 言語で書ト，再利用の効率を向上させることができる [3]．

かれた既存のプログラムの拡張作業を実施し，注一方で，オブジェクト指向プログラミングを導釈伝播が識別子間の関連を把握する上で効果的で近年普及しつつあるオブジェクト指向プログラ
ミングでは，カプセル化や継承・多相性などの機入することにより，クラス間の継承関係や，動的あったことを確認した．

束縛といった新たなプログラム内の依存関係を把2 背景

握しながらプログラム理解を行うことが必要となオブジェクト指向プログラミングを導入するこる．この依存関係を把握するには，ツールによるとで，プログラム理解が困難になるという問題の理解支援が不可欠であるといわれている [8][12]．

主要な原因は，クラス階層が複雑になり，開発者プログラム理解支援を目的としたツールや手法がソースコード上を移動する負担が増えることには多数提案されているが [1][5][7]，理解した内容ある. この問題に対処するために，開発者が与えを記録・再利用する手段が効率的でないことが課た情報を基にソースコードの移動を支援する研究

題として残されている [6][9][10]．たとえば，コメがいくつか行われている．

ントとしてプログラム中に多数の注釈を散在させKersten らは，開発者が閲覧または編集を行ってると，プログラムの可読性が低下し，バグを発生いるメソッドやクラスに対して Degree Of Interestさせる危険がある [4]．また，プログラムとは独立というメトリクスを計算し，頻繁に操作しているした文書として記述する場合，ソースコードの変メソッドやクラスの集合だけを開発者に提示する

更に追従できずにプログラムとの不整合が生じる手法を提案している [7]．

ことがある．
いて理解した内容を効率的に記録するための付加Storey らは，開発者がソースコードコメント中に検索用のタグを埋め込む TagSEA というツールを提案している [10]．コメントに’@tag’ で始まる

注釈 DocumentTag を提案する．DocumentTag と文字列を開発者が記述することで，記述した内容はプログラムの識別子と関連付けられた注釈であが，位置情報とともに，注釈一覧として表示されり，開発者は識別子情報を入力として，注釈を参る．一覧から登録した位置に移動できるので，検照することができる．また，DocumentTag は他の索を行わずに効率的にソースコード内を移動でき関連する識別子へと同一の注釈を関連付ける注釈る．しかし適用実験の結果としては，開発者がコ伝播ルールを備えている．開発者がプログラムにメントの中に情報を直接記述することや，記述し含まれる識別子に対して，仕様や使用例などの注た内容をグループ間で共有することに抵抗がある

釈を DocumentTag として記録すると，その識別ことが判明している．その結果，記述した内容が，子だけでなく他の関連する識別子に対しても，記効率的に再利用されないままとなっている．

本研究では，開発者がソースコードの読解にお録した注釈が「関連する注釈」として付加される．

Oezbek らはソースコード上の移動を支援する

たとえば，あるクラスに対して，開発者がクラスの役割を DocumentTag として記述すると，そのEclipse の拡張機能として JTourBus というツールを提案している [9]．JTourBus は，開発者がコメン

クラスだけでなくサブクラスに対しても関連付け

ト中に’@JTourBusStop’ で始まる文字列を記述すが行われ，開発者がサブクラスの注釈を参照する

ることで，ソースコードを巡回する「ツアー」の 1

際に，関連付けされた DocumentTag も同時に参要素として登録することができ，開発者がソース照することができる．これにより開発者は，識別ツアーを選択すると，登録した’@JTourBusStop’ の子間の関連を把握しながら効率的なプログラムの箇所に順を追って自動的に移動する．ソースコード理解を行うことができる．

上の移動を自動化することで移動のための検索をDocumentTag の有効性を確認するために，Doc-する作業が軽減され，プログラム理解を効率的に-2-行うことができる．適用実験の結果として，コメン• 注釈伝播ルールの種類 type

トよりも’@JTourBusStop’ として記述する方が，保識別子 ident は，プログラム中に出現する任意守作業が効率化されるという結果にはなったが，よの識別子であり，変数，メソッド，クラスを意味り多くのメタ情報を記述できる Javadoc の方を利用する識別子が該当する．ここで，識別子は，宣言する方が効率的であるという結果が得られた．そのによって区別される．たとえばクラスを意味する

原因としては，JTourBus で記述した内容に対して，識別子 ArrayList はソースコードの複数の場所有効な再利用方法が確立できず，’@JTourBusStop’に出現しうるが，開発者がどの識別子の出現を選として記述した内容が効率的に再利用できなかっんだとしても，プログラムが参照するただ 1 つのたことが挙げられている．

ArrayList クラスの宣言に対して注釈が付与さ以上より，プログラム理解を目的とした手法やれる．これによって，DocumentTag は，同一の宣ツールは提案されているが，プログラムに直接記言を参照するすべての識別子の出現で，ソースコー述することへの負担がある点や，記述した内容をド上の定義位置に関係なく，情報を参照すること開発者間で共有・再利用することが困難である点がができる．この点は，Javadoc などの支援ツールに課題として挙げられている．また，識別子間の依存類似しているが，ローカル変数を含む任意の識別関係を基にした移動支援は行われず，ツールを用子に付与可能であるという点が異なる．

いたプログラム理解支援を行うには課題が残されている．本研究では，この課題に対して，識別子間DocumentTag はソースコードに直接記載されることはなく，宣言に関連付けられた別データとの関連を把握しながら，開発者の記述内容を効果して管理される．そのため，複数の開発者が同一的に共有・再利用する手段として，DocumentTagの識別子に独立した注釈を付与することができる．

を提案し，Eclipse プラグインとして実装した．

それらの注釈を区別，管理するために，記録した3日時，著者名も DocumentTag 情報の一部として付加注釈 DocumentTag の提案管理する．

DocumentTag は，プログラムの識別子に関連付けて記述する注釈であり，開発者は識別子情報を実際に text として記述する内容は，コメントや仕様書などに記述する内容と同様であり，具体的入力として，注釈を記録・参照する．本研究でのには以下のようなものを想定している．

注釈とは，プログラムに含まれる識別子に対して，• 識別子の仕様• プログラム内での役割や，一般的な扱い方，仕様や使用例などを記述した自然言語の文書である．また，DocumentTag は注釈伝播ルールを備え注意点，他の識別子との関連を記すている．注釈伝播とは，注釈を DocumentTag を• 識別子の使用例用いて記録することで，その識別子だけでなく関• 具体的な使い方をコード例を用いて説明する• バグレポート• バグ ID やバグの内容，再現手順を記述する

連する識別子に対しても，関連する注釈として付加されることである．これにより，開発者は直接関連付けられた識別子だけでなく，依存関係を持これらの種別を，開発者が検索，管理できるよつ識別子に対しても注釈を参照することができる．

3.1う，注釈のカテゴリ label を付与できるようにして付加注釈 DocumentTag の定義いる．

DocumentTag は，以下のデータ項目から構成さ

また，注釈伝播ルールの種類 type は，後述の注れる．

釈伝播を用いて開発者に関連する注釈を提示する• 関連付けられている識別子 ident

際に用いられる情報である．たとえば，親クラスか• 自然言語からなる注釈 text
• 注釈のカテゴリ label• 注釈の言語（ロケール） langら注釈が伝播された場合に，親クラスから注釈が伝播されたことを示す’Super’ が type の値となる．

• 記録した日時 time
• 著者名 author-3-図 1: 注釈伝播

3.2

注釈伝播

釈が付加される．開発者が局所変数 lineElementList

オブジェクト指向プログラムを理解する際，重の注釈を参照すると，局所変数 lineElementList と要となるのが，クラス間の継承関係や動的束縛と関連のある List クラスの注釈も同時に参照するこ

いった，識別子間の依存関係である．たとえば，あとができ，プログラム内の依存関係に沿った効率るメソッドの意味を調べるには，そのメソッドの的な理解を行うことができる．注釈伝播は，記録引数の型や戻り値の型の仕様を調べ，また，そこした 1 つの注釈がプログラム内の複数の識別子ににクラスが指定されていれば，そのクラス定義や付加されていくことと定義しているが，注釈を参継承関係を調べるといった作業が生じる．

照する開発者の視点で見た場合は，1 つの識別子

本研究では，識別子に対して付加された Docu-の注釈を参照した際に，関連する識別子に付加さmentTag を，関連する識別子へと自動的に関連付れた注釈も同時に参照できる機構であるといえる．

ける注釈伝播 (Document Propagation) を提案する．

本研究では，識別子間の関連の種類から，注釈ある識別子を開発者が参照するとき，その識別子伝播ルールを変数，メソッド，クラスの場合に大きに直接付与されている DocumentTag だけでなく，く分類し，以下のように各場合における注釈伝播関連する識別子に付与されている DocumentTagルールを提案する．なお，本手法で変数とは，Javaも同時に開発者へと提供することで，効果的なプ言語でのフィールド，局所変数，仮引数を指し，メログラム理解を行う．このことをコード例を用いソッドは，Java 言語のコンストラクタも含むものて説明する．とする．またクラスは，Java 言語の参照型であるクラス，列挙型，インタフェース，アノテーショ

図 1 は注釈伝播の模式図を表現したものである．
開発者が List クラスに注釈を記録すると，プログンを指すこととする．

ラム内に出現する全ての List という識別子に注釈• 変数宣言における注釈伝播が付加される．加えて，List クラスと関連のある識• 変数宣言の型 ⇒ 変数
• 変数初期化子に出現する識別子 ⇒ 変数
• メソッド宣言における注釈伝播別子にも注釈が付加される．図 1 では，局所変数

lineElementList は，List 型で宣言されているため，List クラスと関連があると判断され，プログラム内の局所変数 lineElementList のすべての出現にも注• 仮引数・戻り値・例外の型，仮引数の変数 ⇒メソッド-4-• 親クラスのオーバーライドされたメソッド ⇒クラス宣言における注釈伝播

メソッド

クラス間の親子関係に従って注釈伝播を行う．具体的には，クラス• 同一クラスでオーバーロードされたメソッド⇒ メソッドから，そのクラスの直接の子クラスとなるクラスへと注釈が伝播される．推移的に子クラスとなる• クラス宣言における注釈伝播• 親クラス ⇒ 子クラス

クラスには注釈伝播は行われない．これにより開発者は，クラスの役割を調査する上で必要となる直接の親クラスの注釈を，注釈伝播によって効果

変数宣言における注釈伝播

Java 言語で変数として宣言できるフィールドや局所変数，仮引数の宣言文に出現する型や初期値は，その変数の意味に的に調べることができる．

4 実装
本 研 究 で は ，DocumentTag を 統 合 開 発 環 境関連することから，注釈伝播の対象とした．具体

Eclipse のプラグイン DocumentTag Editor として実装した．開発者は，エディタ上で識別子を選択することで，識別子に対応した注釈と，その識別子と的には，変数宣言文中に含まれる変数の型から変数へと注釈が伝播され，また，変数の初期化子（初期値を記述した式）に出現する識別子から変数へ関連のある識別子の注釈を同時に参照することがと注釈が伝播される．これにより開発者は，型のできる．図 2 に DocumentTag Editor を組み込ん情報や初期化部分の情報を，注釈伝播によって効だ Eclipse のスクリーンショットを示す．図 2 の左果的に調べることができる．

下で開かれているビューが本研究で実装した Doc-変数の初期化部分から注釈伝播が行われる識別umentTag Editor である．テキストエディタ上の子はたかだか 1 つとした．具体的には初期化子でDeclarationRelatedPropagation クラスにカーソルを合わせており，DeclarationRelatedPropagation クラある右辺式について，2 項演算子を含まない項のうち最も最初に評価される項の中で，最後に評価スに対応した注釈と，スーパークラスである Prop-される識別子の DocumentTag だけが伝播される．

agationRule クラスの注釈が同時に表示されている．

例えば，初期化部分でコンストラクタ呼び出しの5 実験みが行われている場合は，コンストラクタの注釈が伝播され，文字列の連結などで 2 項演算子を含DocumentTag Editor を用いて適用実験を行っ

む初期化式では，最初に評価される項からのみ注た．学生 4 人に対して，Java 言語で書かれた既存釈伝播が行われ，後に評価される項は無視される．のプログラムの拡張作業を与え，作業時間などをこれにより，変数の初期化部分を開発者が把握す評価した．
具体的には，DocumentTag Editor 自身のソーる上で効果的な注釈のみを伝播し，多数の注釈がスコードに対して，その機能を拡張する課題を 2同時に伝播される問題を回避している．

つ用意し，それぞれを課題 a，課題 b として学生メソッドやコン4 人に順序を入れ替えて作業を行わせた．この実ストラクタの宣言では，メソッドの機能を理解する

験では，DocumentTag の特徴である注釈伝播が保上で引数や戻り値の情報が重要であると考え，注守作業に有効であるかを評価するため，3 章で述釈伝播を定義した．具体的には，メソッドの宣言

べた注釈伝播をすべて有効にした DocumentTagで出現する，戻り値の型・例外の型・仮引数の名前・仮引数の型から，メソッドへと注釈が伝播さ

Editor を用いて作業した場合と，関連する識別子への注釈伝播を無効にした DocumentTag Editor

れる．加えて，親クラスのオーバーライドされたを用いて作業した場合の作業時間を比較した．学

メソッドや，同一クラスのオーバーロードされた生に対する課題の割り当てや条件の割り当ては表メソッドからも同様に注釈伝播が行われる．これ

1 のように行った．

メソッド宣言における注釈伝播

により，開発者は，メソッドの引数の型や例外の実験の課題説明に用いた資料は，Web サイトに型，クラス内・クラス間のメソッドの関連を効果配備し，DocumentTag Editor のインストールな的に調べることができる．

ど実験環境の準備は，Web 上の資料に従って行う-5-図 2: DocumentTag Editor を組み込んだ Eclipse
表 1: 学生の課題の割り当て表
被験者ABCD

課題 1 回目
課題 a（有効）課題 b（有効）課題 a（無効）課題 b（無効）

り，統計的に有意差があるとは断定できなかった．

5.2 アンケート結果

課題 2 回目
課題 b（無効）課題 a（無効）課題 b（有効）課題 a（有効）

本節では課題を終えた学生 4 人に対して行ったアンケート結果について述べる．
アンケートでは，作業課題を終えた学生に，以下に挙げる内容について質問を行った．

• DocumentTag Editor を使用する利点について• 課題 a，課題 b，課題全体それぞれについてこととした．また作業を行うにあたって，Eclipseの操作方法や，課題の文章の意味を確認するため利点があれば回答する• DocumentTag Editor の改善点についての質問に対応するために，実験中は巡回して各被験者に応対した．ソースコードに関する質問に対• 作業課題を行う中で時間の要した作業について• コーディング・課題の理解・プログラム理解・バグ修正・Eclipse 上の操作のうち，時間のしては，一切回答を行わないこととした．

5.1

作業時間の比較

表 1 に従って，各課題 a，b を実施したところ，かかった順に覚えている範囲で回答する各課題の作業時間は表 2 に示す結果となった．こアンケートの回答を集計したところ，表 3 のよの作業時間は，Eclipse を起動して作業を開始し，うな結果となった．表 3(a) から，DocumentTag課題の動作確認を行い，Eclipse を終了するまでのEditor を用いて関連する注釈も参照できる環境が有効であるという回答が多く得られた．しかし，表時間である．
表 2 に示すように，注釈伝播が無効の場合よりも3(b) から，ツールとしての使いやすさに改善の余地があることが分かった．

有効の場合の方が，平均作業時間が短くなるという結果が得られた．しかし作業時間にばらつきがあ-6-また，時間のかかった作業として表 3(c)，3(d) と表 2: 各被験者ごとの保守作業にかかった時間

表 3(e)，3(f) とを比較すると，課題 1 回目と課題 2回はともにプログラム理解に多く時間を要してい被験者ることが分かった．また，課題 1 回目では課題 2

A（課題 a：有効．課題 b：無効）
B（課題 b：有効．課題 a：無効）C（課題 a：無効．課題 b：有効）
D（課題 b：無効．課題 a：有効）
平均時間

回目に比べ，とくにコーディングに時間を要する場合があることが分かった．
本研究で行った適用実験では，他識別子からの注釈伝播の機能が無効になっている場合と比べて，作業時間（分）有効
無効
131779198
6387
45165
82.50 106.75

注釈伝播を有効にした場合の方が平均作業時間の短縮が見られた．アンケート結果にも挙げられた

表 3: アンケート集計結果

通り，注釈伝播によってスーパークラスやメソッドの引数の情報を効率的に理解できたことが理由

項目
Eclipse 上で識別子を選択するだけで注釈を参照できる点あるクラスを選択するとスーパークラスの仕様も同時に参照できる点
あるメソッドを選択すると各引数の仕様も同時に参照できる点
ソースコードに書き込まずにメモを残せる点であると考えられる．
被験者の学習効果

被験者 A，D の作業時間に顕著に見られるように，注釈伝播の効果よりも，課題の順序が作業時間に大きく影響する結果となった．これは，Eclipse プラグインというドメインの知識を学習したことによる効果が考えられる [6]．

回答者

A,B,C,DA,DCC

課題 a と課題 b で対象となるソースコードの範囲(a) DocumentTag Editor を使用する利点

は，プラグインのメインクラス以外は互いに直接の依存関係を持たないので，対象となったプログ

く時間を要した被験者が 2 名見られる．その被験項目関連する注釈を閲覧する操作を簡単にしてほしい
注釈伝播の拡張を別プラグインから拡張できるようにしてほしい者の回答では，どう書いていいのか分からなかっ(b) DocumentTag Editor の改善点

ラムの知識よりも，コードの書き方を知るために多く時間を要したものと考えられる．実際にアンケート結果では，課題 1 回目でコーディングに多回答者B,DCたという理由が 2 名ともに挙げられた．課題 1 回目を終えることによって，コーディングによる拡作業の種類
プログラム理解コーディング
バグ修正

張方法を学習し，課題 2 回目では大幅にコーディングの時間を短縮したものと考えられる．

6

あとがき
本研究では，開発者が理解した内容を効果的に回答者A,DBC(c) 課題 1 回目で最も時間を要した作業記録するための付加注釈 DocumentTag を提案し，識別子に対応して注釈を記録できる環境を DocumentTag Editor として実装した．
適用実験として，DocumentTag Editor を用い作業の種類
プログラム理解
バグ修正て，注釈伝播が行われることでプログラム理解が効率的になることを作業時間を基に評価した．その結果，統計的な有意差は確認できなかったが，平回答者

A,C,DB(e) 課題 2 回目で最も時間を要した作業

均作業時間が短縮される結果となった．
今後の課題としては，構文的な識別子間の関連-7-

作業の種類
プログラム理解コーディング
課題の理解
バグ修正

回答者

CA
DB(d) 課題 1 回目で 2 番目に時間を要した作業

作業の種類
プログラム理
解
バグ修正
課題の理解

回答者

BA
D

(f) 課題 2 回目で 2 番目に時間を要した作業

だけでなく，より高度な注釈伝播の検討がある．たIn Proceedings of the the 6th joint meeting of

とえば，デザインパターン検出ツール [11] を併用
ソッドについての注釈を伝播する手法が考えられ

the 11th European Software Engineering Conference and the 15th ACM SIGSOFT Symposium on the Foundations of Software Engineer-る．また，定数伝播 [2] と同様にデータフロー関係

ing (ESEC-FSE ’07), pp. 341–350, 2007.

し，デザインパターン上で関連のあるクラスやメに従って注釈伝播を行うことにより，値の説明を[7] M. Kersten and G. C. Murphy. Mylar: a degree-

意味した注釈をデバッグに利用できるのではない

of-interest model for ides. In Proceedings ofthe 4th International Conference on AspectOriented Software Development (AOSD ’05),

かと考えられる．このように注釈伝播ルールを拡張すると，1 つの識別子に多数の注釈が伝播しうるため，複数の注釈を要約あるいは順位づけし，効果的に開発者に提示することも重要な課題である．

pp. 159–168, 2005.
[8] M. Lejter, S. Meyers, and S. P. Reiss. Support

謝辞
本研究は，日本学術振興会科学研究費補助金若手研究（スタートアップ）（課題番号:19800021）および日本学術振興会科学研究費補助金基盤研究（A）（課題番号:17200001）の助成を得た．

for maintaining object-oriented programs. IEEE
Trans. Softw. Eng., Vol. 18, No. 12, pp. 1045–1052, 1992.
[9] C. Oezbek and L. Prechelt. JTourBus: Simplifying program understanding by documen-

参考文献

tation that provides tours through the sourcecode. In Proceedings of the 23rd IEEE International Conference on Software Maintenance[1] P. Anderson, T. Reps, and T. Teitelbaum. Design and implementation of a fine-grained software inspection tool. IEEE Trans. Softw. Eng.,
Vol. 29, No. 8, pp. 721–733, 2003.

(ICSM ’07), pp. 64–73, 2007.

[2] S. Blazy and P. Facon. Partial evaluation as an[10] M.-A. Storey, L.-T. Cheng, J. Singer, M. Muller,

aid to the comprehension of fortran programs.
In Proceedings of the 2nd IEEE Workshop on

D. Myers, and J. Ryall. How programmers canturn comments into waypoints for code navigation. In Proceedings of the 23rd IEEE Inter-

Program Comprehension (IWPC ’93), pp. 46–54, 1993.

national Conference on Software Maintenance(ICSM ’07), pp. 265–274, 2007.

[3] J. Bloch. Effective Java (2nd Edition). Prentice[11] N.

Hall, 2008.

Tsantalis,A.

Chatzigeorgiou,G.

Stephanides, and S. T. Halkidis.
Designpattern detection using similarity scoring.

[4] S. Demeyer, S. Ducasse, and O. Nierstrasz.
Object-Oriented Reengineering Patterns. Chap-IEEE Trans. Softw. Eng., Vol. 32, No. 11, pp.
896–909, 2006.

ter 5.1 Tie Code and Questions. Square
Bracket Associates, 2008. http://www.
iam.unibe.ch/∼scg/OORP/.

[12] N. Wilde and R. Huitt. Maintenance support for
object-oriented programs. IEEE Trans. Softw.
Eng., Vol. 18, No. 12, pp. 1038–1044, 1992.

[5] M. Desmond, M.-A. Storey, and C. Exton. Fluidsource code views for just in-time comprehension. In Workshop on Software Engineering
Properties of Languages and Aspect Technologies (SPLAT ’06), 2006.
[6] T. Fritz, G. C. Murphy, and E. Hill. Does a programmer’s activity indicate knowledge of code?
- 8 -E