BT

大規模なリファクタリングを行う方法

| 作者: Vikas Hazrati フォローする 0 人のフォロワー , 翻訳者 吉田 英人 フォローする 0 人のフォロワー 投稿日 2010年9月13日. 推定読書時間: 3 分 |

原文(投稿日:2010/08/24)へのリンク

リファクタリングの定義は,外部的な動作機能に影響を与えずにプログラムの内部構造を変更することだ。主にプログラムの非機能属性を改善し,結果としてコードの可読性と保守性を改善する目的で実施される。しかしリファクタリングの規模が大きくなると,経験を積んだアジャイリストさえ不安を感じる ことが少なくない。アジャイルのコミュニティで,大規模なリファクタリングを扱う方法をいくつか検討した。

先日のディスカッションでは Andreas から,大規模なリファクタリングを行う上で考えられる3つの方法の中でどれが最善だろうか,という質問があった。彼の示した方法は,

  • ビッグバン - 最終目標としての構造を定義して,その終の棲家にコードを持ち込む。
  • 分割と統治 - 大きな泥団子を2つに割る。これを最後まで繰り返す ...
  • 絞殺- クラスを絞め殺す

ほとんどの参加者が,ビッグバンでの成功はまずあり得ない,という点では合意した。Aaron Digulla 氏からは,自身がそのキャリアを通じて絞殺型のアプローチを使い続けている,という意見があった。これは質の悪いコードを徐々に変形させて,テストハーネスを張りめぐらせたぴかぴかの新しいコードにする,というアイデアに基づく戦略で,小さな部分から徐々に始めるため通常はリスクが小さくすむという利点がある。また David Hall,Shane MacLaughlin の両氏は,プログラムの修正部分すべてに関して十分なテストを書き,小さく「分割して統治」することの重要性を強調した。完全な書き直しを方法として主張する者もいたが,InfoQ が以前のポストで取り上げたように,それもまた別の意味でのチャレンジだ。

Sibylle Peter 氏と Sven Ehrke 氏は,自ら実践する「評価の実施と大規模リファクタリングのマスタプラン の立案」というアプローチについて説明してくれた。リファクタリングの各ステップを,氏らは次のような手順で行っている。

  • 分析:望まれる結果とその達成方法の定義。
  • 実施:リファクタリング技法を適用したコード編集の実行。
  • 安定:実施結果の永続性を確保する手法の適用。

大規模なリファクタリングにおいて今,注目を集めているアプローチがある。それが ミカドメソッド(Mikado Method) だ。このミカドメソッドの歴史は,Daniel BrolundOla Ellnestam 両氏の行った仕事に関係している。名称はミカドゲームに由来するものだ。このメソッドによれば,

コードの修正は,ちょうどミカドゲームのようなものです。コードベースを変更しようとするとき,本当に意図したとおり修正が実行できることはまずありません。コードの移動やクラスの抽出などなど,事前に行わなければならないことが数多くあるものです。最初のひとつかみでミカドを拾い上げられることは滅多にないですよね!ほとんどの場合,ミカドをリファクタできるまであれこれ移動を続けて,目標に到達するために地道な努力をしなければならないのです。

ミカドのアプローチは,目標を念頭に置くことから始まる。次にリファクタリングが必要なすべてのコードベースに対して,最終目標を起点とした依存関係グラフを作成する。そのステップは,ゴールに到達するための当面の必要条件を見つけ出すことから始まる。次にその依存関係にあるものを見つける。この作業を,必要条件や依存関係を持たない末端 (leaf) に到達するまで続けるのだ。これが多くの場合,リファクタリングを始めるのに最適な出発点になる。依存性グラフが完成すれば,その末端からゴールに向けて一歩ずつ戻っていく,というのが基本的な考え方である。

このアプローチでは「取り消し(Undo)」の重要性が強調されている。チームは変更を捨てて最初に戻ることを恐れてはいけない,というのだ。また過度の分析作業に陥ることを避け,まずは取り付きやすいステップから始めてその結果を理解する,という方法が推奨されている。ミカドメソッドについては,それを取り上げた書籍 の初稿が現在公開されている。

要するに,大規模なリファクタリングは困難な作業ではあるが,重要なのは開始点を見出すこと,小さなステップで作業を進めていくこと,この2つである。

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

あなたの意見をお聞かせください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする
コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

ディスカッション

InfoQにログインし新機能を利用する


パスワードを忘れた方はこちらへ

Follow

お気に入りのトピックや著者をフォローする

業界やサイト内で一番重要な見出しを閲覧する

Like

より多いシグナル、より少ないノイズ

お気に入りのトピックと著者を選択して自分のフィードを作る

Notifications

最新情報をすぐ手に入れるようにしよう

通知設定をして、お気に入りコンテンツを見逃さないようにしよう!

BT