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

リファクタリングプロセスの再利用によるオブジェクト指向プログラミング学習支援の提案

N/A
N/A
Protected

Academic year: 2021

シェア "リファクタリングプロセスの再利用によるオブジェクト指向プログラミング学習支援の提案"

Copied!
2
0
0

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

全文

(1)情報処理学会第67回全国大会. 3D-7 リファクタリングプロセスの再利用による オブジェクト指向プログラミング学習支援の提案 藤原. 巧1. 松浦. 佐江子2. 芝浦工業大学大学院 電気電子情報工学専攻1 芝浦工業大学 電子情報システム学科2 1. はじめに. 4. リファクタリングケーススタディ. オブジェクト指向パラダイムはソフトウェアの保守性、再利用 性等の品質を向上させるための特徴を備えている。しかし、オブ ジェクト指向初学者にとってオブジェクト指向の概念は理解し難 いため、オブジェクト指向の特徴を活かした実装は困難である。 そこで初学者自身のプログラムに対しオブジェクト指向の特徴を 活かしたプログラムへと改善するためのリファクタリング[1]を 行うことでオブジェクト指向プログラミングが学習できるのでは ないかと考えた。このとき、リファクタリングを行うための指針 を初学者に示す必要がある。そこで初学者に示すリファクタリン グプロセスを纏め蓄積し、再利用できるようなモデル化を行う。 本稿ではオブジェクト指向初学者を対象に、リファクタリングプ ロセスのモデルを用いてオブジェクト指向プログラムを学習させ ることを提案する。. 本ケーススタディは 2 節での問題を解決するため、初学者に 示す有効なリファクタリングプロセスとは何か、またそのプロセ スは再利用が可能か、3節で述べた問題点を解決するために、ど のような操作を行うべきかを考察することを目的とする。リファ クタリングは以下の観点に着目する。 (1)冗長な記述の除去 (2)アーキテクチャモデルの構築 (3)アプリケーション固有のリファクタリング (1)では特定のプログラミングパラダイムに依存しない問題点 に対してリファクタリングを行う。(2)ではプログラムにアーキ テクチャモデルを組込む。(3)ではアプリケーション固有の問題 に対して、主にオブジェクト抽出のリファクタリングを行う。リ ファクタリングは(1)→(2)→(3)の順に行う。. 2. リファクタリング. 4.1 対象プログラムの特徴. リファクタリングとは、外部から見たシステムの振る舞いを変 えずにソフトウェアの理解性、再利用性、変更容易性の向上とい う観点からプログラムの構造を書き変えることである。Fowler により 72 のオブジェクト指向プログラムにおけるリファクタリ ング操作が提唱されている。リファクタリングの問題点はリファ クタリング実行者が経験的に改善場所とそこに適用する操作を決 定する点にある。つまり、リファクタリングの結果がリファクタ リング実行者の経験に依存するため、リファクタリング後のプロ グラムの品質が向上することが保証できないので、初学者が有効 なリファクタリングを行うことは難しい。. 本ケーススタディでは、Java 言語で記述された2つのオセロ ゲームのプログラムを対象にした。共に 1 クラスのみの構成で、 類似コードが散在している。また MouseListener インターフェー スと Applet クラスを実装、継承している。MouseListener イン ターフェースで宣言されているメソッドを実装することによりマ ウスからの入力処理を扱うことができ、Applet クラスのメソッ ドをオーバーライドすることでブラウザへ出力を行うことができ る。2 つのプログラムの相違点として、プログラム 1 は Java 言 語を半期学習した初学者が作成したもので人間対人間が実行でき、 プログラム 2 は構造化プログラミング熟練者が作成したもので人 間対 CPU が実行できる。. 3. 再利用性や変更容易性の低いプログラム オブジェクト指向言語における高品質なプログラムとは再利用 性や変更容易性の高いプログラムである。オブジェクト指向言語 の特徴である継承、カプセル化、ポリモルフィズムを活かすこと でこれらの品質が向上する[2]。つまり、オブジェクト指向の特 徴を活かされていないプログラムをオブジェクト指向の特徴を活 かすように変更することで再利用性、変更容易性が向上すると言 える。オブジェクト指向初学者や構造化プログラミング熟練者が 作成したオブジェクト指向言語の特徴が活かされていないプログ ラムの特徴を次に記す。 (1)プログラムを処理単位で設計、作成している。 (2)フィールドを public にし、直接参照させてフィールドのカプ セル化を行わない。同様に、全メソッドを public にし、全て 外部に公開している。 (3)類似処理が発生した場合、コピー&ペーストを行い、処理 の 異なる部分のみを書き換える。そのため、プログラム内に類 似コードが散在する。 (4)条件式が同じ if 文や switch 文が散在しており、条件の追加 や削除を行う箇所の特定が難しい。 上記のプログラムの問題点は次の通りである。 (1)は構造化プログラミングであり、オブジェクトが適切に抽 出できていないためオブジェクトの結合度が高く再利用性や変更 容易性が低下し易い。(2)はカプセル化が行われておらず、クラ ス間の関係が密である可能性が高いため、クラスを単体で取り出 すことが難しく、再利用性の低いプログラムに陥り易い。(3)は プログラムを変更する際に変更箇所が複数に散在する可能性が高 いので変更容易性が低いと言える。(4)も同様に条件を追加、削 除する際の変更箇所が散在しており、変更容易性が低い。 A Learning Support Method for OOP by Reusing Refactoring Processes 1 Takumi Fujiwara : Shibaura Institute of Technology graduate school Electric electronic information engineering speciality 2 Saeko Matsuura : Shibaura Institute of Technology Department of Electronic Information Systems. 4.2 ケーススタディの実施 4.2.1 冗長な記述の除去 このプロセスでは、フィールドのスコープやコードの類似性、 条件式の複雑さなどに着目することによりリファクタリングを行 う箇所を発見することができる。適用したリファクタリングの一 例は以下の通りである。 1: 未使用のインスタンスフィールドを除去した。 2: 使用範囲がメソッド内で閉じているインスタンスフィー ル ドについてはメソッドフィールドに変更した。 3: 定数の値のみが異なるメソッドに対して、メソッドのパラメ ータ化を行い、重複したコードを纏め上げた。 4:テンプレートメソッドパターンを用いて、重複したコードを 纏め上げた。 1、2 はスライシング技術[3]、3、4 は類似コードの検出技術 [4]を用いることで、リファクタリング箇所の特定が可能である。 このステップを通じて初学者はポリモルフィズムを用いた類 似コードの削除方法等を学習することが可能である。. 4.2.2 アーキテクチャモデルの構築 オセロゲームはクライアントと対話的な処理を行う。この様 なアプリケーションに有効なアーキテクチャモデルとして、アプ リケーション固有のデータを Model、表示部分を View、入力イベ ン ト 処 理 に 対 す る 記 述 を Controller と し て 分 割 す る MVC (Model/View/Controller)モデルがある。このプログラムでは Applet と MouseListener を用いて表示、入力処理を行う。そこ で Applet で定義されているものと MouseListener で宣言されて いるものに着目し、Applet に関連するプロパティを View クラス、 MouseListener に関連するプロパティを Controller クラス、残 りを Model クラスに移動し、クラスの分割を行った。適用したリ ファクタリング操作の一例を記す。 1: MVC モデルの観点からのクラスの抽出を行った。 2: 抽出したクラスに関連するプロパティの移動を行った。. 4−359.

(2) 対象モデルの特徴とモデルを構築するためのプロセスを纏める ことで、このステップを通じて初学者がアーキテクチャモデルを 構築するための手順を学習できる。. 4.2.3 アプリケーション固有のリファクタリング Model クラスに対してオセロゲームという観点からオブジェ クトの抽出を行い、オセロ盤、オセロの石、プレイヤーといった 要素をオブジェクトとして抽出した。プログラム2ではオセロの 石に関する操作が全く存在しなかったので冗長な記述であると判 断し、再度リファクタリングを行い、オセロの石クラスの除去を 行った。図 1、図 2 に示す Board はオセロ盤、Player はプレイヤ ーである。また、図 1 の Item とそのサブクラスがオセロの石を 表している。その後、変更要求を予測し変更に強固にするための リファクタリングを行った。予測した変更要求は[表示する石を 自由に変更する]、[プレイヤーを人間か CPU 切り替え可能にす る]、[プレイヤー数を 2 人以上にし、自分以外の色の石を挟んだ 場合に自分の石の色に変更するようにルールを変える]である。 変更要求に強いプログラムを作るには、オブジェクトの独立性を 高める必要がある。予測した要求変更に現れるオブジェクトはオ セロの石、プレイヤーである。これら抽出したオブジェクトと他 のオブジェクトの依存性を低くするようなりファクタリング操作 を行う。オセロの石とプレイヤーのクラスの独立性を高めるため に ItemFactory と PlayerManager を用いてオセロの石の生成部 分の隠蔽とプレイヤーの隠蔽を行った。以下がリファクタリング 操作の一例である。 1: オセロゲームの観点でオブジェクトの抽出を行った。 2: FactoryMethod におけるコンストラクタの置き換えを行い、 サブクラスの生成を隠蔽した。 このステップはリファクタリングを行うための抽象的な基準を 設けることが難しい。しかしリファクタリング範囲が Model 部分 に絞られている分、オブジェクト抽出が行い易いと考えられる。 図 1、図 2 がリファクタリング後のクラス図である。. 本ケースの流れでリファクタリングを行うことはソフトウェア 開発の各フェーズを逆に進めていることに近い。冗長な記述の除 去は実装、アーキテクチャモデルの構築はシステム設計、アプリ ケーション固有のリファクタリングはシステム分析に対応し、 各々のフェーズでの誤りや見落としにより発生したプログラムの 問題点を改善していると考えることができる。フェーズを遡るこ とにより、リファクタリングを円滑に進めることが可能になる。 冗長な記述の削除を始めに行うことで類似コードや不要なフィー ルドが除去される。つまり、その後のリファクタリングを行う際 に、変更箇所を局所化させることが可能になる。また、アプリケ ーション固有のリファクタリングはアーキテクチャモデルでの Model の部分に関してリファクタリングを行うので、先にアーキ テクチャモデルを構築し Model 部分を切り離すことでリファクタ リング対象範囲を狭めることができる。 プログラム1とプログラム2では類似コードを削除するための リファクタリング操作が異なった。プログラム1の類似コードは メソッド内の定数が異なるメソッド群であった。そこで定数の差 異を吸収するためにメソッド外部から引数として値を与えた。一 方、プログラム2ではメソッドの差異の箇所がメソッドの処理の 一部でありプログラム1よりも広範囲であったため、単に引数を 用いて差分を吸収することができず、テンプレートメソッドパタ ーンを用いて類似コードを除去した。このように類似コードの範 囲により、適用されるリファクタリング操作が異なり、結果とし て出現するクラスに違いが生じた。しかし、その他の部分ではリ ファクタリング操作に違いはなく、特徴の類似しているプログラ ムであれば共通のリファクタリングプロセスを再利用できる。 学校教育におけるプログラム初学者への教育指導を考えた場合、 生徒には同一の問題が提示される。初学者に出題する問題と考え ると、その問題は簡潔なもので規模が小さいと考えられる。故に、 作成されるプログラムは一般的な問題に比べてバリエーションが 少ないと推測できる。プログラムの特徴が類似している場合にリ ファクタリングプロセスが再利用できるならば、最終目標を想定 して共通のリファクタリングを行いながら自身のプログラムを改 善し、オブジェクト指向プログラムの特徴を学習することが可能 である。そのような場面ではリファクタリングプロセスの再利用 は大いに有効であると考えられる。. 6. 関連研究 図1. [5]では、CK メトリクス[6]を用いることでリファクタリング 操作を機械的に決定し、実行者に依存しないリファクタリングを 目指している。しかし、この手順では、プログラムの問題点と改 善点を理解することが難く、意図した改善ができない可能性があ る。このようなことからも、プログラムを理解し、改善が行える ようなリファクタリングプロセスをモデル化することは必要であ ると考える。. プログラム 1 のリファクタリング後のクラス図. 7. まとめ. 図2. 初学者のプログラムにリファクタリングを行うことでプログラ ムの品質を向上させることができる。更に、実際にリファクタリ ングを行い、自らのプログラムを改善することで初学者はオブジ ェクト指向言語の特徴を活かした実装を学習することができる。 今後は多くのケーススタディを実施し、初学者に示すプロセスの モデル化を行い、モデルの蓄積を行っていく。. プログラム 2 のリファクタリング後のクラス図 2. 8. 謝辞. 5. 考察 冗長な記述の除去を行うことによりプログラムの類似コードが 減少し、不要なインスタンスフィールドが除去されるので変更容 易性、可読性が向上する。アーキテクチャモデルの構築では、プ ログラムの責務の分割を行うことができ、各クラスの役割が明確 になるため表示部分に変更を加える際に変更箇所を特定しやすく なる。アプリケーション固有のリファクタリングを行うことでも クラスの責務の分割が可能になる。このステップではクラスの責 務を更に分割し、その後クラスの独立性を上げる。これによりプ ログラムの変更、拡張を行う際に変更点の特定が容易になる他、 プログラムの一部を使用したい場合、クラスの独立性が向上して いるため再利用し易くなる。このようにオブジェクト指向プログ ラムの特徴を活かすリファクタリングはプログラムの変更容易性、 再利用性を向上させるので、効果があると言える。. 本研究で使用したプログラムは本学学生によって作られたも のである。ここに記して謝意を示す。. 参考資料 [1] Martin Fowler,Refactoring Improving The Design Of Existing Code,Addison Wesley,2000 [2]Perdita Stevens,Rob Pooley,Using UML:Software Engineering with Objects and Components,Pearson Education Limited,1999 [3] 上原,佐野,保守とリエンジニアリング,共立出版, 2000 [4]CCFinder:http://iip-lab.ics.es.osaka-u.ac.jp [5] 秦野,乃村,谷口,牛島,”リファクタリングの自動化を支援する機構”, 情報処理学会 2002 シンポジウム,2002 [6] Shyam R. Chidamber 、 Chris F. Kemerer 、 ”A Metrics Suite for Object Oriented Design”、IEEE Transactions Vol.20 No.6 June 1994. 4−360.

(3)

参照

関連したドキュメント

表-1 研究視点 1.景観素材・資源の管理利用 2.自然景観への影響把握 3.景観保護の意味を明示 4.歴史的景観の保存

  BCI は脳から得られる情報を利用して,思考によりコ

○本時のねらい これまでの学習を基に、ユニットテーマについて話し合い、自分の考えをまとめる 学習活動 時間 主な発問、予想される生徒の姿

【対策 2】経営層への監視・支援強化 期待要件 4:社内外の失敗・課題からの学び 【対策 3】深層防護提案力の強化 期待要件

法制執務支援システム(データベース)のコンテンツの充実 平成 13

支援級在籍、または学習への支援が必要な中学 1 年〜 3

有利な公判と正式起訴状通りの有罪評決率の低さという一見して矛盾する特徴はどのように関連するのだろうか︒公

業務繁忙時にも対 応できるよう、施 設に必要な従事者 を適正に配置する とともに、利用者 サービス向上、効 率的・効果的な管 理運営の観点を踏