C++のリファクタリングツール Xrefactory

もはや技術者の必読書*1となりつつある「リファクタリング―プログラムの体質改善テクニック」ですが、
その作者であるマーチンファウラー氏のMartin Fowler's Bliki in Japaneseを読んでいてふと思った。
C++リファクタリングブラウザ(リファクタリングツール)ってないのかなと。
全然詳しくないんですがVisual Studioにはリファクタリング機能がついているそうですが、僕は普段のコードがほとんどEmacsとg++なので探してみました。


C++は仕様がとても大きくて、他の言語と比べてリファクタリングブラウザを作るのがとても大変らしくなかなか見つかりませんでしたが、Refactoring Toolsで紹介されていたのがXrefactoryです。
Xrefactoryはシェアウェアで8日間試用出来るので試してみました。

インストール

1. http://xref-tech.com/xrefactory/download.htmlから、環境に合わせてダウンロードをします。(僕は「Xrefactory-i86pc-Linux」)
2. ダウンロードしたファイルを展開しどこかにおきます。ここでは ~/lisp/xrefとします。
3. Emacsから利用するので .emacs に以下の記述をします。

(setq load-path (cons "~/lisp/xref/emacs" load-path))
(setq exec-path (cons "~/lisp/xref" exec-path))
(load "xrefactory")

使ってみる

1.Emacsを起動し、 ~/lisp/xref/cppexercise/index.cppを開きます。
2.するとソースコード中にコメントでチュートリアルが書いてあるので指示に従うと一通り操作を覚えることができます。
3.まず最初に void completetions にカーソルを合わせて F6 を押すとプロジェクト作成を促されます。これはXrefactoryが関連ソースを走査して勝手にプロジェクトを作ってくれるので適当にY/Nを選んでいけばよいです。

定義元を参照する F6

ソースコード中の変数や関数にカーソルを合わせて F6 を押すと定義している場所にジャンプします。
F5 を押すと戻ってきます。

補完 F8

変数名・関数名などを補完してくれます。
うれしいのが構造体のメンバの補完。
こんな無茶なところで F8 を押しても補完してくれます。

    (*(5+(struct tm **)0x13e5f)[0]).tm_

リファクタリング機能 F11

1. Extract Function
実際のコード例で行きましょう。


Environmentのあたりを他のメソッドとして外に出したいなぁと思ったら、その範囲を選択して F11 を押します。
するとメニューが表示されるので Extract Function を選びます。
この時点で、選択範囲が微妙に気まずい感じだとエラーになります。
OKであれば、メソッド名を聞かれるので今回は適当に createDefaultEnvironment とします。
するとあっという間に、勝手にメソッド化されます。


で、外だしされたメソッドはこちら


これでコンパイルとしてテストが通ればリファクタリング完了です。
もしうまくいかない場合は、もういちど F11を押せば Extract Function の作業全てを簡単に Undo できるので安心です。


2. Rename Symbol
変数名・マクロ名・クラス名などなどを安全にリネームできます。
リネーム対象の上にカーソルを置いて F11 を押し、Rename Symbol を選ぶと実行できます。
C++の複雑なあれこれにも、かなり賢く対応してリネームしてくれます。Great!


3.Add/Delete/Move Parameter
メソッドの引数を増やしたり・消したり・移動したりできます。
F11を押して指示に従ってください。(だんだん適当になってきた)

まとめ

Xrefactoryは、他の言語の高級なリファクタリングブラウザを使っている人には機能的に物足りないかもしれませんが

という理由から、個人的にはかなりアリだと思っています。
興味のある人は、試用してみると良いかもしれません。

*1:はてなの開発者は全員読んでいる