• 検索結果がありません。

オブジェクト指向メトリクスを用いた開発支援法に関する研究

N/A
N/A
Protected

Academic year: 2021

シェア "オブジェクト指向メトリクスを用いた開発支援法に関する研究"

Copied!
44
0
0

読み込み中.... (全文を見る)

全文

(1)

オブジェクト指向メトリクスを用

いた

開発支援法に関する研究

神谷 年洋

(2)

背景 (1)

ソフトウェアの応用分野の拡大

ソフトウェアの大規模化・複雑化

開発期間の短縮・品質の向上

オブジェクト指向開発技術

開発/保守プロセス

メトリクス

(3)

背景 (2)

オブジェクト指向ソフトウェア開発

分析/設計/実装を通してオブジェクトを用いる

オブジェクト指向プログラミング言語

Java

や C++ など

開発ツール

大規模な再利用

フレームワーク

オブジェクト指向メトリクス

CK

メトリクス

(4)

背景 (3)

オブジェクト指向ソフトウェアの品質評価/

フォールト予測のために,オブジェクト指向メト

リクスが用いられている

オブジェクト指向複雑度メトリクスの適用におい

て,オブジェクト指向開発技術や開発プロセスの

特性が考慮されていない

(5)

目的

オブジェクト指向メトリクスを用いた開発支援法

に関して研究を行った

再利用技術

設計

開発プロセス

重複コード

(6)

論文の構成

1.

緒論

2.

諸準備

3.

再利用を考慮した構造メトリクス計測法 [1-2]

→ 再利用部品と新規開発部品を区別することでフォールト予測精度を改

4.

フレームワークを用いたクラス分類に基づくフォールト予測手法 [1-4]

→ フレームワークを利用したクラス分類によってフォールト予測精度を

改善

5. CK

メトリクスを開発プロセスの初期に計測する手法 [1-6]

→OMT

法に基づく開発プロセスにチェックポイントを設け,各チェッ

クポイントにおいて予測を行う

6.

オブジェクト指向プログラミング言語向けのコードクローン検出手法

[1-5]

→ オブジェクト指向プログラミング言語の文法知識を用いた,効果的

な重複コード検出技術

7.

むすび

(7)

フレームワークを用いたクラス分

類法

[

論文の 4 章 ]

1.

複雑度メトリクスによるフォールト予測

2. CK

メトリクス

3.

問題点

4.

フレームワークを利用したクラス分類法

5.

クラス分類を用いたフォールト予測

6.

実験

7.

結論と課題

(8)

複雑度メトリクスによるフォール

ト予測

(1)

メトリクスを用いてプロダクトの複雑度を計測し

(2)

プロダクトに作りこまれるフォールトを予測する

「複雑なプロダクトほどフォールトが作りこま

れやすい」

フォールトの予測はレビューやテストを効果的に

配分するために用いられる

(9)

CK

メトリクス [Chidamber]

DIT

:クラス階層木内での深さ

NOC

:直接導出されている子子クラスの数

RFC

:呼び出すメソッドの種類数( RFCR, RFCN)

CBO

:結合するクラスの種類数( CBOR, CBON )

WMC

:クラスのメソッド数

LCOM

:メソッドの凝集度の欠如の度合い

その他のメトリクス

NIV

:インスタンス変数の数

SLOC

:ソースコードの行数

CK

メトリクス

およびその他のメトリク

[Chidamber] S.R. Chidamber and C.F. Kemerer: “A Metrics Suite for Object

Oriented Design”, IEEE Trans. on Software Eng., vol., 20, No. 6, Jun 1994.

継承

結合

クラスの

内部複雑度

(10)

問題点

クラスの機能によりメ

トリクス値の分布が異

なる [Basili]

一般的なソースコード

において,クラスの機

能分類を自動的に行う

ことは難しい

0

5

10

15

20

25

30

0

1

2

3

4

5

6

CBO

R

FC

[Basili] V. R. Basili, L. C. Briand, W. L. Mélo: “A validation of object-oriented

(11)

フレームワークを利用したクラス

分類法

フレームワークのク

ラスから,「導出が

期待される」クラス

を選出する

→ 代表クラス

どの代表クラスから

導出されているかに

よって,新規開発ク

ラスを分類する

B

C

A

p

q

s

t

u

フレームワーク

代表クラス )

新規開発クラス

(12)

クラス分類を用いたフォールト予

(1)

代表クラスを選出する

(2)

基準となるデータを収集する

メトリクスを計測するためのプロダクト ( たとえばソー

スコード ) から,クラスごとに,分類,メトリクス値,

フォールト修正時間を記録する

(3)

予測式の作成

重回帰分析によって,クラス分類ごとに,メトリクスを

入力とし,フォールト修正時間を出力とする予測式を作

成する

(4)

フォールト修正時間を予測する

フォールト修正時間の予測を行いたいクラスから計測し

たメトリクスを,分類に応じた予測式に当てはめる

(13)

実験概要

ある企業の新人研修におけるプログラム開発演習

GUI

を備えた電子メールの配送システム

4

から 5 人のチームによる開発であり,各開発者はサブシ

ステムを開発する

インストラクタによって受け入れテストが実施される

Visual C++

,フレームワークとして MFC(Microsoft

Foundation Class)

を用いる

開発規模はチームあたり 3 千行程度 ( 再利用分を含まな

い )

最終的には, 17 人分, 124 個のクラスのデータが利用でき

(14)

クラス分類

(1)CDocument

:アプリケーションのデータを格納

(2)CView

:ユーザーに対してデータを表示

(3)CDialog

ユーザーからデータを受け取る

エラーメッセージ出力する

(4)CWinApp

:アプリケーションの設定に関する処理

(5)CFrameWnd

:アプリケーションのウィンドウの管理

(6)CSocket

:通信を行う「ソケット」を実装

(7)

その他:上記のいずれにも属さないクラス

(15)

収集されたメトリクス値の分布 (1

/2)

0

1

2

3

CBO

CBOR

RFC

RFCR

WMC

LCOM

DIT

NIV

SLOC

0

1

2

3

CBO

CBOR

RFC

RFCR

WMC

LCOM

DIT

NIV

SLOC

0

1

2

3

CBO

CBOR

RFC

RFCR

WMC

LCOM

DIT

NIV

SLOC

0

1

2

3

CBO

CBOR

RFC

RFCR

WMC

LCOM

DIT

NIV

SLOC

0

1

2

3

CBO

CBOR

RFC

RFCR

WMC

LCOM

DIT

NIV

SLOC

0

1

2

3

CBO

CBOR

RFC

RFCR

WMC

LCOM

DIT

NIV

SLOC

CDocument

CView

CDialog

(16)

収集されたメトリクス値の分布 (2

/2)

メトリクス値の傾向

は, CDocument, CView,

CWinApp, CFrameWnd

で大きく

異なる

それぞれの分類内では似た傾向に

ある

→ クラス分類が適切であったことが

わかる

0

1

2

3

CBO

CBOR

RFC

RFCR

WMC

LCOM

DIT

NIV

SLOC

その他

(17)

フォールト予測精度の比較

y = 0.9994x - 0.0183

R

2

= 0.277

-50

0

50

100

150

200

-20

-10

0

10

20

30

40

50

60

Estimated Et (min.)

O

bs

er

ve

d

E

t (

m

in

.)

y = 0.8994x + 0.3586

R

2

= 0.5502

-50

0

50

100

150

200

-50

0

50

100

150

Estimated Et (min.)

O

bs

er

ve

d

E

t (

m

in

.)

クラス分類を用いない場合

クラス分類を用いた場合

相関係数で比較すると 0.53( 分類を用いない ) ,

0.74(

分類を用いる ) となる

(18)

考察

クラス分類を行うことによってフォールト予測精度が向

上する

統計的には,「クラス分類」というあらたな名義尺度の

メトリクスを,ダミー変数として用いることを意味する

クラス分類を行う・・・「クラス分類」メトリクス

を予測式に取り入れる

クラス分類を行わない・・・「クラス分類」以外の

メトリクスだけで予測式を立てる

従って,クラス分類間でメトリクス分布に差があれば,

分類によって予測精度が向上する

(19)

結論と課題

結論

フレームワークを用いたクラス分類法を提案

評価実験では, CK メトリクスによるフォールト

予測精度が向上した

課題

クラス分類の精密化

代表クラス選出の自動化

適用事例の追加

(20)

オブジェクト指向プログラミング

言語向けのコードクローン検出手

[

論文の 6 章 ]

1.

コードクローン

2.

既存のクローン検出手法

3.

問題点

4.

提案するクローン検出手法

5.

適用実験

6.

結論と課題

(21)

コードクローンとは

ソースコード中に類似したコード片があるとき,

それらをコードクローンという

(22)

コードクローンが起こす問題

コードクローンはソフトウェア保守を困難

にする

クローンにフォールトが含まれる場合,

すべてのクローンについて修正を行わな

ければならない

機能追加も同様

設計書には表れないソースコードの潜在

的欠陥

大規模なソースコードからクローンを人手

で発見するのは非現実的である

(23)

既存のクローン検出手法 ( ツー

ル )

Dup[Baker]

行単位でソースコードを比較してクローンを検

出する

→ 基本的に入力ソースファイルの記述言語を問

わない

Baxter

らのツール [Baxter]

C

言語のソースファイルを入力,構文解析して

,解析木 ( の部分木 ) を比較する

[Baker] B. S. Baker: “On finding Duplication and Near-Duplication in Large

Software System,” Proc. of The Second IEEE Working Conf. on Reverse Eng.,

pp. 86-95, Tronto, Canada (Jul., 1995).

[Baxter] I. D. Baxter, A. Yahin, L. Moura, M. Sant’Anna, and L. Bier: “Clone

Detection Using Abstract Syntax Trees,” Proc. of ICSM ’98, pp. 368-377,

Bethesda, Maryland (Nov., 1998).

(24)

問題点

オブジェクト指向プログラミング言語への対応

オブジェクト指向プログラミング言語では,ク

ラスのスコープルール,名前空間,汎用型など

により,構造をもった名前が用いられる

std::map<int, std::string>

クローンを選択する手法

テーブルの初期化など,検出しても意味がない

クローンがある

(25)

提案するクローン検出手法

ソースコードを字句解析してトークンの列に直し

てから処理する

文法知識に基づいたコード変形

クラススコープや名前空間による複雑な名前

の正規化を行う

初期化テーブルを取り除く

モジュールの区切りを認識する

言語依存部分を取り替えることで,さまざまな

プログラミング言語に対応

(26)

クローン検出手順

(1)

ソースコードを入力し,トークンの列にする

(2)

変形ルールにより,トークン列を変形する

(3)

パラメータ置換を行う

(4)

マッチングアルゴリズムによりクローンを検出す

(5)

クローンの位置 ( ファイル,行 ) を出力する

(27)

1. static void foo() throws RESyntaxException {

2. String a[] = new String [] { "123,400", "abc", "orange 100" };

3. org.apache.regexp.RE pat = new

org.apache.regexp.RE("[0-9,]+");

4. int sum = 0;

5. for (int i = 0; i < a.length; ++i)

6. if (pat.match(a[i]))

7. sum += Sample.parseNumber(pat.getParen(0));

8. System.out.println("sum = " + sum);

9. }

10. static void

goo

(

String [] a

) throws RESyntaxException {

11. RE

exp

= new RE("[0-9,]+");

12. int sum = 0;

13. for (int i = 0; i < a.length; ++i)

14. if (

exp

.match(a[i]))

15. sum += parseNumber(

exp

.getParen(0));

16. System.out.println("sum = " + sum);

static void foo (

)

{

String a

[

]

= new String [

]

{ "123,400" , "abc" , "orange 100" }

;

int sum = 0

;

for ( int i

= 0

;

i

< a

. length ; ++ i

)

sum +=

pat . getParen

0

;

System . out . println ( "sum = " + sum )

;

}

throws RESyntaxException

Sample . parseNumber (

)

)

if

pat . match

(

a

[

i

]

)

)

org . apache . regexp . RE pat = new org . apache . regexp . RE ( "[0-9,]+" )

;

static void goo (

String a

[

]

)

{

int sum = 0

;

for ( int i

= 0

;

i

< a

. length ; ++ i

)

System . out . println ( "sum = " + sum )

;

}

throws RESyntaxException

if

exp . match

(

a

[

i

]

)

)

exp = new RE ( "[0-9,]+" )

;

(

RE

sum +=

parseNumber (

exp . getParen

(

0

)

)

;

(

(

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

13.

14.

15.

16.

17.

ステップ (1) :ソースコードを入力し,トークンの列にする

(28)

static void foo (

)

{

String a

[

]

= new String [

]

{ "123,400" , "abc" , "orange 100" }

;

int sum = 0

;

for ( int i

= 0

;

i

< a

. length ; ++ i

)

sum +=

pat . getParen

0

;

System . out . println ( "sum = " + sum )

;

}

throws RESyntaxException

Sample . parseNumber (

)

)

if

pat . match

(

a

[

i

]

)

)

org . apache . regexp . RE pat = new org . apache . regexp . RE ( "[0-9,]+" )

;

static void goo (

String a

[

]

)

{

int sum = 0

;

for ( int i

= 0

;

i

< a

. length ; ++ i

)

System . out . println ( "sum = " + sum )

;

throws RESyntaxException

if

exp . match

(

a

[

i

]

)

)

exp = new RE ( "[0-9,]+" )

;

(

RE

sum +=

parseNumber (

exp . getParen

(

0

)

)

;

(

(

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

13.

14.

15.

16.

static void foo (

)

{

String a

[

]

= new String [

]

{ $u }

;

int sum = 0

;

for ( int i

= 0

;

i

< a

. length ; ++ i

)

sum +=

pat . getParen

0

;

System . out . println ( "sum = " + sum )

;

}

throws RESyntaxException

Sample . parseNumber (

)

)

if

pat . match

(

a

[

i

]

)

)

RE pat = new RE ( "[0-9,]+" )

;

static void goo (

String a

[

]

)

{

int sum = 0

;

for ( int i

= 0

;

i

< a

. length ; ++ i

)

System . out . println ( "sum = " + sum )

;

throws RESyntaxException

if

exp . match

(

a

[

i

]

)

)

exp = new RE ( "[0-9,]+" )

;

(

RE

sum +=

parseNumber (

exp . getParen

(

0

)

)

;

(

(

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

13.

14.

15.

16.

$p .

ステップ (2) :変形ルールにより,トークン列を変形する

(29)

static void foo (

)

{

String a

[

]

= new String [

]

{ $u }

;

int sum = 0

;

for ( int i

= 0

;

i

<

a

. length ; ++ i

)

sum +=

pat . getParen

0

;

System . out . println ( "sum = " + sum )

;

}

throws RESyntaxException

Sample . parseNumber (

)

)

if

pat . match

(

a

[

i

]

)

)

RE pat = new RE ( "[0-9,]+" )

;

static void goo (

String a

[

]

)

{

int sum = 0

;

for ( int i

= 0

;

i

<

a

. length ; ++ i

)

System . out . println ( "sum = " + sum )

;

}

throws RESyntaxException

if

exp . match

(

a

[

i

]

)

)

exp = new RE ( "[0-9,]+" )

;

(

RE

sum +=

parseNumber (

exp . getParen

(

0

)

)

;

(

(

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

13.

14.

15.

16.

17.

$p

.

static $p

(

)

{

[

]

= new

[

]

{ $u }

;

=

;

for (

=

;

<

.

; ++

)

+=

.

;

.

.

(

+

)

;

}

throws

.

(

)

)

if

.

(

[

]

)

)

= new

(

)

;

static

(

[

]

)

{

=

;

for (

=

;

<

.

; ++

)

.

.

(

+

)

;

}

throws

if

.

(

[

]

)

)

= new

(

)

;

(

+=

(

.

(

)

)

;

(

(

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

13.

14.

15.

16.

17.

.

$p

$p

$p

$p

$p $p

$p

$p

$p $p

$p

$p $p

$p

$p

$p

$p

$p

$p

$p

$p

$p

$p

$p

$p

$p

$p

$p

$p

$p

$p

$p

$p

$p $p

$p $p

$p

$p $p

$p

$p

$p $p

$p

$p $p

$p

$p

$p

$p

$p

$p

$p

$p

$p

$p

$p

$p

$p

$p

$p

$p

$p

$p

$p

$p

$p

ステップ (3) :パラメータ置換を行う

(

変数,関数,型の識別子を,単一の「パラメータ」トークンに

置き換える )

(30)

ステップ

(4)

マッチング

アルゴリズ

ムにより,

クローンを

検出

st

at

ic

$p $p ( ) th

ro

w

s

$p { $p $p [ ] "=

"

$p $p [ ] { $u } ; $p $p "=

"

ne

w

$p ( $p ) ; $p $p "=

"

$p

static

*

$p

* * * * * * * * * * * * * *

$p

* * * * * * * * * * * * * *

(

* *

)

* *

throws *

$p

* * * * * * * * * * * * * *

{

* *

$p

* * * * * * * * * * * * * *

$p

* * * * * * * * * * * * * *

[

* *

]

* *

"="

* * *

$p

* * * * * * * * * * * * * *

$p

* * * * * * * * * * * * * *

[

* *

]

* *

{

* *

$u

*

}

*

;

* *

$p

* * * * * * * * * * * * * *

$p

* * * * * * * * * * * * * *

"="

* * *

new

*

$p

* * * * * * * * * * * * * *

(

* *

$p

* * * * * * * * * * * * * *

)

* *

* * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** ** * * * * ** ** * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * ** ** * * * * ** ** * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * ** ** * * * * ** ** * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** ** * * * * ** ** * * * * ** ** * * * * ** ** * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * ** ** * * * * ** ** * * * * ** ** * * * * ** ** * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * ** ** * * * * ** ** * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** ** * * * * ** ** * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * ** ** * * * * ** ** * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * ** ** * * * * ** ** * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** ** * * * * ** ** * * * * ** ** * * * * ** ** * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** ** * * * * ** ** * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * ** ** * * * * ** ** * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * ** ** * * * * ** ** * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** ** * * * * ** ** * * * * ** ** * * * * ** ** * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * ** ** * * * * ** ** * * * * ** ** * * * * ** ** * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * ** ** * * * * ** ** * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** ** * * * * ** ** * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * ** ** * * * * ** ** * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * ** ** * * * * ** ** * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** ** * * * * ** ** * * * * ** ** * * * * ** ** * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * * ** ** * ** ** ** * * ** * ** * * * * * * * * * * * * * * * * * * * *

(31)

クローン

1. static void foo() throws RESyntaxException {

2. String a[] = new String [] { "123,400", "abc", "orange 100" };

3. org.apache.regexp.RE pat = new

org.apache.regexp.RE("[0-9,]+");

4. int sum = 0;

5. for (int i = 0; i < a.length; ++i)

6. if (pat.match(a[i]))

7. sum += Sample.parseNumber(pat.getParen(0));

8. System.out.println("sum = " + sum);

9. }

10. static void

goo

(

String [] a

) throws RESyntaxException {

11. RE

exp

= new RE("[0-9,]+");

12. int sum = 0;

13. for (int i = 0; i < a.length; ++i)

14. if (

exp

.match(a[i]))

15. sum += parseNumber(

exp

.getParen(0));

16. System.out.println("sum = " + sum);

(32)

変形ルールを用いない場合

1. static void

foo

() throws RESyntaxException {

2.

String a[] = new String [] { "123,400", "abc", "orange 100" };

3.

org.apache.regexp.

RE

pat

=

new org.apache.regexp.

RE("[0-9,]+");

4. int sum = 0;

5. for (int i = 0; i < a.length; ++i) {

6. if (

pat

.match(a[i]))

7. sum +=

Sample.

parseNumber(

pat

.getParen(0));

8. }

9. System.out.println("sum = " + sum);

10. }

11. static void

goo

(

String [] a

) throws RESyntaxException {

12. RE

exp

= new RE("[0-9,]+");

13. int sum = 0;

14. for (int i = 0; i < a.length; ++i) {

15. if (

exp

.match(a[i]))

16. sum += parseNumber(

exp

.getParen(0));

17. }

18. System.out.println("sum = " + sum);

4-6

行目と

13-15

行目

8-10

行目

17-19

行目

(33)

Java

向けの変形ルール

RJ1

:パッケージ名除去

( PackageName ‘.’ )+ ClassName → ClassName

RJ2:Callee

挿入

NDotOrNew NClassName ‘(‘

→ NDotOrNew CalleeIdentifier ‘.’ NClassName ‘(‘

RJ3:

テーブル初期化除去

'=' '{' InitalizationList, '}' → '=' '{' UniqueIdentifier '}‘

']' '{' InitalizationList, '}' → ']' '{' UniqueIdentifier '}'

RJ4:

モジュールの分離

トップレベルの定義や宣言の終わりに UniqueIdentifier を挿

入する

(34)

最適化

Suffix-tree

による O(n log n) のマッチングアルゴリ

ズム

(

入力ソースファイルの大きさを

として )

簡便なアルゴリズム ( 最適アルゴリズムは O(n))

メモリ使用量を削減

「文の最初のトークンだけがクローンの開始位置

となることができる」制約によりメモリ使用量を

削減

大規模なソースファイルには分割して処理を行う

(35)

JDK

のライブラリへの適用

JDK

( Java Development Kit

) 1.2.2 (サンプル

とデモプログラムを除く)

入力ファイルは 164 8個,約 50 万行

ツールの実行には, Pentium III 650MHz および

(36)

クローンの散布図

両軸はソースファイ

ルを辞書順に並べた

もの

20

行以上のクローン

を図示

多くのクローンが密

集している( A)

最長のクローン

( B )

A

B

(37)

クローンが密集している部分

( A )

src/javax/swing/plaf/multi/*.java

の 29 のファイル

コード生成ツールによって生成された

いくつかはクラス名を除いてまったく同じクラ

スの定義を含んでいた

31| */

32| public class MultiButtonUI extends ButtonUI {

33|

160| public static ComponentUI createUI(JComponent a) {

161| ComponentUI mui = new MultiButtonUI();

162| return MultiLookAndFeel.createUIs(mui,

163| ((MultiButtonUI) mui).uis,

164| a);

165| }

(38)

最長のクローン( B )

最長のクローン( 349 行)

src/java/util/Arrays.java

の 18 の“ sort” メソッド

シグネチャ(引数の型と数)が異なる

アルゴリズムは同一

(39)

変形ルールの評価

変形/置換なしでは発見されるクローンは半減す

0

200

400

600

800

1000

20

25

30

35

40

45

50

55

60

65

70

75

80

85

90

95

10

0.

.

クローンの長さ(LOC)

変形ルールを適用

適用せず

(40)

その他の適用実験

オープンソース

Qt(C++

, 2 4万行 )

C++

向けの変形ルールの効果を確認した

Linux

と FreeBSD のカーネルとドライバ (C , 160 万行+ 130

万行 )

ドライバ部分にクローン「ファイル」が多数存在する

システム間で名前が異なるファイル

商用

NTT

データ ( 出入国管理システム )

COBOL

, 120 万行

NASDA(

ロケットの制御・管制 )

C

, 50 万行

(41)

結論と課題

結論

ソースコードの変形を用いるコードクローン検出

手法を提案した

実験では,提案する手法が JDK のライブラリか

ら効果的にコードクローンを検出することが確認

された

課題

構文によるクローン選別

クローン除去

クローン検出の保守プロセスでの利用

「横並びリスト」を補完する手段

(42)

むすび

複雑度メトリクスによるフォールト予測

再利用を考慮した構造メトリクス計測法

CK

メトリクスを開発プロセスの初期に計測する手法

フレームワークを用いた開発においてクラス分類を行

い予測精度を高める手法

→ フレームワークによってクラス分類を行う手法を提案

し,実験によってフォールト修正時間予測精度を評価

コードクローン検出

オブジェクト指向プログラミング言語向けのコードク

ローン検出手法

→ 検出手法を提案し, JDK のソースファイルに適用した

(43)
(44)

Suffix-tree

以下の条件を満たす木

(1)

木の葉は部分文字列の

開始位置

(2)

根から葉までラベルを

たどると部分文字列に

なる

(3)

ひとつの節点から出る

辺のラベルはすべて異

なる文字で始まる

→ 共通のパス=クローン

x

y

z%

%

xyxyz%

y

xyz%

z%

xyz%

z%

1

2

4

3

5

6

7

1 2 3 4 5 6 7

x x y x y z %

参照

関連したドキュメント

『マイスター』が今世紀の最大の傾向である」(KAI1,198)3)と主張したシュレーゲル

これはつまり十進法ではなく、一進法を用いて自然数を表記するということである。とは いえ数が大きくなると見にくくなるので、.. 0, 1,

2)海を取り巻く国際社会の動向

「就労に向けたステップアップ」と設定し、それぞれ目標値を設定した。ここで

るものの、およそ 1:1 の関係が得られた。冬季には TEOM の値はやや小さくなる傾 向にあった。これは SHARP

また、 NO 2 の環境基準は、 「1時間値の1 日平均値が 0.04ppm から 0.06ppm までの ゾーン内又はそれ以下であること。」です

2011 年の主たる動向は、欧州連合 (EU) の海洋政策に新たな枠組みが追加されたことであ る。漁業分野を除いた

た意味内容を与えられている概念」とし,また,「他の法分野では用いられ