以下、本実施の形態について図面を参照して説明する。なお各実施の形態は、矛盾のない範囲で複数の実施の形態を組み合わせて実施することができる。
〔第1の実施の形態〕
まず第1の実施の形態について説明する。第1の実施の形態は、修正候補となる技術的負債箇所を自動で特定する修正候補特定方法を、コンピュータを用いて実現するものである。
図1は、第1の実施の形態に係るコンピュータの一例を示す図である。図1には、修正候補となる技術的負債箇所を自動で特定する修正候補特定方法を実施するコンピュータ10を示している。コンピュータ10は、例えば修正候補特定方法の処理手順が記述された修正候補特定プログラムを実行することにより、修正候補特定方法を実施することができる。
コンピュータ10は、修正候補特定方法を実現するために、記憶部11と処理部12とを有する。記憶部11は、例えばコンピュータ10が有するメモリ、またはストレージ装置である。処理部12は、例えばコンピュータ10が有するプロセッサ、または演算回路である。
記憶部11には、修正対象のソースコード1が格納されている。ソースコード1には、1以上のコマンド行が含まれる。コマンド行の中には、そのコマンド行を実行する時点で成立していることが期待される条件式を示すテストコードが含まれる場合がある。テストコードは、ソースコード1の一部である部分コードについて、入力値または出力値が適切か否かを判定するのに使用される。ソースコード1の実行過程において、テストコードで値が適切であると判定された場合、ソースコード1の実行が継続される。他方、ソースコード1の実行過程において、テストコードで値が不適切であると判定された場合、ソースコード1の実行が終了する。
また記憶部11は、ソースコード1に対する修正履歴2を記憶することができる。修正履歴2は、ソースコード1に対して修正処理を行ったときの修正内容を示す修正記録2a~2cを時系列に並べたものである。
各修正記録2a~2cには、例えば変更ID、適用日時、作成者、追加コード、および削除コードが含まれる。変更IDは、修正処理の識別子である。適用日時は、修正処理を行った日時である。なお図1の例では、日時として日付のみを示し時刻については省略している。以下の説明においても、日時を示す情報のうち時刻を省略する場合がある。作成者は、修正によって追加したコード(追加コード)を作成した開発者の名称である。追加コードは、修正処理によってソースコード1に追加された1以上のコマンド行である。削除コードは、修正処理によってソースコード1から削除された1以上のコマンド行である。なお、修正記録2a~2cに含まれる情報のうち、適用日時と作成者は、修正処理に関する属性を示す属性情報の一例である。
コンピュータ10の処理部12は、ソースコード1への修正処理に応じた修正履歴2を作成すると共に、修正履歴2に基づいて、修正候補となる技術的負債箇所を自動で特定する。
図2は、修正候補特定方法の一例を示す図である。例えばソースコード1には、2度の修正処理が行われているものとする。図2では、ソースコード1の第1版のときの内容をソースコード1aとし、ソースコード1の第2版のときの内容をソースコード1bとし、ソースコード1の第3版のときの内容をソースコード1cとしている。
例えば第1版のソースコード1aを開発者「Coder A」が作成し、2018年1月5日にコンピュータ10に登録したものとする。この場合、コンピュータ10の処理部12は、登録されたソースコード1a内のすべてのコマンド行を新たに追加する修正処理と認識し、その修正処理を表す修正記録2aを、修正履歴2に登録する。登録した修正記録2aには、変更ID「C001」、適用日時「2018.1.5」、作成者「Coder A」が含まれる。また修正記録2aの追加コードには、ソースコード1aにすべてのコマンド行が含まれる。
次に第1版のソースコード1aを開発者「Coder B」が修正し、2018年1月6日に修正後の第2版のソースコード1bをコンピュータ10に登録したものとする。この場合、処理部12は、ソースコード1aをソースコード1bに修正する修正処理を表す修正記録2bを、修正履歴2に登録する。登録した修正記録2bには、変更ID「C002」、適用日時「2018.1.6」、作成者「Coder B」が含まれる。また修正記録2bの追加コードには、ソースコード1bに新たに追加されたコマンド行が含まれ、削除コードには、元のソースコード1aから削除されたコマンド行が含まれる。
次に第2版のソースコード1bを開発者「Coder C」が修正し、2018年1月9日に修正後の第3版のソースコード1cをコンピュータ10に登録したものとする。この場合、処理部12は、ソースコード1bをソースコード1cに修正する修正処理を表す修正記録2cを、修正履歴2に登録する。登録した修正記録2cには、変更ID「C003」、適用日時「2018.1.9」、作成者「Coder C」が含まれる。また修正記録2cの追加コードには、ソースコード1cに新たに追加されたコマンド行が含まれ、削除コードには、元のソースコード1bから削除されたコマンド行が含まれる。
処理部12は、例えばソースコード1のいずれかの版を指定した修正候補特定要求が入力されると、修正候補特定処理を実行する。例えば最新の版のソースコード1cを指定した修正候補特定要求が入力されたものとする。
修正候補特定要求に応じて、処理部12は、複数の修正処理それぞれの修正記録2a~2cに示される削除コードと追加コードとを比較し、複数の修正処理のうち、処理の入出力を変えずにコードを修正するリファクタリングを行った第1修正処理を特定する。例えば処理部12は、複数の修正処理のうちの一修正処理において削除した削除コードが存在し、かつ一修正処理においてテストコードに変更がない場合に、一修正処理を第1修正処理として特定する。
図2の例では、第1版のソースコード1aを登録する処理を示す修正記録2aでは、追加コードは存在するが削除コードが存在しない。すなわち修正記録2aに対応する修正処理では、新たなコマンド行の追加のみが行われている。追加コードにおいて新たな入出力が発生しているため、処理部12は、修正記録2aに示される修正処理は、処理の入出力を変えずにコードを修正するリファクタリングではないと判断する。
第1版のソースコード1aを第2版のソースコード1bに修正する処理を示す修正記録2bでは、削除コードが追加コードに変更されている。また削除コードと追加コードとに、テストコードが含まれない。そのため処理部12は、修正記録2bに対応する修正処理は、処理の入出力を変えずにコードを修正するリファクタリングであると判断する。その結果、処理部12は、修正記録2bに示される修正処理を第1修正処理として特定する。
第2版のソースコード1bを第3版のソースコード1cに修正する処理を示す修正記録2cでは、削除コードが追加コードに変更されている。また削除コードと追加コードとに、テストコードが含まれており、テストコードで確認する変数の値が異なっている。そのため処理部12は、修正記録2cに対応する修正処理は、リファクタリングではないと判断する。
第1修正処理を特定後、処理部12は、第1修正処理の第1修正記録(修正記録2b)に基づいて、第1修正処理によって削除された削除コードを追加コードに含む第2修正処理を特定する。例えば修正記録2bには、削除コード「Command 2」が登録されている。この削除コードは修正記録2aの追加コードに含まれている。従って処理部12は、修正記録2aに対応する修正処理を第2修正処理として特定する。
第2修正処理を特定後、処理部12は、第2修正処理の第2修正記録(修正記録2a)に示される属性情報に基づいて、リファクタリング候補とする部分コードの属性を示す被疑属性を決定する。例えば処理部12は、複数の修正処理それぞれの修正記録2a~2cの属性情報に示される一属性項目の値の、複数の修正処理それぞれの修正記録における出現数に対する、第2修正処理の第2修正記録における出現数の割合を計算する。そして処理部12は、計算した割合が閾値以上の場合、一属性項目の値を被疑属性に決定する。閾値は、0より大きく1以下の実数である。
なお、属性情報に示される属性項目としては、例えば適用日時や作成者の識別子(例えば作成者の名称)がある。ここで属性項目として作成者の識別子に着目したとき、第2修正記録(修正記録2a)に示される作成者の識別子は「Coder A」である。作成者の識別子「Coder A」の作成者が修正処理を行ったのは1回のみであり、「Coder A」の修正記録への出現数は「1」である。また作成者の識別子「Coder A」の第2修正処理の第2修正記録への出現数も「1」である。すると作成者の識別子「Coder A」の修正記録への出現数に対する、第2修正記録への出現割合は「1(100%)」となる。この場合、処理部12は、作成者の識別子「Coder A」を被疑属性(被疑作成者)に決定する。
また属性項目として適用日時に着目したとき、第2修正記録(修正記録2a)に示される適用日時は「2018.1.5」である。処理部12は、例えば1週間(7日間)単位の期間ごとに、該当期間が被疑属性となるか否かを判断する。「2018.1.5」が属する判断対象の期間が「2017.12.30-2018.1.5」の場合、該当期間内に行われた修正処理は1回のみであり、該当期間内の日時の修正記録への出現数は「1」である。また期間「2017.12.30-2018.1.5」内の日時の第2修正処理の第2修正記録への出現数も「1」である。すると期間「2017.12.30-2018.1.5」の修正記録への出現数に対する、第2修正記録への出現割合は「1(100%)」となる。この場合、処理部12は、第2修正記録(修正記録2a)に示される適用日時は「2018.1.5」を含む期間「2017.12.30-2018.1.5」を、被疑属性(被疑期間)に決定する。
被疑属性を決定後、処理部12は、被疑属性を有する修正処理(被疑修正処理)によって最新版のソースコード1cに追加され、ソースコード1cに残存している部分コードを、リファクタリング候補として出力する。図1の例では、被疑期間に被疑作成者によって追加されたコマンド文「Command 1」がリファクタリング候補として出力される。
このようにコンピュータ10がリファクタリング候補を自動で特定し出力することで、技術的負債箇所を容易に特定可能となる。すなわちリファクタリングを行う開発者は、リファクタリング候補として示されたコマンド行と、そのコマンド行に関連する他の記述を確認することで、技術的負債箇所か否かを判断できる。その結果、例えばソースコード1cの全体の記述を確認する場合に比べ、技術的負債箇所の特定が容易となる。
しかも処理部12はテストコードの変更の有無によって、修正による入出力の変更の有無を判断する。これにより、実行された修正処理がリファクタリングか否かを正しく判断することができる。
さらに処理部12は、ある属性項目の値についての、第2修正記録への出現割合が閾値以上の場合に、その属性項目の値を被疑属性とする。これにより、技術的負債箇所である可能性が高い部分コードのみを、リファクタリング候補とすることができる。
処理部12は、作成者の識別子を被疑属性とすることができる。これにより、作成者の能力不足など、作成者に起因して発生した技術的負債箇所を、適確にリファクタリング候補として特定することができる。
また処理部12は、修正処理の適用日時を含む期間を、被疑属性とすることができる。これにより、例えば開発期限に間に合わせるために最適化を十分に実施することができなかった期間を、被疑属性(被疑期間)とすることができる。これにより、ソフトウェア開発の工程上の都合で除去できなかった技術的負債箇所を、適確にリファクタリング候補として特定することができる。
なお処理部12は、被疑属性が複数ある場合、例えば複数の被疑属性すべてに対応する属性を有する部分コード(被疑属性の論理積)を、リファクタリング候補として出力する。また処理部12は、被疑属性が複数ある場合、例えば複数の被疑属性うちの少なくとも1つに対応する属性を有する部分コード(被疑属性の論理和)を、リファクタリング候補として出力してもよい。
〔第2の実施の形態〕
次に第2の実施の形態について説明する。第2の実施の形態は、OSS(Open Source Software)の開発環境において、効率的なリファクタリングを支援するシステムである。
OSSなどでは、多数の開発者が非同期にかつ並行でソフトウェアを開発する「ソーシャルコーディング」が普及している。現在は、ソーシャルコーディングのためのコードリポジトリサービスも存在する。コードリポジトリサービスでは、コードの提出や承認、議論コメントなどのソーシャルコーディングのための情報交換が、すべてオンラインで実行可能である。一企業内でも、コードリポジトリサービスを行うサーバを設けることで、企業内の開発者間でのソーシャルコーディングを支援している。
図3は、第2の実施の形態のシステム構成例を示す図である。ネットワーク20を介して、サーバ100と複数の端末装置31,32,・・・とが接続されている。サーバ100は、ソーシャルコーディング基盤を実現するコンピュータである。端末装置31,32,・・・は、ソフトウェアの開発者またはレビュアが使用するコンピュータである。
図4は、サーバのハードウェアの一構成例を示す図である。サーバ100は、プロセッサ101によって装置全体が制御されている。プロセッサ101には、バス109を介してメモリ102と複数の周辺機器が接続されている。プロセッサ101は、マルチプロセッサであってもよい。プロセッサ101は、例えばCPU(Central Processing Unit)、MPU(Micro Processing Unit)、またはDSP(Digital Signal Processor)である。プロセッサ101がプログラムを実行することで実現する機能の少なくとも一部を、ASIC(Application Specific Integrated Circuit)、PLD(Programmable Logic Device)などの電子回路で実現してもよい。
メモリ102は、サーバ100の主記憶装置として使用される。メモリ102には、プロセッサ101に実行させるOS(Operating System)のプログラムやアプリケーションプログラムの少なくとも一部が一時的に格納される。また、メモリ102には、プロセッサ101による処理に利用する各種データが格納される。メモリ102としては、例えばRAM(Random Access Memory)などの揮発性の半導体記憶装置が使用される。
バス109に接続されている周辺機器としては、ストレージ装置103、グラフィック処理装置104、入力インタフェース105、光学ドライブ装置106、機器接続インタフェース107およびネットワークインタフェース108がある。
ストレージ装置103は、内蔵した記録媒体に対して、電気的または磁気的にデータの書き込みおよび読み出しを行う。ストレージ装置103は、コンピュータの補助記憶装置として使用される。ストレージ装置103には、OSのプログラム、アプリケーションプログラム、および各種データが格納される。なお、ストレージ装置103としては、例えばHDD(Hard Disk Drive)やSSD(Solid State Drive)を使用することができる。
グラフィック処理装置104には、モニタ21が接続されている。グラフィック処理装置104は、プロセッサ101からの命令に従って、画像をモニタ21の画面に表示させる。モニタ21としては、有機EL(Electro Luminescence)を用いた表示装置や液晶表示装置などがある。
入力インタフェース105には、キーボード22とマウス23とが接続されている。入力インタフェース105は、キーボード22やマウス23から送られてくる信号をプロセッサ101に送信する。なお、マウス23は、ポインティングデバイスの一例であり、他のポインティングデバイスを使用することもできる。他のポインティングデバイスとしては、タッチパネル、タブレット、タッチパッド、トラックボールなどがある。
光学ドライブ装置106は、レーザ光などを利用して、光ディスク24に記録されたデータの読み取りを行う。光ディスク24は、光の反射によって読み取り可能なようにデータが記録された可搬型の記録媒体である。光ディスク24には、DVD(Digital Versatile Disc)、DVD-RAM、CD-ROM(Compact Disc Read Only Memory)、CD-R(Recordable)/RW(ReWritable)などがある。
機器接続インタフェース107は、サーバ100に周辺機器を接続するための通信インタフェースである。例えば機器接続インタフェース107には、メモリ装置25やメモリリーダライタ26を接続することができる。メモリ装置25は、機器接続インタフェース107との通信機能を搭載した記録媒体である。メモリリーダライタ26は、メモリカード27へのデータの書き込み、またはメモリカード27からのデータの読み出しを行う装置である。メモリカード27は、カード型の記録媒体である。
ネットワークインタフェース108は、ネットワーク20に接続されている。ネットワークインタフェース108は、ネットワーク20を介して、他のコンピュータまたは通信機器との間でデータの送受信を行う。
サーバ100は、以上のようなハードウェア構成によって、第2の実施の形態の処理機能を実現することができる。なお、第1の実施の形態に示したコンピュータ10も、図4に示したサーバ100と同様のハードウェアにより実現することができる。
サーバ100は、例えばコンピュータ読み取り可能な記録媒体に記録されたプログラムを実行することにより、第2の実施の形態の処理機能を実現する。サーバ100に実行させる処理内容を記述したプログラムは、様々な記録媒体に記録しておくことができる。例えば、サーバ100に実行させるプログラムをストレージ装置103に格納しておくことができる。プロセッサ101は、ストレージ装置103内のプログラムの少なくとも一部をメモリ102にロードし、プログラムを実行する。またサーバ100に実行させるプログラムを、光ディスク24、メモリ装置25、メモリカード27などの可搬型記録媒体に記録しておくこともできる。可搬型記録媒体に格納されたプログラムは、例えばプロセッサ101からの制御により、ストレージ装置103にインストールされた後、実行可能となる。またプロセッサ101が、可搬型記録媒体から直接プログラムを読み出して実行することもできる。
次に、ソーシャルコーディングについて図5を参照して説明する。
図5は、ソーシャルコーディングを説明する図である。ソーシャルコーディング基盤として機能するサーバ100は、マスタコード111を記憶するコードリポジトリ110を有している。マスタコード111は、正式なバージョンのプログラムのソースコードである。マスタコード111は、例えば1つのファイル(ソースファイル)としてリポジトリに格納される。開発者41は、例えば端末装置31を用いてサーバ100にアクセスし、コードリポジトリ110内のマスタコード111を参照する。開発者41は、端末装置31を用いて、マスタコード111に対する機能の追加、不具合の修正、またはリファクタリングのための修正コード51を作成する。そして開発者41は、端末装置31に対して、修正コード51をサーバ100に送信させる。
送信された修正コード51は、サーバ100で保持される。その後、レビュア42が、例えば端末装置32を用いて修正コード51を参照し、レビューする。レビュア42は、修正コード51に問題がなければ、端末装置32を用いて、承認する旨のメッセージをサーバ100に送信する。サーバ100は、修正コード51が承認されると、修正コード51に示される修正内容を、マスタコード111に反映する。
ここで、開発者41がマスタコード111のリファクタリングをする場合、開発者41はマスタコード111の中から、まずリファクタリングの対象とする部分コードを特定する。この際、マスタコード111が大規模なプログラムの場合、すべての部分コードを開発者41が目視で確認して、リファクタリングの対象となる部分コードを特定するのは困難である。そこで、サーバ100は、マスタコード111の中から、リファクタリング対象となる可能性の高い部分コードをリファクタリング候補として抽出する。そしてサーバ100は、リファクタリング候補を、開発者41が使用する端末装置31に送信する。
図6は、サーバの機能を示すブロック図である。サーバ100は、図5に示したコードリポジトリ110以外に、コード修正管理部120、リファクタリング対象特定部130、被疑属性特定部140、コード属性特定部150、およびリファクタリング候補抽出部160を有する。
コードリポジトリ110は、修正によりバージョンが更新されたマスタコードの各バージョンのソースコード、および修正コード51による修正内容を示す修正記録を記憶する。
コード修正管理部120は、マスタコードのコード修正を管理する。例えばコード修正管理部120は、開発者またはレビュアが使用する端末装置31,32,・・・と通信し、図5に示したようなソーシャルコーディングの一連の手続きを管理する。
リファクタリング対象特定部130は、コードリポジトリ110に登録されたマスタコードの中から、リファクタリングを目的として追加された部分コードを特定する。例えばリファクタリング対象特定部130は、以下の2つの条件を共に満たす修正コードによって修正された修正前の部分コードを、リファクタリング対象として特定する。
・作成された部分コードが別の部分コードによって上書き修正されたこと。
・修正においてテストコードの修正がないこと。
テストコードは、変数の値が想定通りとなっているか否かを確認するために、プログラム中の1つの実現する部分コードの前後に設定される。テストコードは、例えば想定通りの入力値が入力されたか否かの確認、または想定通りの出力値が出力されたか否かの確認に利用される。テストコードの修正がないことは、修正箇所の入出力の仕様に変化がないことを表しており、修正の目的がリファクタリングである可能性が高い。
被疑属性特定部140は、例えば、複数のリファクタリング対象の属性(作成者、適用日時など)のうち、高頻度に出現する属性を特定する。例えば被疑属性特定部140は、被疑作成者特定部141と被疑期間特定部142とを有する。
被疑作成者特定部141は、リファクタリング対象の属性として高頻度で出現する作成者を、被疑作成者として特定する。被疑作成者は、後にリファクタリング対象となった部分コードを頻繁に作成した開発者であり、該当開発者が作成した未修正の部分コードは、リファクタリング対象である可能性が高い。
被疑期間特定部142は、例えばある期間内に実行されたマスタコードの更新処理のうち、後にリファクタリング対象となった部分コードの追加を行った更新処理が高頻度で含まれる場合、その期間を被疑期間として特定する。被疑期間は、後にリファクタリング対象となった部分コードが頻繁に適用された期間であり、該当期間内に適用された未修正の部分コードは、リファクタリング対象である可能性が高い。
コード属性特定部150は、マスタコードに含まれる部分コードの属性を特定する。例えばコード属性特定部150は、修正時に追加された部分コードについて、その部分コードの作成者、またはその部分コードを適用した日時を特定する。
リファクタリング候補抽出部160は、マスタコードからリファクタリング候補とする部分コードを抽出する。例えばリファクタリング候補抽出部160は、被疑作成者または被疑期間に該当する属性の部分コードを、リファクタリング候補とする。リファクタリング候補抽出部160は、リファクタリング候補を、リファクタリングを行う開発者が使用する端末装置(例えば端末装置31)に送信する。
なお、図6に示した各要素間を接続する線は通信経路の一部を示すものであり、図示した通信経路以外の通信経路も設定可能である。また、図6に示した各要素の機能は、例えば、その要素に対応するプログラムモジュールをコンピュータに実行させることで実現することができる。
次に、コードリポジトリ110に格納される情報について詳細に説明する。
図7は、コードリポジトリの一例を示す図である。コードリポジトリ110には、コード修正履歴管理テーブル112、マスタコード管理テーブル113、およびコード属性情報管理テーブル114が格納されている。
コード修正履歴管理テーブル112は、マスタコードに対して行われた修正記録112a,112b,・・・を管理するためのデータテーブルである。コード修正履歴管理テーブル112には、コード修正ごとの修正内容を示す修正記録112a,112b,・・・が登録されている。
マスタコード管理テーブル113は、過去に生成されたことのあるマスタコード111,111a,111b,111c,・・・を管理するためのデータテーブルである。マスタコード管理テーブル113には、最初に作成されたマスタコード111と、その後の修正によって生成されたマスタコード111a,111b,111c,・・・とが登録されている。
コード属性情報管理テーブル114は、最新のマスタコード111c内のコマンド行ごとの属性(作成者、適用日時など)を管理するためのデータテーブルである。コード属性情報管理テーブル114は、マスタコードが修正されるごとに、最新の情報に更新される。
図8は、コード修正履歴管理テーブルの一例を示す図である。コード修正履歴管理テーブル112には、変更ID、適用日時、作成者、追加内容、および削除内容の欄が設けられている。変更IDの欄には、マスタコードに対する修正処理の識別子(変更ID)が設定される。適用日時の欄には、修正コードがマスタコードに適用された日時が設定される。作成者の欄には、修正によって追加したコードを作成した開発者の名称が設定される。追加内容の欄には、修正コードの適用によってマスタコードに追加された部分コードが設定される。削除内容の欄には、修正コードの適用によってマスタコードから削除された部分コードが設定される。
図9は、マスタコード管理テーブルの一例を示す図である。マスタコード管理テーブル113には、バージョン、作成日時、最後に適用された変更ID、およびコード内容の欄が設けられている。バージョンの欄には、マスタコードのバージョンが設定される。作成日時の欄には、対応するバージョンのマスタコードが作成された日時が設定される。最後に適用された変更IDの欄には、対応するバージョンのマスタコードに最後に適用された修正コードの変更IDが設定される。コード内容の欄には、対応するバージョンのマスタコードの内容が設定される。なお、コード内容の欄には、マスタコードを直接記述するのではなく、マスタコードが記述されたソースファイルを示す情報(ファイルパスとファイル名)を設定することもできる。
図9の例では、バージョン「V1.0」のコード内容が、最初に生成されたマスタコード111である。また、バージョン「V1.1」、「V1.2」、「V1.3」それぞれのコード内容が、修正によって生成されたマスタコード111a,111b,111cである。
コード属性情報管理テーブル114は、マスタコードに対して修正コードが適用されるごとに更新される。以下、図10~図12を参照して、コード属性情報管理テーブル114の更新内容を説明する。
図10は、コード属性情報管理テーブルの第1の更新例を示す図である。例えば開発者43(名称「Coder A」)が、バージョン「V1.0」のマスタコード111に対する修正コード51を作成したものとする。開発者43は、端末装置を用いて、修正コード51の追加を示す変更要求61をサーバ100に送信する。例えば開発者43は、端末装置を用いて、サーバ100に対して、ユーザ名「Coder A」のアカウントでログインする。そして開発者43は、ログインしたアカウントにより、変更要求61をサーバ100に入力する。変更要求61には、修正コード51が含まれる。
サーバ100では、コード修正管理部120が、変更要求61に応じて、修正コード51の内容をマスタコード111に適用する。これにより、バージョン「V1.1」のマスタコード111aが生成される。バージョン「V1.1」のマスタコード111aには、修正コード51に示される部分コードが追加されている。このときコード修正管理部120は、修正コード51を適用する修正処理に対して変更IDを付与する。図10の例では変更ID「C001」が付与されている。
マスタコード111に修正コード51が適用されると、コード属性特定部150がコード属性情報管理テーブル114を更新する。コード属性情報管理テーブル114には、行番号、コマンド、変更ID、日時、および作成者の欄が設けられている。行番号の欄には、ソースコード内の各コマンド行の行番号が設定される。コマンドの欄には、対応する行番号のコマンド行の文字列が設定される。変更IDの欄には、対応する行番号のコマンド行が追加された修正処理の変更IDが設定される。日時の欄には、修正コードを適用した日時が設定される。作成者の欄には、修正コードを作成した開発者の名称が設定される。開発者の名称は、例えば変更要求の入力を行ったアカウントのユーザ名である。
例えば修正コード51の適用前は、コード属性情報管理テーブル114には行番号「1」、コマンド「/* Calculation */」のコマンド行のみが存在する。修正コード51が適用されると、コード属性特定部150が、コード属性情報管理テーブル114に行番号「2」~「8」のレコードを追加する。各レコードのコマンドの欄には、修正コード51に示されるコマンド行が設定される。追加されたレコードそれぞれの変更IDは「C001」であり、日時は「2018.1.5」(2018年1月5日)であり、作成者は「Coder A」である。
図11は、コード属性情報管理テーブルの第2の更新例を示す図である。例えば開発者44(名称「Coder B」)が、バージョン「V1.1」のマスタコード111aに対する修正コード53を作成したものとする。修正コード53は、マスタコード111a内の部分コード(削除コード52)を削除した位置に挿入する部分コードである。この場合、開発者44は、端末装置を用いて、削除コード52から修正コード53への修正を示す変更要求62をサーバ100に送信する。変更要求62には、削除コード52と修正コード53とが含まれる。なお変更要求62には、削除コード52に代えて、削除コード52のマスタコード111a内での行番号が示されていてもよい。
サーバ100では、コード修正管理部120が、変更要求62に応じて、修正コード53の内容をマスタコード111aに適用する。すなわちコード修正管理部120は、マスタコード111aから削除コード52に対応するコードを削除し、削除したコードがあった位置に修正コード53を挿入する。これにより、バージョン「V1.2」のマスタコード111bが生成される。このときコード修正管理部120は、修正コード53を適用する修正処理に対して変更IDを付与する。図11の例では変更ID「C002」が付与されている。
マスタコード111aに修正コード53が適用されると、コード属性特定部150がコード属性情報管理テーブル114を更新する。例えば修正コード53が適用されると、コード属性特定部150が、修正前のコード属性情報管理テーブル114から行番号「4」~「7」のレコードを削除する。さらにコード属性特定部150は、コード属性情報管理テーブル114に新たに、修正コード53に対応する行番号「4」~「5」のレコードを追加する。追加されたレコードのコマンドの欄には、修正コード53に示されるコマンド行が設定される。追加されたレコードそれぞれの変更IDは「C002」であり、日時は「2018.1.6」(2018年1月6日)であり、作成者は「Coder B」である。
図12は、コード属性情報管理テーブルの第3の更新例を示す図である。例えば開発者45(名称「Coder C」)が、バージョン「V1.2」のマスタコード111bに対する修正コード56,57を作成したものとする。修正コード56,57は、マスタコード111b内の部分コード(削除コード54,55)を削除した位置に挿入する部分コードである。この場合、開発者45は、端末装置を用いて、削除コード54,55から修正コード56,57への修正を示す変更要求63をサーバ100に送信する。変更要求63には、削除コード54,55と修正コード56,57とが含まれる。なお変更要求63には、削除コード54,55に代えて、削除コード54,55のマスタコード111b内での行番号が示されていてもよい。
サーバ100では、コード修正管理部120が、変更要求63に応じて、修正コード56,57の内容をマスタコード111bに適用する。すなわちコード修正管理部120は、マスタコード111bから削除コード54,55に対応するコードを削除し、削除したコードがあった位置に修正コード56,57を挿入する。これにより、バージョン「V1.3」のマスタコード111cが生成される。このときコード修正管理部120は、修正コード56,57を適用する修正処理に対して変更IDを付与する。図12の例では変更ID「C003」が付与されている。
マスタコード111aに修正コード56,57が適用されると、コード属性特定部150がコード属性情報管理テーブル114を更新する。例えば修正コード56,57が適用されると、コード属性特定部150が、修正前のコード属性情報管理テーブル114から行番号「4」,「6」のレコードを削除する。さらにコード属性特定部150は、コード属性情報管理テーブル114に新たに、修正コード56,57に対応する行番号「4」,「6」のレコードを追加する。追加されたレコードのコマンドの欄には、修正コード56,57に示されるコマンド行が設定される。追加されたレコードそれぞれの変更IDは「C003」であり、日時は「2018.1.9」(2018年1月9日)であり、作成者は「Coder C」である。
図10~図12に示したような修正処理の内容は、コード修正管理部120により、修正記録112a,112b,・・・としてコード修正履歴管理テーブル112に登録される。またマスタコードの修正が行われると、コード修正管理部120により、新たなバージョンのマスタコードが、マスタコード管理テーブル113に登録される。
コード開発時にコード修正履歴管理テーブル112、マスタコード管理テーブル113、およびコード属性情報管理テーブル114は、コード開発過程でコードの修正が行われるごとに更新される。
図13は、コード開発時の処理手順の一例を示すフローチャートである。以下、図13に示す処理をステップ番号に沿って説明する。
[ステップS11]コード修正管理部120は、開発者が使用する端末装置から、マスタコードの変更要求を受信する。
[ステップS12]コード修正管理部120は、変更要求に示されるコード修正に対応する修正記録を、コードリポジトリ110に保存する。例えばコード修正管理部120は、コード修正履歴管理テーブル112に、新たな変更IDを付与したレコードを追加する。コード修正管理部120は、追加したレコードの適用日時として、現在の日時を設定する。またコード修正管理部120は、追加したレコードの作成者として、変更要求を送信した開発者の名称を設定する。またコード修正管理部120は、追加したレコードの追加内容として、変更要求に示される修正コードを設定する。さらにコード修正管理部120は、変更要求において削除コードが示されている場合、追加したレコードの削除内容として、変更要求に示される削除コードを設定する。
[ステップS13]コード修正管理部120は、変更要求に応じた修正内容を、マスタコードに反映する。例えばコード修正管理部120は、マスタコード管理テーブル113から、最新のバージョンのマスタコードのコード内容を取得する。コード修正管理部120は、取得したコード内容に対して、変更要求に応じた修正(部分コードの削除または部分コードの追加)を行う。
[ステップS14]コード修正管理部120は、修正後のマスタコードをコードリポジトリ110に保存する。例えばコード修正管理部120は、マスタコード管理テーブル113に、新たなバージョン番号を付与したレコードを追加する。コード修正管理部120は、追加したレコードの作成日時として、現在の日時を設定する。またコード修正管理部120は、追加したレコードの最後に適用された変更IDとして、ステップS12で保存した修正記録の変更IDを設定する。さらにコード修正管理部120は、追加したレコードのコード内容として、修正後のマスタコードを設定する。なおコード修正管理部120は、追加したレコードのコード内容として、修正後のマスタコードが記述されたソースファイルを示す情報(ファイルパスとファイル名)を設定してもよい。
[ステップS15]コード属性特定部150は、コード属性情報管理テーブル114を更新する。例えばコード属性特定部150は、変更要求に応じてソースコードから部分コードが削除された場合、削除された部分コード内の各コマンド行に対応するコード属性情報管理テーブル114内のレコードを削除する。またコード属性特定部150は、変更要求に応じて追加した部分コードの各コマンド行に対応するレコードを、コード属性情報管理テーブル114に追加する。コード属性情報管理テーブル114は、追加したレコードの行番号として、対応するコマンド行の行番号を設定する。またコード属性情報管理テーブル114は、追加したレコードのコマンドとして、対応するコマンド行に追加されたコマンドを設定する。またコード属性情報管理テーブル114は、追加したレコードの変更IDとして、ステップS12で保存した修正記録の変更IDを設定する。またコード属性情報管理テーブル114は、追加したレコードの日時として、現在の日時を設定する。さらにコード属性情報管理テーブル114は、追加したレコードの作成者として、変更要求を送信した端末装置を使用している開発者の名称を設定する。
コード属性情報管理テーブル114の更新が終了すると、ステップS11に進められ、サーバ100は、次の変更要求を受信するまで待機する。
以上のようにして、開発者による部分コードの修正が行われるごとに、コードリポジトリ110に格納されている各テーブルが更新される。そしてサーバ100は、コードリポジトリ110内の各テーブルに基づいて、任意のバージョンのマスタコード内のリファクタリング対象候補となる部分コードを特定することができる。
ここで、バージョン「V1.3」のマスタコード111cに対して、開発者41がリファクタリングを行う場合を想定する。この場合、開発者41は、端末装置31を用いて、サーバ100に対して、バージョン「V1.3」のマスタコード111cを指定したリファクタリング候補特定要求を送信する。サーバ100は、リファクタリング候補特定要求に応じて、マスタコード111cからリファクタリング対象となる可能性が高い部分コードを特定し、特定した部分コードをリファクタリング候補とする。
以下、リファクタリング候補の特定処理を具体的に説明する。
リファクタリング対象特定部130は、まず部分コードの修正記録に基づいて、リファクタリングによって修正した後の部分コード(リファクタリングコード)と、リファクタリングによって修正された元の部分コード(リファクタードコード)とを特定する。リファクタリングコードであるための条件は、以下の通りである。
(条件a)削除した部分コード(削除コード)があること。
(条件b)テストコード(例えばassert文)の変更がないこと。
リファクタリング対象特定部130は、条件aと条件bを共に満たす部分コードを、リファクタリングコードと判定する。
部分コードがリファクタードコードであるための条件は、以下の通りである。
(条件c)リファクタードコードか否かの検討対象の部分コード内に、該当部分コードが作成された後に、他のリファクタリングコードによって修正された1以上のコマンド行があること。
リファクタリング対象特定部130は、条件cを満たす部分コードを、リファクタードコードと判定する。
図14は、リファクタリング対象特定処理を示す第1の例である。図14には、変更ID「C002」に示された修正処理に関するリファクタリング対象の特定処理を示している。
変更ID「C002」の修正処理では、変更ID「C001」で追加された部分コードを削除し、新たな部分コードを追加している。従って条件aが満たされている。また変更ID「C002」の修正処理では、テストコードであるassert文に変更はない。従って条件bが満たされている。その結果、リファクタリング対象特定部130は、変更ID「C002」の修正処理で追加された部分コードを、リファクタリングコードであると判定する。
また変更ID「C001」の修正処理で追加された部分コード内の一部のコマンド行は、変更ID「C002」の修正処理において、リファクタリングコードによって変更されている。従って条件cが満たされている。その結果、リファクタリング対象特定部130は、変更ID「C001」で追加された部分コードを、リファクタードコードであると判定する。
図15は、リファクタリング対象特定処理を示す第2の例である。図15には、変更ID「C003」に示された修正処理に関するリファクタリング対象の特定処理を示している。
変更ID「C003」の修正処理では、変更ID「C002」で追加されたコマンド行「for(i=0; i<10; i++){」を削除し、新たなコマンド行「for(i=0; i<11; i++){」を追加している。従って条件aが満たされている。ただし変更ID「C003」の修正処理では、テストコードであるassert文が変更されている。従って条件bが満たされない。その結果、リファクタリング対象特定部130は、変更ID「C003」の修正処理で追加された部分コードは、リファクタリングコードではないと判定する。
変更ID「C003」の修正処理において追加された部分コードがリファクタリングコードではないため、条件cを満たすことはできない。その結果、リファクタリング対象特定部130は、変更ID「C002」で追加された部分コードは、変更ID「C003」の修正処理で変更されているものの、リファクタードコードではないと判定する。
リファクタリング対象特定部130は、リファクタリング対象特定処理の結果に基づいて、リファクタリング対象情報を生成する。
図16は、リファクタリング対象情報の一例を示す図である。リファクタリング対象情報131には、変更ID、リファクタリングコードか否か、リファクタリングターゲット、リファクタードコードか否か、およびリファクタをした修正処理の欄が設けられている。
変更IDの欄には、修正処理の変更IDが設定される。
リファクタリングコードか否かの欄には、対応する修正処理で追加された部分コードが、リファクタリングコードか否かを示す情報が設定される。例えば追加されたコードがリファクタリングコードであれば、リファクタリングコードか否かの欄に「Yes」と設定される。また追加された部分コードがリファクタリングコードでなければ、リファクタリングコードか否かの欄に「No」と設定される。
リファクタリングターゲットの欄には、対応する修正処理で追加された部分コードがリファクタリングコードの場合において、そのリファクタリングコードで修正したリファクタードコードを追加コードとして含む修正処理の変更IDが設定される。
リファクタードコードか否かの欄には、対応する修正処理で追加された部分コードが、他の修正処理によるリファクタードコードであるか否かを示す情報が設定される。例えば追加された部分コードがリファクタードコードであれば、リファクタードコードか否かの欄に「Yes」と設定される。また追加された部分コードがリファクタードコードでなければ、リファクタードコードか否かの欄に「No」と設定される。
リファクタをした修正処理の欄には、対応する修正処理で追加された部分コードがリファクタードコードの場合において、そのリファクタードコードを修正した修正処理の変更IDが設定される。
図16の例では、変更ID「C001」のレコードには、対応する修正処理で追加された部分コードがリファクタードコードであり、該当コードは、変更ID「C002」の修正処理によって修正されていることが示されている。また変更ID「C002」のレコードには、対応する修正処理で追加された部分コードがリファクタリングコードであり、該当部分コードによる修正の対象は、変更ID「C001」で追加された部分コードであることが示されている。
リファクタリング対象特定部130は、生成したリファクタリング対象情報131を、被疑属性特定部140に送信する。被疑属性特定部140は、リファクタリング対象情報131を用いて、被疑作成者または被疑期間を特定する。
図17は、被疑作成者の特定例を示す図である。被疑属性特定部140の被疑作成者特定部141は、各開発者が、過去にリファクタリング対象となったリファクタードコードを作成した数や割合を、コード修正履歴管理テーブル112とリファクタリング対象情報131に基づいて算出する。
例えば被疑作成者特定部141は、コード修正履歴管理テーブル112を参照し、開発者ごとに、変更回数を計数する。また被疑作成者特定部141は、コード修正履歴管理テーブル112とリファクタリング対象情報131を参照し、開発者ごとに、その開発者が作成した部分コードがリファクタードコードであると判定された回数(リファクタードコード数)を計数する。そして被疑作成者特定部141は、開発者ごとに、その開発者によって作成された部分コードがリファクタードコードと判定された割合を計算する。
被疑作成者特定部141は、例えば計算した割合が所定の閾値以上となる開発者を、被疑作成者とする。被疑作成者特定部141は、例えばすべての開発者について被疑作成者か否かを判定し、判定結果を示す被疑作成者情報143を生成する。
被疑作成者情報143には、作成者、リファクタードコード数、全変更回数、割合、および被疑作成者か否かの欄が設けられている。作成者の欄には、開発者の名称が設定される。リファクタードコード数の欄には、開発者が追加した部分コードのうちの、リファクタードコードの数が設定される。全変更回数の欄には、開発者がコード修正を行った回数(全変更回数)が設定される。割合の欄には、開発者の全変更回数に対するリファクタードコード数の割合が設定される。被疑作成者か否かの欄には、開発者が被疑作成者か否かが設定される。例えば開発者が被疑作成者であれば、被疑作成者か否かの欄に「Yes」と設定される。また開発者が被疑作成者でなければ、被疑作成者か否かの欄に「No」と設定される。
図17には、全変更回数に対するリファクタードコード数の割合が0.3以上の開発者を被疑作成者と判定する場合の例が示されている。この場合、開発者「Coder A」は被疑作成者であるが、開発者「Coder B」と「Coder C」とは被疑作成者ではない。
なお被疑作成者特定部141は、リファクタードコード数が所定値以上の場合に被疑作成者と判定してもよい。さらに被疑作成者特定部141は、割合またはリファクタードコード数が上位から所定数の開発者を、被疑作成者としてもよい。
図18は、被疑期間の特定例を示す図である。被疑属性特定部140の被疑期間特定部142は、リファクタリング対象となったリファクタードコードが作成された日時が集中する期間を、被疑期間として特定する。例えば被疑期間特定部142は、コード修正履歴管理テーブル112を参照し、一定の期間ごとに、該当期間内でのソースコードの変更回数を計数する。また被疑期間特定部142は、コード修正履歴管理テーブル112とリファクタリング対象情報131を参照し、一定の期間ごとに、該当期間内に作成されたコードがリファクタードコードであると判定された回数(リファクタードコード数)を計数する。そして被疑期間特定部142は、一定の期間ごとに、該当期間内に作成された部分コードがリファクタードコードと判定された割合を計算する。
被疑期間特定部142は、例えば計算した割合が所定の閾値以上となる期間を、被疑期間とする。被疑期間特定部142は、例えばすべての期間について被疑期間か否かを判定し、判定結果を示す被疑期間情報144を生成する。
被疑期間情報144には、期間、リファクタードコード数、全変更回数、割合、および被疑期間か否かの欄が設けられている。期間の欄には、判定対象の期間(開始日時と終了日時)が設定される。リファクタードコード数の欄には、判定対象の期間内に追加された部分コードのうちの、リファクタードコードの数が設定される。全変更回数の欄には、判定対象の期間内にコード修正が行われた回数(全変更回数)が設定される。割合の欄には、判定対象の期間の全変更回数に対するリファクタードコード数の割合が設定される。被疑期間か否かの欄には、判定対象の期間が被疑期間か否かが設定される。例えば判定対象の期間が被疑期間であれば、被疑期間か否かの欄に「Yes」と設定される。また判定対象の期間が被疑期間でなければ、被疑期間か否かの欄に「No」と設定される。
図18には、全変更回数に対するリファクタードコード数の割合が0.3以上の期間を被疑期間と判定する場合の例が示されている。この場合、期間「2017.12.30-2018.1.5」は被疑期間であるが、期間「2018.1.6-2018.1.12」と「2018.1.13-2018.1.20」とは被疑期間ではない。
なお被疑期間特定部142は、リファクタードコード数が所定値以上の場合に被疑期間と判定してもよい。さらに被疑期間特定部142は、割合またはリファクタードコード数が上位から所定数の期間を、被疑期間としてもよい。
被疑作成者と被疑期間とが特定されると、リファクタリング候補抽出部160が、ソースコードからリファクタリング候補を抽出する。
図19は、リファクタリング候補の抽出例を示す図である。図19には、バージョン「V1.3」のソースコードについてのリファクタリング候補の抽出例が示されている。
リファクタリング候補抽出部160は、被疑作成者情報143から、被疑作成者の名称を取得する。またリファクタリング候補抽出部160は、被疑期間情報144から、被疑期間を示す情報を取得する。次にリファクタリング候補抽出部160は、コード属性情報管理テーブル114を参照し、被疑作成者が作成したコマンド行と、被疑期間内に作成されたコマンド行とを抽出する。そしてリファクタリング候補抽出部160は、例えば抽出したコマンド行の行番号とコマンドとを出力する。出力された情報は、例えばリファクタリングを行う開発者が使用する端末装置に送信され、その端末装置の画面に表示される。
このようにして、多くのリファクタードコードを作成した開発者によって作成されたか、または多くのリファクタードコードが追加された期間内に作成された部分コードのうち、着目したバージョンのソースコードに残存している部分コードが表示される。開発者は、出力された結果を見て、ソースコード内の該当コードおよび関連するコードを確認し、リファクタリングを行うか否かを判断する。
図19の例では、リファクタリング候補として「2行目:x=0;」と「3行目:y=0;」とが抽出されている。開発者は、ソースコード内のこれらのコマンド行に関連する記述を確認する。そして開発者は、例えばバージョン「V1.3」のソースコードでは変数yについて、3行目で値が設定されているものの、他の場所で使用されていないことを見つけることができる。すなわち3行目のコマンド行が削除できる可能性がある。開発者は、3行目のコマンド行を削除可能と判断した場合、端末装置を用いてそのコマンド行を削除する変更要求をサーバ100に送信する。
なお、被疑作成者と被疑期間のように、被疑コード属性が複数ある場合、リファクタリング候補抽出部160は、例えばそれらの被疑コード属性の論理積(AND)によってリファクタリング候補を特定する。またリファクタリング候補抽出部160は、それらの被疑コード属性の論理和(OR)によってリファクタリング候補を特定してもよい。
図20は、被疑コード属性の論理積を採用した場合と論理和を採用した場合との出力結果の違いを示す図である。図20の例では、被疑作成者情報143aには、被疑作成者として「Coder A」などが示されている。また被疑期間情報144aには、被疑期間として「2017.12.30-2018.1.6」などが示されている。
他方、コード属性情報管理テーブル114aには、行番号「2」、「3」のコマンド行が、開発者「Coder A」によって、日時「2018.1.5」に作成されたことが示されている。またコード属性情報管理テーブル114aには、行番号「4」のコマンド行が、開発者「Coder A」によって、日時「2018.1.9」に作成されたことが示されている。さらにコード属性情報管理テーブル114aには、行番号「5」のコマンド行が、開発者「Coder B」によって、日時「2018.1.6」に作成されたことが示されている。
ここでリファクタリング候補の抽出条件として、被疑コード属性の論理積(AND)を採用した場合、被疑作成者と被疑期間との両方に該当するコマンド行が、リファクタリング候補として抽出される。図20の例では、行番号「2」、「3」のコマンド行「Command 2」、「Command 3」がリファクタリング候補として抽出される。
また ここでリファクタリング候補の抽出条件として、被疑コード属性の論理和(OR)を採用した場合、被疑作成者と被疑期間とのいずれかに該当するコマンド行が、リファクタリング候補として抽出される。図20の例では、行番号「2」~「5」のコマンド行「Command 2」、「Command 3」、「Command 4」、「Command 5」がリファクタリング候補として抽出される。
次に、リファクタリング候補抽出処理の手順を詳細に説明する。リファクタリング候補抽出処理は、例えばリファクタリングを行う開発者が使用する端末装置からの、リファクタリング候補特定要求の入力に応じて実行される。
図21は、リファクタリング候補抽出処理の手順の一例を示すフローチャートである。以下、図21に示す処理をステップ番号に沿って説明する。
[ステップS21]リファクタリング対象特定部130は、コード修正履歴管理テーブル112を参照し、コード修正でソースコードに追加された部分コードの中から、リファクタリングコードとリファクタードコードとを特定する。そしてリファクタリング対象特定部130は、リファクタリングコードとリファクタードコードとを示すリファクタリング対象情報131を生成する。リファクタリングコードとリファクタードコード特定処理の詳細は後述する(図22参照)。
[ステップS22]被疑作成者特定部141は、リファクタリング対象特定部130からリファクタリング対象情報131を取得し、取得したリファクタリング対象情報131とコード修正履歴管理テーブル112とに基づいて被疑作成者を特定する。例えば被疑作成者特定部141は、開発者ごとに、リファクタードコード数と全変更回数とを集計する。そして被疑作成者特定部141は、開発者ごとに、リファクタードコード数を全変更回数で除算し、その開発者が作成した追加コードがリファクタードコードである割合を算出する。被疑作成者特定部141は、開発者ごとに、算出した割合を所定の閾値と比較し、割合が閾値以上であれば、該当する開発者を被疑作成者として特定する。被疑作成者特定部141は、被疑作成者を特定した場合、被疑作成者情報143に対し、被疑作成者の名称に対応付けて、被疑作成者か否かの欄に「Yes」を設定する。
[ステップS23]被疑期間特定部142は、リファクタリング対象特定部130からリファクタリング対象情報131を取得し、取得したリファクタリング対象情報131とコード修正履歴管理テーブル112とに基づいて被疑期間を特定する。例えば被疑期間特定部142は、一定の期間ごとに、リファクタードコード数と全変更回数とを集計する。そして被疑期間特定部142は、期間ごとに、リファクタードコード数を全変更回数で除算し、その期間内で作成された追加コードがリファクタードコードである割合を算出する。被疑期間特定部142は、期間ごとに、算出した割合を所定の閾値と比較し、割合が閾値以上であれば、該当する期間を被疑期間として特定する。被疑期間特定部142は、被疑期間を特定した場合、被疑期間情報144に対し、被疑期間に対応付けて、被疑期間か否かの欄に「Yes」を設定する。
[ステップS24]リファクタリング候補抽出部160は、被疑作成者情報143、被疑期間情報144、およびコード属性情報管理テーブル114を参照し、ソースコードからリファクタリング候補となる部分コードを特定する。例えばリファクタリング候補抽出部160は、抽出条件が論理積の場合、被疑作成者情報143に示される被疑作成者の名称と被疑期間情報144に示される被疑期間の内の日時とを含むレコードを、コード属性情報管理テーブル114から抽出する。またリファクタリング候補抽出部160は、抽出条件が論理和の場合、被疑作成者情報143に示される被疑作成者の名称、被疑期間情報144に示される被疑期間の内の日時とのいずれかを含むレコードを、コード属性情報管理テーブル114から抽出する。リファクタリング候補抽出部160は、抽出したレコードに示されるコマンド行を、リファクタリング候補として特定する。
[ステップS25]リファクタリング候補抽出部160は、特定したリファクタリング候補を出力する。例えばリファクタリング候補抽出部160は、リファクタリングを行う開発者が使用する端末装置へ、リファクタリング候補のコマンド行を示す情報を送信する。
以上のようにして、リファクタリング候補が特定される。リファクタリング候補が自動で特定されることで、リファクタリングを行う開発者は、マスタコード内のリファクタリング候補に関連する部分を精査すればよく、作業効率が向上する。
次に、リファクタリングコードとリファクタードコード特定処理の詳細について説明する。
図22は、リファクタリングコードとリファクタードコード特定処理の手順の一例を示すフローチャートである。
[ステップS31]リファクタリング対象特定部130は、コード修正履歴管理テーブル112から、未選択の修正記録を1つ選択する。
[ステップS32]リファクタリング対象特定部130は、選択した修正記録に示される修正内容に、既存の部分コードの削除が含まれるか否かを判断する。例えばリファクタリング対象特定部130は、コード修正履歴管理テーブル112における選択した修正記録のレコードに、削除内容としてコマンド行が設定されている場合、既存の部分コードの削除が含まれると判定する。リファクタリング対象特定部130は、既存の部分コードの削除が含まれる場合、処理をステップS32に進める。またリファクタリング対象特定部130は、既存の部分コードの削除が含まれない場合、処理をステップS37に進める。
[ステップS33]リファクタリング対象特定部130は、選択した修正記録に示される修正内容に、テストコードの変更があるか否かを判断する。例えばリファクタリング対象特定部130は、修正記録において、追加されたassert文に示される変数の値が、削除されたassert文に示される変数の値と異なる場合、テストコードが変更されたと判断する。リファクタリング対象特定部130は、テストコードの変更がある場合、処理をステップS37に進める。またリファクタリング対象特定部130は、テストコードの変更がない場合、修正による入出力の変更がないと認識し、処理をステップS34に進める。
[ステップS34]リファクタリング対象特定部130は、抽出した修正記録に示される追加コードを、リファクタリングコードとして特定する。この際、リファクタリング対象特定部130は、例えばリファクタリング対象情報131に対し、選択した修正記録の変更IDに対応付けて、リファクタリングコードか否かの欄に「Yes」を設定する。
[ステップS35]リファクタリング対象特定部130は、コード修正履歴管理テーブル112に基づいて、選択した修正記録に示される修正で削除された削除コードを追加コードとして含む他の修正記録を特定する。
[ステップS36]リファクタリング対象特定部130は、特定した修正記録の追加コードを、リファクタードコードとして特定する。この際、リファクタリング対象特定部130は、リファクタリング対象情報131に対し、リファクタードコードを追加した修正処理を示す修正記録の変更IDに対応付けて、リファクタードコードか否かの欄に「Yes」を設定する。
[ステップS37]リファクタリング対象特定部130は、未選択の修正記録があるか否かを判断する。リファクタリング対象特定部130は、未選択の修正記録がある場合、処理をステップS31に進める。またリファクタリング対象特定部130は、すべての修正記録が選択済みであれば、リファクタリングコードとリファクタードコード特定処理を終了する。
このようにして、リファクタリングコードとリファクタードコードとを正しく特定することができる。リファクタードコードを正しく特定できることにより、どのような属性のコードがリファクタードコードになりやすいのかについての解析精度が向上する。その結果、リファクタリング候補を高精度に判定することが可能となる。
〔その他の実施の形態〕
第2の実施の形態では、サーバ100は、コード開発時にコード属性情報管理テーブル114を生成しているが、リファクタリング候補抽出時にコード属性情報管理テーブル114を生成することもできる。その場合、サーバ100のコード属性特定部150は、ソースコードの修正記録に基づいて、ソースコードに対して行われた修正処理を再現する。そしてコード属性特定部150は、再現された修正処理ごとにコード属性情報管理テーブル114を更新することで、任意のバージョンのソースコードが作成された時点でのコード属性情報管理テーブル114を生成する。
以上、実施の形態を例示したが、実施の形態で示した各部の構成は同様の機能を有する他のものに置換することができる。また、他の任意の構成物や工程が付加されてもよい。さらに、前述した実施の形態のうちの任意の2以上の構成(特徴)を組み合わせたものであってもよい。