2 概要 市場で不具合が発生にした時 修正箇所は正常に動作するようにしたけど将来のことを考えるとメンテナンス性を向上させたいと考えた リファクタリングを実施して改善しようと考えた レガシーコードなのでどこから手をつけて良いものかわからない メトリクスを使ってリファクタリング対象を自動抽出する仕組みを

Similar documents
V8.1新規機能紹介記事

Microsoft PowerPoint - ●SWIM_ _INET掲載用.pptx

デザインパターン第一章「生成《

5-3- 応統合開発環境に関する知識 1 独立行政法人情報処理推進機構

PowerPoint プレゼンテーション

Python によるジオプロセシング スクリプト入門

11 ソフトウェア工学 Software Engineering デザインパターン DESIGN PATTERNS デザインパターンとは? デザインパターン 過去のソフトウェア設計者が生み出したオブジェクト指向設計に関して, ノウハウを蓄積し 名前をつけ 再利用しやすいようにカタログ化したもの 各デ

CodeRecorderでカバレッジ

Python によるジオプロセシング スクリプト入門

発表内容 背景 コードクローン 研究目的 4 つのテーマ 研究内容 テーマ毎に, 概要と成果 まとめ 2

PowerPoint プレゼンテーション

Using VectorCAST/C++ with Test Driven Development

コードテンプレートフレームワーク 機能ガイド 基礎編

Prog2_12th

目次 研究目的 背景システム開発について実験および評価結論

JavaプログラミングⅠ

目次 はじめに 4 概要 4 背景 4 対象 5 スケジュール 5 目標点 6 使用機材 6 第 1 章 C# 言語 7 C# 言語の歴史 7 基本構文 8 C 言語との違い 9 Java 言語との違い 10.Netフレームワーク 10 開発資料 10 第 2 章 Mono 11 Monoの歴史 1

VBコンバータ利用方法

Source Insight

メディプロ1 Javaプログラミング補足資料.ppt

Javaの作成の前に

トレーサビリティとインパクト分析 2011 年 7 月 13 日 海谷治彦 1

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

ご利用のコンピュータを設定する方法 このラボの作業を行うには 事前設定された dcloud ラボを使用するか 自身のコンピュータをセットアップします 詳細については イベントの事前準備 [ 英語 ] とラボの設定 [ 英語 ] の両方のモジュールを参照してください Python を使用した Spar

WEBシステムのセキュリティ技術

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

個人依存開発から組織的開発への移行事例 ~ 要求モデル定義と開発プロセスの形式化 による高生産性 / 高信頼性化 ~ 三菱電機メカトロニクスソフトウエア ( 株 ) 和歌山支所岩橋正実 1

SIMPLIA MF-STEPCOUNTER ご紹介資料

Android Layout SDK プログラミング マニュアル

PowerPoint Presentation

システム操作インターフェイス最適化によるテスト自動化ROI向上

bebras_slide.pptx

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

Microsoft PowerPoint - prog03.ppt

Microsoft PowerPoint - A1-2_株式会社ネクスト_藤澤正通_S _005.pptx

PowerPoint プレゼンテーション

Microsoft Word 基_シラバス.doc

クラス図とシーケンス図の整合性確保 マニュアル

5-3- 基統合開発環境に関する知識 1 独立行政法人情報処理推進機構

GEC-Java

Sort-of-List-Map(A)

(Microsoft PowerPoint - Java\221\3462\225\224\211\357\224\255\225\\\216\221\227\ ppt)

スライド 1

プログラミング実習I

Microsoft PowerPoint ppt

An introduction and future of Ruby coverage library

目次 第 1 章はじめに 動作環境 Internet Explorer の設定 取引先テスト実施内容... 5 第 2 章取引先テストの手順 ログイン 出荷梱包 ( 紐付けあり )

組込みシステムにおける UMLモデルカタログの実践研究

C#の基本

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

Microsoft PowerPoint - 09.pptx

(Microsoft PowerPoint - Java\221\3461\225\224\211\357\224\255\225\\\227p\216\221\227\ ppt)

PowerPoint プレゼンテーション

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

コンテンツ作成基本編

PowerPoint プレゼンテーション

プログラミング入門1

JUnit 概要 2015/4/16 版今泉俊幸 2015 bbreak Systems 1

デジタル表現論・第4回

Delphi/400でFlash動画の実装

Microsoft PowerPoint - prog04.ppt

Java Scriptプログラミング入門 3.6~ 茨城大学工学部情報工学科 08T4018Y 小幡智裕

Prog1_6th

プログラミング基礎I(再)

Oracle Business Rules

スライド 1

WebOTXマニュアル

Prog1_15th

.NET テクノロジー概説 /WindowsAzure 入門 コード P-2 0:00~7:00 ( 休憩 時間含む ) 前提条件 Windows の操作経験 ( エクスプローラの操作 ファイルの操作 ) があること 最低開講人数 0 名.NET テクノロジー概説 /WindowsAzure 入門

機能検証トレーニング コース一覧

情報システム設計論II ユーザインタフェース(1)

日経ビジネス Center 2

Microsoft PowerPoint - productmetrics2.ppt

はじめに Doxygen イントロダクション Doxygen とは? Doxygen の主な特徴 数値モデル開発における Doxygen の利用 dcmodel におけるドキュメンテーション方法 Doxygen と RDoc の比較 シンタックス生成されるドキュメント IGModel における Do

Java知識テスト問題

スライド 1

製品開発の現場では 各種のセンサーや測定環境を利用したデータ解析が行われ シミュレーションや動作検証等に役立てられています しかし 日々収集されるデータ量は増加し 解析も複雑化しており データ解析の負荷は徐々に重くなっています 例えば自動車の車両計測データを解析する場合 取得したデータをそのまま解析

HIGIS 3/プレゼンテーション資料/J_GrayA.ppt

Oracle Un お問合せ : Oracle Data Integrator 11g: データ統合設定と管理 期間 ( 標準日数 ):5 コースの概要 Oracle Data Integratorは すべてのデータ統合要件 ( 大量の高パフォーマンス バッチ ローブンの統合プロセスおよ

コンテンツ作成基本編

第 3 回 Java 講座 今回の内容 今週の Java 講座はコレクション 拡張 for 文, ガベージコレクションについて扱う. 今週の Java 講座は一番内容が薄いも のになるだろう. コレクション コレクションとは大きさが決まっていない配列だと考えればよい. コレクションには List 先

はじめに 本ドキュメントは Redmine を使用して稼働する定量的プロジェクト管理ツール ( 以下 IPF と略します ) のヘルプです IPF の操作に関わる機能を解説しており Redmine 及び構成管理ツール (Subversion Git) の標準機能については 本ヘルプの記載対象外として

ETOS 画面の Web 化 / 帳票印刷のオープン化体験お試し変換サービスのご紹介 ACOS-4 システムの業務改善提案

PowerPoint プレゼンテーション

20th Embarcadero Developer Camp

吉田坂本.pptx

SystemDirector Developer's Studio(V3.2) 適用ガイド

(Microsoft PowerPoint - HP\227pWASABI\217\320\211\356\216\221\227\277.ppt)

このルールをそのまま正規表現として書くと 下記のようになります ^A[0-9]{2}00[0-9]{3}([0-9]{2})?$ ちょっと難しく見えるかもしれませんが 下記のような対応になっています 最初 固定 年度 固定 通番 ( 枝番 ) 最後 ルール "A" 数字 2 桁 0 を 2 桁 数字

Prog2_15th

文字列操作と正規表現

平成 30 年度 プログラミング研修講座 岩手県立総合教育センター

Javaセキュアコーディングセミナー2013東京第1回 演習の解説

システム操作インターフェイス最適化によるテスト自動化ROI向上

PowerPoint プレゼンテーション

この時お使いの端末の.ssh ディレクトリ配下にある known_hosts ファイルから fx.cc.nagoya-u.ac.jp に関する行を削除して再度ログインを行って下さい

PowerPoint プレゼンテーション

Microsoft Word - wpphpmysql.doc

1 現コンフィギュレータの問題点 1.1 独自言語 TOPPERS カーネル開発者 ( 特に TOPPERS カーネルのポーティングを行う者 ) は 現コンフィギュレータが提供する tf を使用する必要がある しかし tf は TOPPERS の独自言語であり 初めて TOPPERS カーネルを開発

プログラミング入門1

Transcription:

メトリクス利用によるリファクタリング対象の自動抽出 ローランドディー. ジー. 株式会社 第 4 開発部 SC02 小林光一 e-mail:kouichi.kobayashi@rolanddg.co.jp

2 概要 市場で不具合が発生にした時 修正箇所は正常に動作するようにしたけど将来のことを考えるとメンテナンス性を向上させたいと考えた リファクタリングを実施して改善しようと考えた レガシーコードなのでどこから手をつけて良いものかわからない メトリクスを使ってリファクタリング対象を自動抽出する仕組みを考えた その結果 メソッドのインターフェースの複雑度限定で手がかりを抽出することができた

3 言葉の定義 リファクタリング 外部から見たときの振る舞いを保ちつつ 理解や修正が簡単になるようにソフトウェアの内部構造を変化させること リファクタリング カタログ リファクタリング の第 6 章以降に記載されている改善するためのテクニックのリスト ( リファクタリング プログラムの体質改善テクニック からの引用 ) リファクタリング対象 リファクタリングの効果の大きい場所 コード メソッド 手がかり 人手で確認することができる程度にしぼりこまれたリファクタリング対象の候補 レガシーコード 自動テストのないコードのこと ( レガシーコード改善ガイド からの引用 )

4 言葉の定義 メトリクス ソフトウェアを定量的に測定すること メソッドのインターフェースの複雑度 メソッドに入力される情報量の多さ 組込み型 プログラミング言語にあらかじめ用意されている変数の型 ユーザー定義型 ユーザーが任意で定義した構造体やクラス 引数ポイント メソッドの引数に型に応じて重みをつけて換算したもの Doxygen C++ C Java Objective-C Python IDL Fortran VHDL PHP C# 向けのドキュメンテーション システム

言葉の定義 JQuery ウェブブラウザ用の JavaScript コードをより容易に記述できるようにするために設計された軽量な JavaScript ライブラリ LOC Line of Code コード行数 ( 1) WMC Weighted Method per Class クラスごとの重みづけされたメソッド数 この値が大きい場合 クラスが大きすぎるので分解する必要がある ( 1) CBO Coupling Between Object Classes クラス間の結合度 ( 1) 1 演習で学ぶソフトウェアメトリクスの基礎 からの引用 5

6 状況の整理 レガシーコードをリファクタリングする時 市場で不具合が発生し 修正するとき レガシーコードを使って派生開発をするとき リファクタリングする時困ること レガシーコードなので 動作を担保するテストが存在しない 規模が大きい リファクタリング以前にテストを準備する必要がある 既に規模が大きくなってしまっていて, どこから手を付けていいものやら途方にくれる やりたいこと リファクタリング対象を見つけたいけど既に規模が大きいため人手では無理なので コード解析して手がかりを見つけたい

7 コード解析 コードを解析してどんなメトリクスを計測すれば良いか? LOC, サイクロマティック複雑度 WMC DIT CBO などある より効果的で 簡単なものが良いので引数の数をメトリクスとして計測する なぜ 引数の数なのか? 引数の数が多いメソッドから得られる印象は 複雑 煩雑 というような印象がある リファクタリング カタログにおいて引数の数に注目したテクニックがある ( 引数の削除 引数オブジェクトの導入など ) 引数の数を計測 = メソッドのインターフェースの複雑度を計測 将来的に 自組織で展開していきたいので導入は簡単なもので

8 やること コード解析して手がかりを見つけるために引数の数を使ってメトリクスする 引数の数を計測するツールを準備する 引数の数を計測するツール 余計な情報を出力しない手がかりだけを表示するツール Doxygen と Jquery を使った自作ツールにて実現する 手がかりを見つけるツールとして全体を自動化したシンプルなツールでないと自分の組織で使ってもらえないのでそのようなツールを準備する

9 doxygen ドキュメントジェネレーターである doxygen にソースコードの構文解析を担わせた 構文解析結果は XML で出力させる これは 次工程で JQuery を使ってフィルターをかけやすいように配慮したためだ 図 1 のクラスを doxygen で解析すると図 2 のような XML ファイルを得た

Jquery を使った自作ツール JQuery を使って doxygen で出力されたすべての XML ファイルに対してフィルタリングを行い フィルタリングの結果を一つにまとめる JQuery は JavaScript ライブラリである 対象となるファイルの一覧を filelist.xml ( 次ページ ) として用意する filelist.xml からファイル名を取得したら 先ほど XML 内の <param> タグをカウントする ファイル名 ( 行番号 ) 関数名 引数の数../aaa.h(86) aaa::aaa 5../b.h(27) bool b::copy 5../c.h(57) void c::chander 4 10

11 引数の数に注目して実験 仮説 引数の多いメソッドの割合が多く かつそれらのメソッドはリファクタリングの可能性がある 実験対象 ( 言語 :C++) PJ1 : アプリケーションソフト PJ2 : 組込みソフト ( オープンソース ) PJ1:n 個の引数を持つメソッド数 PJ2:n 個の引数を持つメソッド数 1052 272 371 140 65 19 3 1 2 89 35 10 2 1 2 3 4 5 6 7 8 1 2 3 4 5

12 引数の数に注目して実験 結論 計測結果からは 引数の多いメソッドの全体数に占める割合は 0.1~0.3% 程度であった 引数の数 を単純に分類しただけではリファクタリング対象の絞り込みはできない 考察 引数の数 と 引数の型 と リファクタリングの可能性 の関係を単純化しまとめた 引数の型引数の数 : 少引数の数 : 多 組込み型リファクタリング可能性 :C リファクタリング可能性 :B ユーザー定義型リファクタリング可能性 :B リファクタリング可能性 :A リファクタリングの可能性 :B までは抽出できるようにしたい ユーザー定義型 の引数に重みをつける

13 重みをつけて抽出 仮説 メトリクスを 引数の数 引数の型 にすれば リファクタリング可能性 :A B を抽出することができる 重みつけ ユーザー定義型ならば一様に重みを 3 とした ユーザー定義型に内包されている変数の型について厳密な解析を行えば ユーザー定義型の重みが分かるかもしれないが 実装が複雑になりそうだったので行わない 代替案としてユーザー定義同士は乗算することにした 例 ) ユーザー定義型の引数が 5 個あった場合 3X3X3X3X3=243 ユーザー定義型 2 個と組込み型が 3 個あった場合には (3X3)+1+1+1=12

14 重みをつけて抽出 PJ1: 引数に重みつけした後のメソッド数 737 381 217 143 64 26 2 3 41 17 7 5 1 6 2 1 1 2 3 4 5 6 7 8 9 10 11 12 13 27 28 243

15 重みをつけて抽出 PJ2: 引数に重みつけをした後のメソッド数 184 119 75 21 1 2 1 2 1 1 2 3 4 5 6 7 8 9

16 重みをつけて抽出 リファクタリングの検討 引数ポイント3 以上のものを対象にリファクタリングを検討 リファクタリング カタログを摘要する 引数ポイント1~2は細分化できていないと判断し 対象外にする プロジェクト 1 引数ポイント 3 以上は 699 メソッド数 理由 必要 231 問い合わせと更新の分離 引数の削除 不要 468 API プロジェクト2 引数ポイント3 以上は147 メソッド数 理由 必要 10 問い合わせと更新の分離 不要 137 コンストラクタ

17 重みをつけて抽出 プロジェクト 1 結果 引数の数 だけよりも細分化できた 引数ポイント 1~2 のメソッドが多い 問い合わせと更新の分離を検討し引数ポイント 5 以上はほぼリファクタリング可能性あり プロジェクト 2 結果 引数ポイント 5 以上はコンストラクタが多いが問い合わせと更新の分離を検討した結果 コンストラクタ以外はリファクタリング可能性あり 考察 引数ポイント 1~2 については未細分化 引数ポイント 3~4 は組込み型のみ ユーザー定義型のみ 混在の場合を細分化すると改善が見込める メソッドがコンストラクタなのか Setter/Getter なのかを判断すると改善が見込める

18 まとめ / 今後の課題 まとめ 引数の数 引数の型 を計測することでもソースコードを解析することができた Doxygen でインターフェースの構文解析を簡単にできた Jquery を使った自作ツールは構文解析結果をフィルタリングすること また簡単にカスタマイズできた 引数の数 引数の型 だけ計測しただけでも手がかりを抽出することができた 今後の課題 引数ポイント 1~2 については未細分化 引数ポイント 3~4 は組込み型のみ ユーザー定義型のみ 混在の場合を細分化する メソッドがコンストラクタなのか Setter/Getter なのかを判断する サンプリングを増やす 手がかりからリファクタリング対象を抽出する評価方法を明確にする