日本ソフトウェア科学会第 32 回大会 (2015 年度) 講演論文集

ソフトウェア保守のための UML シーケンス図維持支援
丸山 翔平

上田 賀一

大規模化・複雑化したシステムを開発するためにオブジェクト指向設計書が用いられる．しかし短納期・低コストでの開発現場の保守作業では，プログラムだけが変更され、設計書の保守が滞る状況にある．このような設計書はプ
ログラムの誤った理解に繋がるため，プログラムと設計書の対応関係維持が重要な課題となる．本研究では、UMLシーケンス図において対応関係を維持するため、プログラムとの差異を検出する手法を提案する．本手法は，変更前のシーケンス図とプログラムとは対応が取れていることを前提に，変更後の差異を実行履歴と制御構造の解析によるリバースエンジニアリングで捉えるものである．この際の問題点であるプログラムとシーケンス図の抽象度の違いの扱う方を考慮し，支援する手法である．

Object-oriented design document is used to develop a large-scale and complicated system. However, if themaintenance work in the development field that require quick-delivery and low-cost, only the program ischanged, it is in situations where design document maintenance stagnates. Such design document causes
the wrong program understanding, to maintain the correspondence between the program and the design
documents is an important issue. In this study, in order to maintain in the correspondence between theUML sequence diagram and the program, we propose a diﬀerence detection approach. This approach presupposes that the sequence diagram correspond to the program, and is taken diﬀerence after the changein reverse-engineering by the analysis of the execution trace and control structure. It is an approach thatconsider the problems how to treat the diﬀerence in the level of abstraction between the sequence diagram
and the program.

る手法を提案する．更新前後のプログラムからリバー

1 はじめにスエンジニアリングによってシーケンス図をそれぞれ大規模・複雑化したシステムを開発するために UML取得し，これらを比較することでシーケンス図で差異などのオブジェクト指向設計書が用いられる．この設を捉える．また，シーケンス図のうち更新前後で未変計書はシステムの保守作業でソフトウェアを理解する更である要素は，更新前プログラムの基となったシー際に用いられる．しかし短納期・低コストの実現を目ケンス図の情報と置換することで，既存シーケンス図指す保守作業では，プログラムだけが変更され，設計に近い抽象度で見ることができる．本手法を用いるこ書の修正が滞ることが報告されている [1]．このようとで，対応関係が取れない状況を解決し，ソフトウェな設計書はプログラムの誤った理解に繋がり，以降のア保守作業を助けることができる．

保守作業に支障がでる．そのため，プログラムと設計書の対応関係維持が重要な課題となる．
そこで本研究では，UML シーケンス図において対応関係を維持するため，プログラムとの差異を検出す

本手法では，先行研究 [2], [3] を参考に，いくつかの問題点をシーケンス図とプログラムの差異を検出する．また本手法では従来手法のいくつかの問題点の解決を図っている．
以降，従来手法の概要と問題点，および本稿の提案

Supporting to Keep Up UML Sequence Diagram for
Software Maintenance
Shohei Maruyama, Yoshikazu Ueda, 茨城大学, Ibaraki
University.

手法について第 2 章で説明し，提案手法を用いた適用例について第 3 章で述べる．実験結果を踏まえて第 4 章で提案手法について考察し，第 5 章で本研究

の結論を述べる．

2. 2. 1 実行履歴生成
プログラムを実行し，単一または複数の実行履

2 提案手法歴を取得する．本手法では C1 網羅した単一また

この章では，シーケンス図とプログラムの差異検出

は 複 数 の 実 行 履 歴 を 用 い る た め ，す べ て の パ ス

手法を示す．先行研究による従来手法およびその問題を１度通るようにプログラムを実行する．実行履

点，提案手法を説明する．

歴集合は E = {e1 , e2 , ..., en} とし，各実行履歴は

e = {s1 , s2 , ..., sm} と表記する．ここで s は 1 回の
2. 1 従来手法

メソッドの呼出し情報で，メソッドの呼出し元，呼出2. 1. 1 概要

し先の情報をまとめたものである．

プログラム更新前後の差異をシーケンス図として

2. 2. 2 ラベル化

捉える手法の先行研究 [3], [2] がある．手法では更新前取得した実行履歴 E をラベルへと変換する．ラプログラムとシーケンス図の対応関係が維持されてベル集合は L = {l1 , l2 , ..., lo } とし，各ラベルは l =いることを前提として，更新前後のプログラムから{srcLabel, srcLine, dstSignature, dstP ath, dstLine,シーケンス図を取得する．シーケンス図間の差異からdstInstanceID, dstDetph, messageT ype, labelID} と変更点を捉えることができる．このシーケンス図は表記する．ラベルの各要素の内容を表 1 に示す．

リバースエンジニアリングによって生成されるため，表1抽象度が低く可読性が低くなる問題がある．先行研

ラベル情報

究では更新前後での未変更点を，変更前プログラム

種別内容の基となった既存シーケンス図の情報と置き換える．

srcLabel

呼出し元のラベル

これによって一部の抽象度を既存シーケンス図のレベ

srcLine

呼出し元のソースコード内の行ルまで引き上げることができる．

dstSignature

呼出し先メソッドシグネチャ

dstPath

呼出し先ファイルへの相対パス

dstLine呼出し先行番号

dstInstanceID

呼出し先インスタンスの ID

dstDepth

呼出し先の深さmessageType

メッセージの種類

labelID

ラベル識別子2. 1. 2 問題点
先行研究ではいくつかの問題点がある．

• 複合フラグメントを抽象化できない複合フラグ
メントの対応付けを行っていないため，リバースした図の複合フラグメントを抽象化できない• alt,opt,loop 以外の複合フラグメントに対応できない既存シーケンス図に ref,par などがあった場合に対応できない．
本稿では，上記の問題点を解決した手法を提案す

全てのメソッド呼出し情報を，表 1 に合わせてラる．手法はリバースエンジニアリング手法，差異検出ベルへと変換する．labelID は一意の値をそれぞれ与手法に分かれる．以降でそれぞれを説明する．

え，それ以外の情報はメソッド呼出し情報から取得する．また，メソッド呼出し情報 s と s′ の情報が一致

2. 2 リバースするとき，s = s′ とする．このとき，s と s′ から得リバースエンジニアリング手法の概要を図 1 に示す．

られるラベルは同じものとし，s′ はラベル化を行わリバースエンジニアリング手法は実行履歴生成，ラない．

ベル化，モジュール生成，制御構造解析，モジュール

2. 2. 3 モジュール生成

結合，シーケンス図生成の順で行う．

全ラベルを，呼出し元ラベルが同じもの同士まとめていく．このラベルの集合をモジュールと呼ぶ．モ
ジュール集合は M = {m0 , m1, m2 , ..., mo} とし，各図1

リバースエンジニアリング手法の概念図

モジュールは m = {srcLabel, dstLabels} と表記す

メントの開始を lopt start ，終了を lopt end とすると，る．ここで srcLabel はモジュールの呼出し元ラベル，lopt start .type = opt start，lopt end .type = opt end

dstLabels は srcLabel から呼び出されるラベルの集となり，ラベルの順序は lopt start , lk , lopt end となる．

合で，dstLabels ⊂ L となる．また，各モジュールの制御構造解析手順を示す．

持つラベルは dstLine によって順序付く
表2以降集合内の情報を「集合名. 情報名」で表す．こフラグメントラベル情報

こでは，ラベルの持つ情報は「ラベル. 情報名」，モ

種別ジュールの持つ情報は「モジュール. 情報名」となる．

srcLabel

呼出し元のラベルモジュール生成手順を示す．

srcLine

呼出し元のソースコード内の行

type

フラグメントの種類

guard

ガード条件 (文字列)labelID

ラベル識別子モジュール生成手順

1. 各ラベル l ∈ L に対し，l = srcLabel となるモジュール m を生成する．

内容

2. m.srcLabel に l を格納する．
3. 各 モ ジュー ル m ∈ M に 対 し ，L か らl′ .srcLabel = m.srcLabel を満たすラベル l′ を制御構造解析手順抽出し，m.dstLabels に追加する．

1. 各 モ ジュー ル m∈

M に つ い て ，

2. 2. 4 制御構造解析

m.srcLabel.dstP ath, m.srcLabel.dstSignature

各モジュールに対し制御構造解析を行うことで，から解析対象メソッドを取得する．

基本制御構造の検出とガード条件の取得を行う．制
御構造解析には実行履歴取得時に実行したソースコードを使用する．dstLabel に複合フラグメント

2. 対象メソッドに対し制御構造解析を行い，基本制御構造とガード条件を取得する．

3. 基 本 制 御 構 造 内 部 の メ ソッド 呼 出 し∈を表すラベルを追加する．フラグメントラベルのと ラ ベ ル dstLabelm.dstLabels の持つ情報を表 2 に示す．フラグメントの種類とは，

dstLabel.dstSignature, dstLabel.dstLine を比alt, opt, loop の 3 つのフラグメントの開始，分岐，較し，情報が一致するラベルを探す．

終了のいずれかを表す．例えば，あるラベル lk が4. 一致するラベルがあった場合，一致するラベルopt フラグメントに囲まれる場合，この opt フラグ全てを囲うように，開始，分岐，終了のフラグメ

ントラベルを追加する．

2. 3 差異検出5. 追加したフラグメントラベルの labelID に，同じ識別子を格納する．

前節で生成したシーケンス図を，既存シーケンス図の抽象度まで引き上げる．また，既存シーケンス図と6. 対象メソッド内の全てのメソッド呼出しを解析した後，dstLabel ∈ m.dstLabels と比較し，srcLine，呼出し先のメソッド名が等しく，かつ′抽象化したリバースシーケンス図との差異を検出する．抽象化手法の概要を図 2 に示す．
抽象化手法は更新前後プログラムのリバースエン

呼出し先クラスが異なるラベル dstLabel を探す．

ジニアリング，既存シーケンス図のラベル化，ラベル

7. dstLabel′ が 存 在 し た 場 合 ，dstLabel との紐付け，置換の順で行う．また，更新後のリバース′dstLabel を囲うように alt フラグメントの開エンジニアリングの手順で得られる情報を用いて，変始，分岐，終了を追加する．

更点を差異として検出する．

8. 追加したフラグメントラベルの labelID に，同じ識別子を格納する．

2. 3. 1 更新前後のリバースエンジニアリング
更新前プログラムに対して，2. 2 節の手法を使用

手順 6 から 8 では，オブジェクト指向の動的束縛にし，リバース情報を生成する．更新前プログラムは設対応している．C1 網羅した実行履歴に現れないメソッ計書と対応関係が維持されていることを前提とする．

ド呼出しはその場で起こりえないため，dstLabels 内

ここでは更新前の対象シナリオを網羅した実行履のラベル以外のメソッド呼出しは解析の際に考慮しな

歴，更新前のソースコードを使用し，更新前リバース

い．また，dstLabels 内のラベルが関係しない制御構

情報 (ラベル情報，モジュール情報，ガード情報，結造は，プログラムの処理に影響を与えないため無視合モジュール，シーケンス図) を取得する．ここで取する．

得した結合モジュールを mrgMbef ore とする．

2. 2. 5 モジュール結合
制御構造解析後のモジュール全てを結合し１つの結合モジュールを生成する．結合手順を示す．
モジュール結合手順

更新後プログラムに対してシーケンス情報を取得する．更新前と同様，更新後リーバス情報を取得する．ここで取得した結合モジュールを mrgMaf ter とする．

1. 結合モジュール mrgM を生成する．

2. 3. 2 既存シーケンス図のラベル化

2. 各モジュール m ∈ M について，m.srcLabel

既存シーケンス図のラベルと更新後リバース情報のと一致するラベルを他モジュールのラベル集合

ラベルを比較するために，既存シーケンス図をラベル′′{m .dstLabels | m ∈ M } から探す．
3. 一致するラベルが存在する場合，そのラベルの次の要素に m.dstLabels を挿入する．

4. 最 後 に 結 合 し た モ ジュー ル の dstLabels をmrgM.dstLabels に格納する．

化する．既存ラベル群は，Lexist = {le1 , le2 , ..., len }と表記する．メッセージを表す既存ラベルは le ={srcLabel, dstSignature, messageT ype, reverseLabels}
を ，複 合 フ ラ グ メ ン ト を 表 す 既 存 ラ ベ ル は le ={srcLabel, type, guard, reverseLabels} をそれぞれ

2. 2. 6 シーケンス図生成

要素に持つ．reverseLabels はこのラベルと紐付く更結合モジュールからシーケンス図を生成する．生成

新前リバースラベル群を表す．既存シーケンス図のラは結合モジュールのラベル集合 mrgM.dstLabels をベル化の手順を示す．

先頭から順に変換する．以上の手順でソースコードの既存シーケンス図のラベル化手順

実行履歴，制御構造の解析によってシーケンス図を生

1. 結合モジュール mrgMexist を生成する．

成する．

2. 既存シーケンス図の Call メッセージ，複数フラグメントを上から順に参照する．

3. 参照要素がメッセージだった場合• srcLabel に遷移元となるラベルを格納する．

図2

抽象化手法の概念図• dstSignature にメッセージ名を格納する．の定義，abstSignature は抽象レベルのメソッドシ• メッセージの終点がライフラインの場合はグネチャ,cncSignatures は対応する具象レベルのメ

messageT ype に Call を，ref フラグメントソッドシグネチャの集合を表す．の場合は Call ref を格納する．

ラベルの紐付けは，初めにメソッド呼出しラベルを• labelID に一意の値を格納する

全て紐付けし，その後複合フラグメントラベルを紐付

4. 参照要素が複合フラグメントだった場合けする．ラベルの紐付けの手順を示す．

• srcLabel に遷移元となるラベルを格納する．

ラベルの紐付け手順• type に複合フラグメントの種類を格納する．

1. メッセージラベルを紐付けする．

• guard にガード条件を格納する．
• LabelID に一意の値を格納する．
5. mrgMexist .dstLabels に生成したラベルを格納する．

2. 3. 3 ラベルの紐付け(a) ク ラ ス 定 義 msgDef∈classDefに つ い て ，msgDef.absSignature=le.dstSignature と な る 既 存 ラ ベ ル le ∈mrgMexist .dstLabels を探す．
(b) msgDef.cncSignatures =クラス定義書の情報を用いて，2. 3. 2 節で生成した

lb .dstSignature(lb ∈ Lbef ore ) となる更新前既存ラベルに対し，対応する更新前リバースラベルをリバースラベルを持つラベル群 Lbef ore ⊆紐付ける．クラス定義書は，抽象レベルのメソッドと具象レベルのメソッドの対応関係が記述されているものとする．よって，クラス定義書から既存ラベルが，どの更新前ラベルと対応しているかを読み取ることができる．
クラス定義書は classDef = {msgDef1 , msgDef 2,..., msgDefp } とし，msgDef = {(abstSignature,cncSignature)} と表記する．msgDef はメッセージ

mrgMbef ore .dstLabels を全て探す．
(c) le.reverseLabels に Lbef ore を全て格納する．

2. 複合フラグメントラベルを紐付けする．
(a) 既存ラベル le ∈ mrgMexist .dstLabels について，複合フラグメントを表すラベルのみを順に参照する．

(b) このフラグメントラベル le が囲む既存

メッセージに対応するリバースメッセージ全を用いて，既存シーケンス図と抽象化シーケンスてを囲んでいる更新前リバースフラグメン

図の変更点を検出する．mrgMbef ore .dstLabels とトラベル l′ ∈ mrgMbef ore .dstSignature を

mrgMaf ter .dstLabels のラベル情報を比較し，更新探す．

前後で同じラベル，新しいラベル，削除されたラベル(c) 見つかった場合は，le.reverseLabels に l′を格納する．

がそれぞれあるかどうかを調べる．ラベル情報の比較は，srcLine を除く全てのラベル情報の一致で行う．

紐付けを行うと，既存ラベルに更新前リバースラベ

srcLine は，更新後ソースコードの呼出しの行数のみルとの対応関係を与えられる．本手法では，既存シーの変更 (コメントの追加など) を同じラベルと判断す

ケンス図のラベル化時に複数フラグメントもラベルるためである．同じラベル，新しいラベル，削除され化する．これによって先行研究で対応できなかった複たラベルの有無の組み合わせによる更新後の呼出し合フラグメントの抽象化を行える．

関係の変更内容を表 3 に示す．各種のラベルが存在す2. 3. 4 置換

る場合は◯，存在しない場合は×と表記する．

紐付けた情報を元に，更新後リバース情報の一部を
表3

既存シーケンス図の情報と置き換える．更新後リバー

呼出し関係の変更内容

ス情報のうち，既存ラベルと一致するメッセージ，複同じラベル

新しいラベル

削除されたラベル変更内容

合フラグメントを置き換える．置換の手順を示す．

◯◯

◯

追加と削除

◯

◯

×追加

◯×

◯

追加

◯××

変更なし

×◯

◯

新規×

◯×

新規××

◯

全削除

×××

変更なし

置換手順

1. 更新後リバースラベル la ∈ mrgMaf ter .dstLabelsを順に参照する．

2. 既存ラベル le ∈ mrgMexist .dstLabels について，la ∈ le.reverseLabels となる le を探す．

3. 見つかった場合は，la を le に置換する．
• le がメッセージで，かつ遷移先が ref フラグメントだった場合，このラベルから呼出されるラベルとひもづいたラベルを除いた全3 適用例てを ref フラグメントに置き換える．

本手法を Java プログラムに対して適用し，シーケ

4. la より深い位置のラベルで，置換できないラベンス図の抽象化と差異検出を行う例を示す．

ルは取り除く．
置換を行うと，更新後シーケンス図のうち，未変更

3. 1 適用対象

点が既存シーケンス図のもので置き換えられ，抽象適用対象は Java によるオブジェクト指向で開発さ化シーケンス図を得ることができる．そのため未変れたツールである．ツールは本手法の手順の一部であ更点については既存シーケンス図の抽象度で更新後る実行履歴のラベル化を自動化したものである．更新

リバースシーケンス図を見ることができる．また，新前では，リバース器クラスからローダクラスにアクセたに追加されたラベルや変更があったラベルは置換スし，実行履歴読み込む．その後ラベル化クラスでラされないため，そのまま表示される．これによって，ベル化を行う．既存設計書ではリバース器クラスから既存シーケンス図と更新後プログラム間での変更点

ローダクラスによる実行履歴読み込み，ラベル化クラを容易に知ることができる．

スによるラベル化への処理がそれぞれ ref フラグメン

2. 3. 5 差異検出

トによって別シーケンス図に記述されている．更新後更新前後のリバースエンジニアリングによってではラベル化シーケンス図内で，新たに作成したラ得られた結合モジュール mrgMbef ore , mrgMaf ter

ベルが既存ラベルかどうかを判定する処理を追加している．ツールの更新前プログラムは設計書との対後プログラムから得られた抽象化した図を図 6 にそ応関係が維持されているが，更新後プログラムでは，れぞれ示す．また，ラベル化の処理を表す図 4 を抽象修正された設計書は存在せず，対応関係が取れていな化した図を図 7 に示す．

い．このツールに対し，設計書と更新後プログラムとの差異を検出する．このプログラムの既存設計書として，全体のシーケンス図，ラベル化の処理のシーケン
ス図を図 3，4 に示す．

図3

適用対象の既存シーケンス図

図5

図4

更新前リバースシーケンス図

適用対象の既存シーケンス図 ラベル化

3. 2 適用結果

図6

抽象化シーケンス図

更新前プログラム全体の処理の実行履歴を取得し，リーバスして得られたシーケンス図を図 5 に，更新

図 5 では，プログラムレベルの抽象度でシーケン収され，図に現れなかったことが原因となっている．
しかし，差異検出では変更があることがわかるため，
再度 ref フラグメントが示すシーケンス図を既存シーケンス図として，手法を適用することでより詳細な差異を知ることができる．

ref フラグメントの他の複合フラグメントに対応することは今後の課題となる．par フラグメントのメッセージ関係の定義を行っている研究として，浅田ら[4], M.Alwinain ら [5] の研究がある．浅田らの研究では，シーケンス図をイベントオカレンスの集合として捉えプロセス代数として定義している．par フラグメ
ントはブロック間のメッセージは並列実行され，フラグメントの開始，終了のイベントオカレンスで同期される処理としている．M.Alwinain らの研究では，シーケンス図をイベントオカレンスの集合とそれらの因果関係，競合関係として定義している．複数の図7シーケンス図を Alloy モデルに変換し合成する際に，抽象化シーケンス図 ラベル化

順序関係が定まらない場合に par フラグメントで合ス図が記述されているのに対し，図 6 では，図 3 と同様の図になっていることがわかる．

成している．
またシーケンス図の表記への対応として，ユーザ

図 7 では，図 4 と同じ抽象度のメッセージに加えへの対応が課題となる．ユーザへ対応するためには，て，プログラムと同じ抽象度のメッセージ，複合フラユーザからの入力を取得する必要がある．そのため，グメントが図下部に追加されている．

ユーザ入力を行うための特定のリスナークラスのメ

またこれらの適用時の差異検出結果を表 4 に示す．

ソッド呼出しをフックし，そのメソッドへのアクセスをユーザからの入力とみなす方法が考えられる．例と

表4

適用箇所と変更点

して，Java ではボタンやマウスの操作を ActionLis-

適用箇所

同じラベル

新しいラベル

削除されたラベル

変更内容

プログラム全体◯◯x追加

ラベル化◯◯x追加

tener クラスの actionPerformed メソッドで取得することが出来る．actionPerformed へのメソッド呼出しをユーザからの入力と捉え，シーケンス図に出力する際に呼出し元をユーザとすることで対応できる．こ4 考察のとき，複数ユーザへの対応や，このメソッドでフッ

本手法ではメッセージに加えて複合フラグメントをクする以前の処理をどのように扱うかなどが今後のラベルとして扱っている．これによって先行研究の課課題となる．

題であった複合フラグメントの抽象化が可能になる．

既存複合フラグメントラベルに対応するリバース

また，既存シーケンス図に ref フラグメントがあっ複合フラグメントラベルが複数存在する場合がある．

た場合に，抽象化シーケンス図に反映させることが現在は手作業で行っているため，筆者が選択していできる．今回の適用例では，2 つの ref フラグメントる．今後はこれを自動で検出する方法を検討する必要を抽象化シーケンス図に反映させた．図 3 と図 6 ががある．

同様の図になっている．これはプログラムの変更点

また，本手法の有用性を示すために，より大規模なが ref フラグメント内で発生しているため，変更が吸プログラムに対し適用し，考察を行う．そのためには手法を自動化することが課題となる．

5 おわりに
本研究では，設計書とプログラムの対応関係を維持するために，プログラムとの差異を検出する手法を提案した．適用例では手法を適用し，抽象度を高めたシーケンス図を生成した．本手法では設計書とプログラムの抽象度の違いを考慮し，既存の設計書に近い抽象度で変更点を捉えることができる．これによって対応関係の維持を支援し，ソフトウェア保守作業の効率化に繋がる．
今後の課題として，複合フラグメントの対応範囲の拡大，ユーザへの対応，自動化などがあげられる．

参 考 文 献[1] Omar Badreddin and Timoty C. Lethbridge.
Model oriented programing : Bridging the codemodel divide. MiSE 13 Proceedings of the 5th International Workshop on Modeling in Software Engineering, pp. 69–75, 2013.
[2] 宮城翔一, 上田賀一. 実行履歴と制御構造を用いたuml シーケンス図のリバースエンジニアリング. 日本ソフトウェア科学会第 20 会ソフトウェア工学の基礎ワー
クショップ (FOSE2013), pp. 283–292, 2013.
[3] 宮城翔一, 丸山翔平, 上田賀一. プログラム更新前後における uml シーケンス図の抽象化と差異検出. 電子
情報通信学会技術研究報告 = IEICE technical report: 信学技報, Vol. 114, No. 501, pp. 19–24, 2015.
[4] 浅田和真, 横川智教, 宮崎仁, 佐藤洋一郎. Ltsa を用いたシーケンス図の詳細化関係の検証. 情報処理学会研究会
報告 IPSJ SIG Technical Report, Vol. 2011-SE-173,
pp. 1–10, 2011.
[5] M.Alwinain, B.Borbar, and J.K.FBowles. Automated composition of sequence diagrams via alloy.
MODELSWARD 2014, pp. 284–391, 2014.