JPH09146766A - クラス構造変更方法 - Google Patents

クラス構造変更方法

Info

Publication number
JPH09146766A
JPH09146766A JP7323911A JP32391195A JPH09146766A JP H09146766 A JPH09146766 A JP H09146766A JP 7323911 A JP7323911 A JP 7323911A JP 32391195 A JP32391195 A JP 32391195A JP H09146766 A JPH09146766 A JP H09146766A
Authority
JP
Japan
Prior art keywords
class
name
attribute
analysis information
code
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
JP7323911A
Other languages
English (en)
Inventor
Ryoichi Ueda
良一 植田
Gunji Tsukuda
軍治 佃
Hirobumi Danno
博文 団野
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Hitachi Ltd
Original Assignee
Hitachi Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Hitachi Ltd filed Critical Hitachi Ltd
Priority to JP7323911A priority Critical patent/JPH09146766A/ja
Publication of JPH09146766A publication Critical patent/JPH09146766A/ja
Pending legal-status Critical Current

Links

Landscapes

  • Stored Programmes (AREA)

Abstract

(57)【要約】 【課題】 既存クラスの構造を変更する時にクラスコー
ド解析情報を利用して共通属性だけを使用するメソッド
を上位クラスへ移動する洗練化作業を支援する。 【解決手段】 オブジェクト指向言語のソースコードか
らクラス仕様解析情報(以下、Cという)を作成し、利用
者が入力する共通属性情報を取得し、該情報に従い共通
属性だけからなる新規上位クラス(以下、D)を作りCを
修正し、変更対象下位クラス(以下、E)の共通属性の統
合をし、C中のメソッドコードからメソッドコード解析
情報を作成し、Eで使用属性集合が共通属性のみのメソ
ッドをDへ移動しCを修正し、主要EからDへ移動した
主要メソッドと、使用属性集合と使用メソッド集合が同
一の統合候補対象メソッドとの対を検出し、該メソッド
に関するコードを削除し、該メソッドの使用箇所でのメ
ソッド名称を該メソッド名称から主要メソッド名称に置
換しCを修正し、Cをソースコードで出力する。

Description

【発明の詳細な説明】
【0001】
【発明の属する技術分野】本発明は、ソフトウェアの生
産性向上に関わり、開発対象のシステムをオブジェクト
の集合として捉えた時のオブジェクトを抽象化した概念
であるクラスの定義を、より洗練化する際に必要となる
クラス構造変更方法に関する。
【0002】
【従来の技術】オブジェクト指向言語のプログラムで
は、クラスがプログラムを構成する単位となる。クラス
間には継承関係と呼ばれる階層構造を定義することがで
き、各クラスはその上位クラスで定義された機能をその
まま受け継ぐことができる。このクラス間の機能継承に
より、冗長なコードのない、汎用性の高いソフトウェア
が作成できる。しかし、クラス構造の設計が充分に行な
われないままコーディング作業へ入った結果、コーディ
ング作業中にクラスの構造を変更が必要となることがあ
る。このような場合、従来では変更の影響を人間がテキ
スト検索ツールなどを使って探索して修正するという作
業を行なってきた。このような作業を支援する方法とし
て、既存のクラス階層を論理的な機能を保持したまま再
編成する方法が特開平5−134874に開示されてい
る。該方法では、既存クラスのクラス階層、各クラスの
定義内容、変更後のクラス階層、既存クラスのクラス階
層中のクラスと変更後のクラス階層中のクラスとの対応
関係を入力として、既存クラスを用いて作成されたアプ
リケーションに影響を及ぼさないように各クラスの定義
内容を決定することができる。
【0003】
【発明が解決しようとする課題】しかし、従来技術では
変更後に存在するクラスと変更前に存在していたクラス
とは1対1に対応していなければならないので新たな抽
象クラスを作る場合のようにクラスの数が増える変更に
は対応していない。また、メソッドがどの属性を使用す
るかといった属性とメソッド間の関係を解析していない
ので、手作業で抽象クラスの抽出などの作業をする際に
作業支援することもできない。本発明の第1の目的は、
既存クラスの構造を変更する時にクラスコード解析情報
を利用して共通属性だけを使用するメソッドを上位クラ
スへ移動する洗練化作業を支援し、冗長なコードの除去
や再利用性・保守性の向上をもたらし、ひいては、ソフ
トウェアの生産性を向上させることである。本発明の第
2の目的は、開発中のクラスコードに対しても開発後の
クラスコードと同様にその洗練化作業を支援し、ひいて
はソフトウェアの生産性を向上させることである。本発
明の第3の目的は、共通属性以外の属性も使用するメソ
ッドに対しても共通属性だけを使用するメソッドと同様
にその洗練化作業を支援し、ひいてはソフトウェアの生
産性を向上させることである。本発明の第4の目的は、
変更対象クラスだけでなく、直接の変更対象となったク
ラスを使用しているクラスにまで変更影響波及を探索
し、その洗練化作業を支援し、ひいてはソフトウェアの
生産性を向上させることである。
【0004】
【課題を解決するための手段】上記目的を達成するた
め、本発明は、オブジェクト指向言語で記述されたソー
スコードからクラス名、上位クラス名、属性名、属性の
型、メソッド名、メソッドコードを抽出しクラス仕様解
析情報を作成するステップと、利用者が入力する複数の
クラス間に共通する属性(以下、共通属性)の集合と、
新しく作る上位クラス(以下、新規上位クラス)の名称
と、該共通属性の該新規上位クラスでの名称(以下、標
準名称)と、該共通属性を持つクラス(以下、変更対象
下位クラス)の中で中心となるクラス(以下、変更対象
主要下位クラス)名を取得するステップと、該取得した
情報にしたがって前記共通属性だけからなる新規上位ク
ラスを作り、前記変更対象下位クラスとの継承関係をつ
くるように前記クラス仕様解析情報を修正するステップ
と、前記変更対象下位クラスの前記共通属性の名称を対
応する前記標準名称に置換するステップと、前記クラス
仕様解析情報中の前記メソッドコードから個々の操作手
続きが参照または代入する可能性のある属性の集合(以
下、使用属性集合)と、呼び出す可能性のあるメソッド
の集合(以下、使用メソッド集合)を抽出し、メソッド
コード解析情報を作成するステップと、前記変更対象下
位クラスで前記使用属性集合が前記共通属性のみから構
成されているメソッドを前記新規上位クラスへ移動する
ように前記クラス仕様解析情報を修正するメソッド移動
ステップと、該変更対象主要下位クラスから該新規上位
クラスへ移動した主要メソッドと、使用属性集合と使用
メソッド集合が同一である統合候補対象メソッドの対を
検出するステップと、該検出した対の統合対象メソッド
に関するコードを削除し、該統合対象メソッドの使用箇
所でのメソッド名称を該統合対象メソッド名称から前記
主要メソッドの名称に置換するように、前記クラス仕様
解析情報を修正するメソッド統合ステップと、変更され
た前記クラス仕様解析情報をソースコードとして出力す
るステップ、とからなるようにしている。また、オブジ
ェクト指向言語で記述されたソースコードからクラス
名、上位クラス名、属性名、属性の型、メソッド名、メ
ソッドコードを抽出しクラス仕様解析情報を作成するス
テップと、利用者が入力する複数のクラス間に共通する
属性(以下、共通属性)の集合と、新しく作る上位クラ
ス(以下、新規上位クラス)の名称と、該共通属性の該
新規上位クラスでの名称(以下、標準名称)と、該共通
属性を持つクラス(以下、変更対象下位クラス)の中で
中心となるクラス(以下、変更対象主要下位クラス)名
を取得するステップと、該取得した情報にしたがって前
記共通属性だけからなる新規上位クラスを作り、前記変
更対象下位クラスとの継承関係をつくるように前記クラ
ス仕様解析情報を修正するステップと、前記変更対象下
位クラスの前記共通属性の名称を対応する前記標準名称
に置換するステップと、前記クラス仕様解析情報中の前
記メソッドコードから個々の操作手続きが参照または代
入する可能性のある属性の集合(以下、使用属性集合)
と、呼び出す可能性のあるメソッドの集合(以下、使用
メソッド集合)を抽出し、メソッドコード解析情報を作
成するステップと、前記変更対象下位クラスで前記使用
属性集合が前記共通属性のみから構成されているメソッ
ドを前記新規上位クラスへ移動するように前記クラス仕
様解析情報を修正するメソッド移動ステップと、該変更
対象主要下位クラスから該新規上位クラスへ移動した主
要メソッドと、使用属性集合と使用メソッド集合が同一
である統合候補対象メソッドの対を検出するステップ
と、前記検出した主要メソッドと統合候補対象メソッド
の対を利用者に提示する統合メソッド対提示ステップ
と、該対に対する利用者の指定結果を取得し、該指定さ
れた対の統合対象メソッドに関するコードを削除し、該
指定された対の統合対象メソッドの使用箇所でのメソッ
ド名称を該統合対象メソッド名称から前記主要メソッド
の名称に置換するように、前記クラス仕様解析情報を修
正するメソッド統合ステップと、変更された前記クラス
仕様解析情報をソースコードとして出力するステップ、
とからなるようにしている。さらに、前記統合メソッド
対提示ステップにおいて、該主要メソッドと、該変更対
象下位クラスの宣言のみで実装に関するコードが存在し
ない未実装メソッドとのすべての対も、統合メソッド対
として利用者に提示するようにしている。また、前記メ
ソッド移動ステップの直前に、前記共通属性だけでなく
自インスタンスの該共通属性以外の属性(以下、固有属
性)も使用している該変更対象下位クラスのメソッドを
該共通属性に関係する部分のメソッドと関係しない部分
のメソッドに分割し、該分割結果に基づき前記クラス仕
様解析情報を修正するステップを設けるようにしてい
る。また、前記メソッド移動ステップの直後に、前記共
通属性だけでなく自インスタンスの前記固有属性も使用
する前記変更対象下位クラスのメソッドを仮想関数化す
るメソッドの候補として利用者に提示するステップと、
利用者の仮想関数化するメソッドの指定を取得するステ
ップと、利用者が指定したメソッドを前記新規上位クラ
スで仮想関数による定義を行ない、該指定メソッドの定
義を仮想関数による定義に変更するように前記クラス仕
様情報を修正するステップを設けるようにしている。ま
た、前記メソッド統合ステップの直後に、前記変更対象
下位クラスを利用しているクラス内で該変更対象下位ク
ラスのインスタンスを介して使用するメソッドが前記新
規上位クラスに存在するものだけであった場合、該イン
スタンスを該新規上位クラスのインスタンスで置換する
よう前記クラス仕様解析情報を修正するステップを設け
るようにしている。
【0005】
【実施例】本発明の実施例を詳細に説明する前にオブジ
ェクト指向で使用する用語について説明する。オブジェ
クト指向言語のプログラムでは、クラスがプログラムを
構成する単位となる。クラスは、属性と呼ばれるデータ
項目と、メソッドと呼ばれる手続きから構成される。ク
ラスが提供するサービスはメソッドにより実行される。
クラスは複数の属性と、複数のメソッドを有することが
できる。クラスは「型」を拡張する概念であり、クラス
を実体化したものをインスタンスと呼ぶ。クラスを実体
化してインスタンスを生成する際にシステムによって暗
黙的に実行されるメソッドをコンストラクタ、インスタ
ンスが消滅する際にシステムによって暗黙的に実行され
るメソッドをデストラクタと呼ぶ。クラス間には継承関
係と呼ばれる階層関係を定義することができ、下位のク
ラスのインスタンスはより上位のクラスのインスタンス
と同様に扱われ得る。また、各階層で同名のメソッドを
定義することができ、そうした場合、実際に実行される
メソッドがソースコードのコンパイル時ではなく実行時
にインスタンスの型により決定されるメソッドを作るこ
とができる。このようなメソッドを仮想関数と呼ぶ。
【0006】図1に本発明の第1の実施例における処理
手順を、図2に機能構成を、図3にハードウェア環境を
それぞれ示す。以下、本実施例の処理手順の各ステップ
を順に説明する。ステップ201では、複数のソースコ
ード301を解析して全てのクラスのクラス名、上位ク
ラス名、属性名、属性の型、メソッド名、メソッドコー
ドからなるクラス仕様解析情報303を作成する。図4
にC++ 言語の場合の構造変更前のソースコードの例を
示す。入力とするソースコードは宣言はされているが定
義されていないメソッドを含む不完全なものでも良い。
図5に該クラス仕様解析情報303の例を示す。ここに
はクラス名501、上位クラス名502、属性名と型5
03、メソッド名とメソッドコード504が記憶されて
いる。例えば、ステップ201ではクラス宣言部405
からクラス名「AB」を抽出して501に記憶し、上位
クラスは存在しないので502を空白にしている。ま
た、属性宣言406を503に、メソッドbm0の定義
407を505にそれぞれ記憶している。ただし、不完
全なソースコードを入力とした場合は、その宣言部分か
らメソッド名を抽出する。例えば、図4の402にメソ
ッドbm5の定義が含まれていない場合は、bm5の宣
言部分408を507に記憶する。これにより、クラス
仕様解析情報303からメソッドが未実装であるかどう
かが判断できる。以降で使う図の中で説明をわかりやす
くするためにソースコードの変化を記載しているが、こ
れらは実際にはメモリ上に存在する該クラス仕様解析情
報303の内容の変化を意味している。
【0007】ステップ202では、人間が意味的に共通
であると判断した属性(以下、共通属性と呼ぶ。また、
共通属性以外の属性を固有属性と呼ぶ)の集合と、新し
く作る上位クラス(以下、新規上位クラス)の名称と、
該共通属性の該新規上位クラスでの名称と、該共通属性
を少なくともひとつ持つクラス(以下、変更対象下位ク
ラス)の中で中心となるクラス(以下、変更対象主要下
位クラス)の名称が入力される。図6に入力された情報
の例を示す。ここではクラスABの属性iとクラスAC
の属性mとクラスADの属性pおよび、クラスABの属
性jとクラスACの属性nがそれぞれ共通属性であるこ
と、共通属性の新規上位クラスでの標準名称をそれぞれ
i,nにすること、新規上位クラス名をクラスAとする
こと、変更対象主要下位クラスをクラスABとすること
が入力されたことを示している。
【0008】ステップ203では、ユーザが指定した名
称を持つ新規上位クラスを作り、新規上位クラスに指定
された名称の属性を持たせ、該新規上位クラスが変更対
象下位クラスの上位クラスとなるように該クラス仕様解
析情報303を修正する。例えば、図7にあるように変
更対象主要下位クラスABの上位クラスにAを指定(7
01)し、以前は存在していなかった上位クラス703
を作成し、標準名称の属性702を持たせる。その他の
変更対象下位クラスAC,ADについても同様にその上
位クラスをAにする。
【0009】ステップ204では、該変更対象下位クラ
スの共通属性を該新規上位クラスの対応する共通属性に
統合し、クラス仕様解析情報303を修正する。ここで
「クラスXの属性x1をクラスYの属性y1に統合す
る」とは、クラスXの定義から属性x1に関する宣言を
取り除き、クラスX内の属性x1の使用箇所全てをクラ
スYの属性y1の使用に置換することをいう。図8にそ
の様子を示す。例えば、クラスACの宣言801から該
共通属性の宣言部分802を取り除く。その結果が80
3である。さらに、クラスACのメソッド定義804内
で該共通属性が使われている部分805と807を対応
する上位クラスAでの該共通属性の名称に置換する。そ
の結果が806と808である。同様の操作を変更対象
下位クラス全てに対して行なう。
【0010】ステップ205では、クラス仕様解析情報
303のメソッド情報の個々の操作手続きについて、そ
のコードを解析して該操作手続きが使用(参照または代
入)する可能性のある属性の集合と、呼び出す可能性の
あるメソッドの集合を他のメソッド呼び出しも考慮して
調べ、メソッドコード解析情報302を作成する。図9
に該メソッドコード解析情報302の例を示す。該メソ
ッドコード解析情報は、該クラス仕様解析情報303に
含まれるメソッドコードを解析して得られる個々の操作
手続きが使用する可能性のある属性とメソッドの集合情
報から構成される。例えば、図5のメソッドを解析して
得られるのが図9である。901は、図5の505を解
析した結果であり、クラスABのメソッドABが自クラ
スの属性i,n,sとクラスListのメソッドlm1
とクラスStrのメソッドsm1を使用することを示し
ている。また、905はクラスADのメソッドdm1が
未実装のメソッドであることを示している。ただし、こ
こでは操作手続きをメソッド単位で切り分けて表示した
例を示しているが、実際の解析は図10に示すようにメ
ソッドコードの1ステップを単位として行ない、各ステ
ップ毎に同様の情報が保持されている。
【0011】ステップ206では、該共通属性の該新規
上位クラスへの統合に伴って必要となる、関連メソッド
の下位クラスから上位クラスへの移動を行ない、クラス
仕様解析情報303を修正する。ここで、「関連メソッ
ド」とは自クラスの共通属性だけを使用するメソッドを
いい、関連メソッドの抽出はメソッドコード解析情報3
02と共通属性情報304を用いる。該メソッド移動の
詳細な手続きを図11に示す。該メソッドコード解析情
報302を使ってステップ1101,1102で自クラ
スの共通属性だけを使用するメソッドを選択し、選択さ
れたメソッドに対しステップ1103の処理を行なう。
例えば、クラスABのメソッドbm0(902)は図9
より、使用している属性はiのみである。また、601
より属性iは共通属性であるので、bm0は共通属性i
だけを使用し、固有属性は使用しないことがわかる。よ
って、ステップ1101では「Y」の方へ、ステップ1
102では「N」の方へ処理が進み、ステップ1103
で上位クラスへ移動される。メソッドを移動する時、上
位クラスにすでに同名のメソッドが存在する場合には、
該メソッド名が存在しない名称となるように、末尾に番
号を付けた名称に置き換えてから移動する。このメソッ
ド名の置き換えでは該メソッドを使用する部分の名称の
置き換えも同時に行なう。例えば、メソッドzmを新規
上位クラスAに移動しようとした時に、Aにすでに同名
のメソッドが存在していた場合、メソッドzmにzm
1,zm2,...と番号を付けて存在しない名称を探
す。zm2がまだクラスAには存在しないメソッドの名
称であるとわかったら、zmをzm2で置換する。図1
2に上位クラスへの移動の例を示す。例えば、メソッド
bm0の宣言部分が1201から1202へ移動し、ク
ラスAB,Aの状態がそれぞれ1203,1204にな
り、変更対象下位クラスABのメソッドbm0(120
5)が該新規上位クラスAのメソッド定義に移動(12
06)し、クラスAB,Aの宣言がそれぞれ1207,
1208に変化した。また、この移動にともなってメソ
ッドbm0の所属クラス名を1209から1210に変
更する。クラスAC、クラスADについても同様の処理
が行なわれる。
【0012】ステップ207では、メソッドの統合の候
補をユーザに示し、統合の許可を得る。メソッドコード
解析情報302を使って、使用する属性とメソッドの集
合が同じメソッドを新規親クラスのメソッドから選びだ
し、統合の候補とする。また、不完全なソースコードに
含まれる未実装のメソッドに関しては、新規上位クラス
に移動したメソッド全てとの組み合わせから統合するメ
ソッド対を選択することができる。例えば図9の90
2,903,904より、新規上位クラスの属性iだけ
を使用するメソッドとしてbm0とcm0とdm0があ
ることがわかるので、その中の変更対象主要下位クラス
から新規上位クラスへ移動した主要メソッドbm0とそ
の他のメソッド(統合候補対象メソッド)との対が統合
の候補となる。図13に統合の候補の例を示す。左側に
は新規上位クラスAのメソッドcm0とメソッドbm0
の対および、dm0とbm0の対が統合の候補としてあ
げられている。右側には新規上位クラスに移動したメソ
ッドbm0とクラスADの未実装のメソッドdm1,d
m2との対が候補として挙げられている。1301はc
m0をbm0に統合することを、1302はdm1をb
m0に統合することを意味する。ここで、「クラスXの
メソッドxm1をクラスYのメソッドym1に統合す
る」とは、クラスXの宣言からメソッドxm1の宣言を
取り除き、クラスXのメソッド定義からメソッドxm1
の定義を取り除き、xm1の呼び出しをクラスYのメソ
ッドym1の呼び出しで置換することをいう。ただし、
クラスXとクラスYは同一のクラスでも構わない。上記
統合の候補に対して次のステップ208で統合が行われ
る。または上記統合の候補であるメソッド対を利用者に
提示するステップを設け、提示したメソッド対に対する
利用者の指定、または、利用者の候補外から統合するメ
ソッド対の指定を取得して次のステップ208で統合を
行うようにしてもよい。なおこの時、実装部分がないメ
ソッドも統合するメソッド対として指定できる。
【0013】ステップ208では、ステップ207で人
間が統合することを指示したメソッドを統合し、クラス
仕様解析情報303を修正する。図14に統合の様子を
示す。クラスAのメソッドcm0をメソッドbm0に、
dm0をbm0にそれぞれ統合する場合、クラスAから
1401,1402を削除し、すなわち、統合対象メソ
ッドに関するコードを削除し、クラスAの宣言は140
3に、メソッド定義は1404になる。また、クラスR
内のcm0をbm0に変更し、1405から1406の
ように変更する。
【0014】ステップ209では、以上のステップで変
更されたクラス仕様解析情報303から新規ソースコー
ド305を出力する。
【0015】本実施例によれば、ソフトウェアの設計段
階でクラス構造の充分な洗練化が行なわれないままコー
ディングされたソースコードに対して、既存のクラスに
共通する属性を持つ抽象クラスを抽出する様な作業を行
なう際に、共通属性を指定するだけで移動すべきメソッ
ドを自動的、かつ、もれなく検出すること、および、移
動の際に必要となるソースコードの変更を自動で行なう
こと、および、メソッド統合によりコード量を削減する
ことが可能となる。また、不完全なソースコードを入力
として扱うこともできるので、コーディング作業中にも
クラス構造の変更ができ、設計段階で充分に洗練化され
ていなかったクラス構造をコーディング時に洗練化する
ことが可能となる。これは、クラス構造の変更を容易に
行なうことを可能とし、ひいては、ソフトウェアの生産
性向上に役立つ。
【0016】図15に本発明の第2の実施例の処理手順
を、図16に機能構成をそれぞれ示す。以下本発明の第
2の実施例のクラス構造変更方法を図15に従って説明
する。ただし、第1の実施例と同一の処理については説
明を省略する。第1の実施例ではコードの移動は元のソ
ースコードに存在するメソッド単位で行なったが、第2
の実施例ではメソッドの移動ステップの前にメソッド分
割ステップが追加される。
【0017】ステップ1501では、変更対象クラスの
メソッドの中で共通属性と固有属性の両方を使用するメ
ソッドをユーザに示し、その中から実際に分割の対象と
なるメソッドをユーザが指定する。メソッドコード解析
情報302と共通属性情報304から共通属性と固有属
性の両方を使用するメソッドが候補としてあげられる。
図17に分割するメソッドの候補をあげた例を示す。例
えば、クラスABのメソッドABは901と601より
共通属性i,nと固有属性sを使用しているので分割す
るメソッドの候補として1701に挙げられている。
【0018】ステップ1502では、メソッドを共通属
性だけを使用する部分とそれ以外の部分とに分割し、そ
の結果を反映するようにクラス仕様解析情報303を修
正する。共通部分だけを使用する部分を、元のメソッド
名に“_c”を付けたメソッドにし、それ以外の部分を
元のメソッド名に“_u”を付けたメソッドにする。さ
らに、分割されたメソッドを使用していた箇所を分割後
のメソッドを元の順序で使用するように変更する。図1
8にクラスABのメソッドbmxを分割する例を示す。
該変更対象クラスABのメソッド定義1801にあった
メソッドbmxを該共通属性に関係する部分1802と
関係しない部分1803とに分割し、関係する部分18
02だけでひとつのメソッド1805にし、同様に関係
しない部分1803だけでひとつのメソッド1806に
する。その結果クラスABのメソッド定義は1804に
なる。さらに、分割されたメソッドの使用箇所1807
を1808のように分割後のメソッドが呼び出されるよ
うに変更する。
【0019】本実施例によれば、メソッドを移動する前
に分割することによりメソッドの移動ステップで第1の
実施例よりも多くのメソッドを移動することができ、そ
の後のメソッド統合により、より多くのコードの削減が
見込める。これはより再利用性の高いコードを作成する
ことを可能にし、ひいては、ソフトウェアの生産性向上
に役立つ。
【0020】図19に本発明の第3の実施例の処理手順
を、図20に機能構成をそれぞれ示す。以下本発明第3
の実施例のクラス構造変更方法を図19に従って説明す
る。ただし、以前の実施例と同一の処理については説明
を省略する。第2の実施例では、メソッド分割の後移動
を行なうだけだったが、第3の実施例ではメソッドを移
動させるだけではなく、仮想関数として上位クラスに登
録するステップが追加されている。ここでは、仮想関数
化ステップを第2の実施例に追加する例を書いたが、第
2の実施例で追加されたメソッド分割ステップと本実施
例で追加する仮想関数化ステップは全く独立したステッ
プとして実行できるので、本実施例からメソッド分割ス
テップを削除しても構わない。
【0021】ステップ1901では、変更対象クラスの
メソッドの中で共通属性と固有属性の両方を使用するメ
ソッドをユーザに示し、その中から実際に仮想関数化す
るメソッドをユーザが指示する。該メソッドコード解析
情報302と共通属性情報304から共通属性と固有属
性の両方を使用するメソッドが候補としてあげられる。
図21に仮想関数化するメソッドの候補をあげた例を示
す。例えば、クラスABのメソッドABは901と60
1より共通属性i,nと固有属性sを使用しているので
仮想関数化するメソッドの候補として2101に挙げら
れている。
【0022】ステップ1902では、ユーザが指定した
メソッドを仮想関数として上位クラスに登録する。図2
2にメソッドの仮想関数化の例を示す。変更対象クラス
ABの宣言2201のメソッドbm5の宣言部分を該メ
ソッドが仮想関数であることを示すために2203に示
すように変更し、新規上位クラスAの宣言2202に同
名のメソッド2204を追加する。
【0023】ステップ1903は、ステップ207で統
合の候補を挙げる際に、新規上位クラスに仮想関数とし
て登録されたメソッドからなるメソッド対を統合の候補
に追加することを除いてステップ207と同じである。
例えば、新規上位クラスAに仮想関数bmvとcmvが
ある場合、統合の候補としてbmvとcmvからなるメ
ソッド対が追加される。ステップ1904は、ユーザが
統合を指示したメソッド対が仮想関数からなるものであ
った場合、統合により名称の変化するメソッドと同じ名
称を持つ下位クラスのメソッド名も同時に置換し、該メ
ソッドの使用箇所も変更することを除いてステップ20
8と同じである。図23に例を示す。例えば、クラスA
の仮想関数cm5をbm5に統合する場合、ステップ2
08では、2301を2302に変化させるだけだった
が、2204では、これに加えて変更対象下位クラスの
cm5をbm5に置換する。
【0024】本実施例によれば、メソッドを移動させる
のではなく仮想関数化することにより、より抽象度の高
いレベルでそのメソッドを扱うことができる。例えば、
3つのクラスAB,AC,ADから抽象クラスAを抽出
して、そのメソッドbm0,cm0,dm0を仮想関数
化し、bm0に統合することにより図24に示したよう
な効果が生まれる。修正前は、実際のインスタンスがど
のクラスのインスタンスかによって場合わけをしてそれ
ぞれに適切なメソッドを呼び出していたが、修正後は単
にbm0を呼び出すだけでインスタンス自身が適切なメ
ソッドを呼び出すことができるようになっている。これ
は、より理解しやすいコードの作成とより多くのコード
削減を可能にし、ひいては、ソフトウェアの生産性向上
に役立つ。
【0025】図25に本発明の第4の実施例の処理手順
を、図26に機能構成をそれぞれ示す。以下本発明の第
4の実施例のクラス構造変更方法を図25に従って説明
する。ただし、以前の実施例と同一の処理については説
明を省略する。本実施例では、新規上位クラスの作成に
よる影響を関連クラスまで探索してそのコード変更をユ
ーザに促す。本実施例は第1、第2、第3の実施例のい
ずれかの処理手順中のソースコード出力ステップ209
の前に付加ステップ(2501,2502)を追加する
ことにより、それらのどれとも同時に行なうことができ
る。ここでは、第1の実施例に追加した例を示す。
【0026】ステップ2501では、メソッドコード解
析情報302とクラス仕様解析情報303から修正候補
クラスがあるか調べられる。ここで「修正候補クラス」
とは、変更対象下位クラスのあるインスタンスを介して
直接使用するメソッドが新規上位クラスに存在するもの
だけであるようなインスタンスを含んでいるクラス、ま
たは、他クラスのメソッド統合の影響を受けて使用する
メソッド集合が変化した操作手順を含むクラス、をい
う。
【0027】ステップ2502では、メソッドコード解
析情報302と共通属性情報304を使って、該変更対
象下位クラスを使用するクラス(以下、関連クラス)を
変更し、クラス仕様解析情報303を修正する。関連ク
ラスが属性として、または、引数として、または、メソ
ッドの内部変数として変更対象下位クラスのインスタン
スを持ち、かつ、該インスタンスを介して使用するメソ
ッドが新規上位クラスに存在するものだけである場合、
該インスタンスを該新規上位クラスのインスタンスに置
換する。
【0028】図27に属性として使用されているインス
タンスを置換する例を示す。クラスRの宣言の属性とし
て変更対象下位クラスABのインスタンス2701が使
用されている。このインスタンスを介して使用するメソ
ッドが新規上位クラスAに存在するものだけであった場
合、そのインスタンスを新規上位クラスAのインスタン
ス2702で置換する。図28に引数として受けとるイ
ンスタンスを置換する例を示す。クラスRのメソッドr
m0,rm1は引数として変更対象下位クラスAB,A
Cのインスタンスを受けとる(2801)。このインス
タンスを介して使用するメソッドがクラスAに存在する
ものだけであった場合、そのインスタンスを新規上位ク
ラスAのインスタンスに置換する(2802)。図29
にメソッドの内部変数として使われるインスタンスの置
換の例を示す。変更対象下位クラスABのインスタンス
pabを介して使用するメソッド2901が新規上位ク
ラスAに存在するメソッド2902だけである場合、2
901を2902に置換する。
【0029】次にステップ207へ戻って、関連クラス
の修正により統合可能となったメソッドを修正対象とな
った関連クラス内から探索し統合する。図30にその例
を示す。3001のメソッドrm1をrm0に統合する
ことをユーザが許可したら、3002に示すように変更
する。この統合にともなってクラスRのメソッドrm1
の使用箇所3003を3004のように変更する。
【0030】本実施例によれば、新規上位クラスの作成
を変更対象下位クラスだけでなく変更対象下位クラスを
使用する関連クラスにまで変更影響を探索し、ユーザに
コードの修正を促す。これにより、コード量のさらなる
削減と、より再利用性の高いコードの作成が可能とな
り、ひいては、ソフトウェアの生産性向上に役立つ。
【0031】
【発明の効果】本発明によれば、ソフトウェアの設計段
階でクラス構造の充分な洗練化が行なわれないままコー
ディングされたソースコードに対して、既存のクラスに
共通する属性を持つ抽象クラスを抽出する様な作業を行
なう際に、共通属性を指定するだけで移動すべきメソッ
ドを自動的、かつ、もれなく検出すること、および、移
動の際に必要となるソースコードの変更を自動で行なう
こと、および、メソッド統合によりコード量を削減する
ことが可能となり、また、不完全なソースコードを入力
として扱うこともできるので、コーディング作業中にも
クラス構造の変更ができ、設計段階で充分に洗練化され
ていなかったクラス構造をコーディング時に洗練化する
ことが可能となる。これは、クラス構造の変更を容易に
行なうことを可能とし、ひいては、ソフトウェアの生産
性向上に役立つ。また、共通属性だけでなく固有属性も
使用するメソッドをも統合の対象とし、洗練化すること
ができる。また、変更対象クラスだけでなく変更対象ク
ラスを利用するクラスまで変更影響を探索して、そのク
ラスを洗練化することができる。
【図面の簡単な説明】
【図1】第1の実施例の処理手順を示す図である。
【図2】第1の実施例の機能構成図である。
【図3】本発明のハードウェア環境を示す図である。
【図4】変更前のソースコードの例を示す図である。
【図5】クラス仕様解析情報303の例を示す図であ
る。
【図6】共通属性情報の入力の例を示す図である。
【図7】新規上位クラスの作成を説明するための図であ
る。
【図8】属性の統合を説明するための図である。
【図9】メソッドコード解析情報302をメソッド単位
でまとめて表示した例を示す図である。
【図10】メソッドコード解析情報302の例を示す図
である。
【図11】メソッド移動206の詳細な手続きを示す図
である。
【図12】メソッドの移動を説明するための図である。
【図13】統合の候補例を示す図である。
【図14】メソッドの統合を説明するための図である。
【図15】第2の実施例の処理手順を示す図である。
【図16】第2の実施例の機能構成図である。
【図17】分割するメソッドの候補を示す図である。
【図18】メソッドの分割を説明するための図である。
【図19】第3の実施例の処理手順を示す図である。
【図20】第3の実施例の機能構成図である。
【図21】仮想関数化するメソッドの候補を示す図であ
る。
【図22】メソッドの仮想関数化を説明するための図で
ある。
【図23】仮想関数の統合を説明するための図である。
【図24】仮想関数化の効果を説明するための図であ
る。
【図25】第4の実施例の処理手順を示す図である。
【図26】第4の実施例の機能構成図である。
【図27】関連クラスへの影響波及1を説明するための
図である。
【図28】関連クラスへの影響波及2を説明するための
図である。
【図29】関連クラスへの影響波及3を説明するための
図である。
【図30】関連クラスのメソッド統合を説明するための
図である。

Claims (6)

    【特許請求の範囲】
  1. 【請求項1】 オブジェクト指向言語で記述されたソー
    スコードからクラス名、上位クラス名、属性名、属性の
    型、メソッド名、メソッドコードを抽出しクラス仕様解
    析情報を作成するステップと、 利用者が入力する複数のクラス間に共通する属性(以
    下、共通属性)の集合と、新しく作る上位クラス(以
    下、新規上位クラス)の名称と、該共通属性の該新規上
    位クラスでの名称(以下、標準名称)と、該共通属性を
    持つクラス(以下、変更対象下位クラス)の中で中心と
    なるクラス(以下、変更対象主要下位クラス)名を取得
    するステップと、 該取得した情報にしたがって前記共通属性だけからなる
    新規上位クラスを作り、前記変更対象下位クラスとの継
    承関係をつくるように前記クラス仕様解析情報を修正す
    るステップと、 前記変更対象下位クラスの前記共通属性の名称を対応す
    る前記標準名称に置換するステップと、 前記クラス仕様解析情報中の前記メソッドコードから個
    々の操作手続きが参照または代入する可能性のある属性
    の集合(以下、使用属性集合)と、呼び出す可能性のあ
    るメソッドの集合(以下、使用メソッド集合)を抽出
    し、メソッドコード解析情報を作成するステップと、 前記変更対象下位クラスで前記使用属性集合が前記共通
    属性のみから構成されているメソッドを前記新規上位ク
    ラスへ移動するように前記クラス仕様解析情報を修正す
    るメソッド移動ステップと、 該変更対象主要下位クラスから該新規上位クラスへ移動
    した主要メソッドと、使用属性集合と使用メソッド集合
    が同一である統合候補対象メソッドの対を検出するステ
    ップと、 該検出した対の統合対象メソッドに関するコードを削除
    し、該統合対象メソッドの使用箇所でのメソッド名称を
    該統合対象メソッド名称から前記主要メソッドの名称に
    置換するように、前記クラス仕様解析情報を修正するメ
    ソッド統合ステップと、 変更された前記クラス仕様解析情報をソースコードとし
    て出力するステップ、とからなることを特徴とするクラ
    ス構造変更方法。
  2. 【請求項2】 オブジェクト指向言語で記述されたソー
    スコードからクラス名、上位クラス名、属性名、属性の
    型、メソッド名、メソッドコードを抽出しクラス仕様解
    析情報を作成するステップと、 利用者が入力する複数のクラス間に共通する属性(以
    下、共通属性)の集合と、新しく作る上位クラス(以
    下、新規上位クラス)の名称と、該共通属性の該新規上
    位クラスでの名称(以下、標準名称)と、該共通属性を
    持つクラス(以下、変更対象下位クラス)の中で中心と
    なるクラス(以下、変更対象主要下位クラス)名を取得
    するステップと、 該取得した情報にしたがって前記共通属性だけからなる
    新規上位クラスを作り、前記変更対象下位クラスとの継
    承関係をつくるように前記クラス仕様解析情報を修正す
    るステップと、 前記変更対象下位クラスの前記共通属性の名称を対応す
    る前記標準名称に置換するステップと、 前記クラス仕様解析情報中の前記メソッドコードから個
    々の操作手続きが参照または代入する可能性のある属性
    の集合(以下、使用属性集合)と、呼び出す可能性のあ
    るメソッドの集合(以下、使用メソッド集合)を抽出
    し、メソッドコード解析情報を作成するステップと、 前記変更対象下位クラスで前記使用属性集合が前記共通
    属性のみから構成されているメソッドを前記新規上位ク
    ラスへ移動するように前記クラス仕様解析情報を修正す
    るメソッド移動ステップと、 該変更対象主要下位クラスから該新規上位クラスへ移動
    した主要メソッドと、使用属性集合と使用メソッド集合
    が同一である統合候補対象メソッドの対を検出するステ
    ップと、 前記検出した主要メソッドと統合候補対象メソッドの対
    を利用者に提示する統合メソッド対提示ステップと、 該対に対する利用者の指定結果を取得し、該指定された
    対の統合対象メソッドに関するコードを削除し、該指定
    された対の統合対象メソッドの使用箇所でのメソッド名
    称を該統合対象メソッド名称から前記主要メソッドの名
    称に置換するように、前記クラス仕様解析情報を修正す
    るメソッド統合ステップと、 変更された前記クラス仕様解析情報をソースコードとし
    て出力するステップ、とからなることを特徴とするクラ
    ス構造変更方法。
  3. 【請求項3】 請求項2記載のクラス構造変更方法にお
    いて、 前記統合メソッド対提示ステップにおいて、該主要メソ
    ッドと、該変更対象下位クラスの宣言のみで実装に関す
    るコードが存在しない未実装メソッドとのすべての対
    も、統合メソッド対として利用者に提示することを特徴
    とするクラス構造変更方法。
  4. 【請求項4】 請求項1乃至請求項3のいずれかの請求
    項記載のクラス構造変更方法において、 前記メソッド移動ステップの直前に、前記共通属性だけ
    でなく自インスタンスの該共通属性以外の属性(以下、
    固有属性)も使用している該変更対象下位クラスのメソ
    ッドを該共通属性に関係する部分のメソッドと関係しな
    い部分のメソッドに分割し、該分割結果に基づき前記ク
    ラス仕様解析情報を修正するステップを設けることを特
    徴とするクラス構造変更方法。
  5. 【請求項5】 請求項1乃至請求項4のいずれかの請求
    項記載のクラス構造変更方法において、 前記メソッド移動ステップの直後に、前記共通属性だけ
    でなく自インスタンスの前記固有属性も使用する前記変
    更対象下位クラスのメソッドを仮想関数化するメソッド
    の候補として利用者に提示するステップと、 利用者の仮想関数化するメソッドの指定を取得するステ
    ップと、 利用者が指定したメソッドを前記新規上位クラスで仮想
    関数による定義を行ない、該指定メソッドの定義を仮想
    関数による定義に変更するように前記クラス仕様情報を
    修正するステップを設けることを特徴とするクラス構造
    変更方法。
  6. 【請求項6】 請求項1乃至請求項5のいずれかの請求
    項記載のクラス構造変更方法において、 前記メソッド統合ステップの直後に、前記変更対象下位
    クラスを利用しているクラス内で該変更対象下位クラス
    のインスタンスを介して使用するメソッドが前記新規上
    位クラスに存在するものだけであった場合、該インスタ
    ンスを該新規上位クラスのインスタンスで置換するよう
    前記クラス仕様解析情報を修正するステップを設けるこ
    とを特徴とするクラス構造変更方法。
JP7323911A 1995-11-17 1995-11-17 クラス構造変更方法 Pending JPH09146766A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP7323911A JPH09146766A (ja) 1995-11-17 1995-11-17 クラス構造変更方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP7323911A JPH09146766A (ja) 1995-11-17 1995-11-17 クラス構造変更方法

Publications (1)

Publication Number Publication Date
JPH09146766A true JPH09146766A (ja) 1997-06-06

Family

ID=18159999

Family Applications (1)

Application Number Title Priority Date Filing Date
JP7323911A Pending JPH09146766A (ja) 1995-11-17 1995-11-17 クラス構造変更方法

Country Status (1)

Country Link
JP (1) JPH09146766A (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2015210740A (ja) * 2014-04-28 2015-11-24 富士通株式会社 コンパイル方法、コンパイル装置およびコンパイルプログラム

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2015210740A (ja) * 2014-04-28 2015-11-24 富士通株式会社 コンパイル方法、コンパイル装置およびコンパイルプログラム

Similar Documents

Publication Publication Date Title
CN100385399C (zh) 用于多个异常处理模型的中间表示的方法和系统
US5307499A (en) Interpretive object-oriented facility which can access pre-compiled classes
US6523171B1 (en) Enhanced source code translator from procedural programming language (PPL) to an object oriented programming language (OOPL)
DE69404439T2 (de) Programmodellierungssystem.
US5459868A (en) Interpretive object-oriented facility which can access pre-compiled classes
EP0496494A2 (en) Software maintenance system
Stojanovic et al. Ontology Evolution within Ontology Editors.
CN110147225A (zh) 一种代码生成方法、装置及计算机设备、存储介质
JP2005510790A (ja) ソフトウェア・オブジェクトを作成する方法と装置
JPWO2000045260A1 (ja) コンパイラ装置、コンパイル方法、およびそのためのプログラムを格納した記憶媒体
CN110149800A (zh) 一种用于处理与源程序的源代码相关联的抽象语法树的装置
DE60102694T2 (de) Modulares computersystem und -verfahren
JP2003233499A (ja) 複数の意味レベルによるアスペクト指向プログラミングのための方法
US8615729B2 (en) Extending existing model-to-model transformations
US6675377B1 (en) Program conversion apparatus
CN113050938A (zh) 视觉软件开发系统、方法、装置及计算机存储介质
JP2007511834A (ja) リバーシブルなデザイン・ツリーの変換のための方法とシステム
WO2013184952A1 (en) Method for automatic extraction of designs from standard source code
JP2000029674A (ja) アプリケ―ションソフトウェア構成方法
JP2005141380A (ja) テンプレートコンパイル方法
CN121029162B (zh) 基于Eclipse平台的Java编辑器插件实现方法及系统
US20060212881A1 (en) System and method for extending a programming language to include multiple dissimilar object systems
GB2420638A (en) Method of substituting code fragments in Internal Representation
Oliveira et al. Formal development of industrial-scale systems in Circus
JPH0667871A (ja) プログラム自動更新方式