動作概要
現在のところ、以下のようなリファクタリング機能が実装されています。- Rename local/instance/class variable - 変数名の変更
- Rename method - メソッド名の変更
- Rename constant - 定数名(クラス/モジュール名も含む)の変更
- Pull up/Push down method - メソッドを親クラス/子クラスに移動する
- Extract method - コードのある部分をメソッドとして切り出す
- Extract superclass - 共通のスーパークラスを持つクラス群に対し新しいスーパークラスを定義する
構成
Ruby Refactoring Browser(以下RRB)は、以下のような構成になっています。
(1) | emacs | |
---|---|---|
(2) | rrb.el | |
(3) | bin/rrb | bin/rrb_compinfo |
(4) |
RRB Core Library
|
(1)は、各種テキストエディタ(もしくはIDEなど)です。これがユーザーとの インターフェースになります。現在のところ、emacsのみがサポートされています。
(2)は、エディタからRRBを呼び出すためのバインディングです。 emacsの場合は、emacs lispで書かれたrrb.elというスクリプトです。
(3)はコマンドラインツールです。RRBのシェル用のインターフェースと言ってもいい かも知れません。実体はRubyスクリプトです。(2)から呼び出されることを前提に 作られていますが、コマンドラインから直接使用することも可能です。
(4)はライブラリ本体です。ほとんどの部分はRubyで書かれています。
入力されたスクリプトを解析し、
各種リファクタリングを施して出力します。
スクリプトの解析には、青木峰郎さんの
Ripperというパーサライブラリを
改造したものと、Ruby自体のリフレクション機構
(スクリプトをロードした状態で、どんなクラスが定義されているかを調べる機能)
を使用しています。
(※現在は、RipperのメンテナはRichard Kilmer氏に移り、
RubyForgeにて開発が続けられるそうです)
制限
RRBでリファクタリングするRubyスクリプトに関しては、 今のところ以下のような制限があります。- 複数のスクリプトからなるプログラムの場合、全てのスクリプトをemacs上に読みこんでおかなければならない。
- また、emacs上に読みこまれている全ての*.rbがリファクタリングの対象となる。
- スクリプトは定義部と実行部に分かれていなければならない
1は、リファクタリングの結果、どのスクリプトも変更される可能性があるからです。
2は、リファクタリングの対象となるべきスクリプトを自動で判定するのは困難だからです。
3は、スクリプトを解析する際に、実際にそのスクリプトをrequireして、
Rubyのリフレクション機構を使用する場合があるからです。
要するに、「requireしても何も起きない」ことが必要なわけです。
具体的には、「if $0==__FILE__...endで囲む」という定石を使うことを想定しています。
#定義部 class Hoge # Hogeを定義… end #実行部 if $0 == __FILE__ Hoge.new.run end