Library based Refactoring

ソフトウェア開発の世界は、ダイナミックっぽくて、日々様々な新しいツールや便利ライブラリが提案されていると思う。

リファクタリングコミュニティは、このダイナミックっぷりについていけているか? 言い換えると

  • 特定のライブラリを用いることによる、リファクタリングは発掘・文章化されていっているか? or


たとえば、XML のライブラリを知らない人が、XML を String でハードコーディングしていたとする。


String xml = "";
JavaXML ライブラリたとえば XOM なんかを知っていたとすると、このコードは以下のように変更(リファクタ)される:

Element root = new Element("root");
root.appendChild( new Element("child") );

String xml = root.toXML();


リファクタリングには、少なくともふたつのケースがあると思う:

  • 一つは、元々悪いコードを綺麗にするリファクタリング。さっきの例で言えば、XOM のライブラリを 知らずに ハードコーディングしていた。そして、ライブラリの存在を知ったからこそ、よりよいコードに改善(リファクタ)した。

このケース(上の XML の例が必ずしもこのケースとは強くいえないけれど)は、強制的なリファクタリングだと思う。つまり、知らなかったからこそ、よろしくないコードを書いたのであり、知っていたのであれば、そのようなよろしくないコードを書く人はいないだろう、という意味で強制的。進化的な言葉を使えば(僕は生物的な進化の専門家でもなんでもありません)、これは、淘汰だと思う。

  • もう一つは、進化的なリファクタリング。上の XML のコードは、ライブラリの存在をしっていたのにも関わらず、そのシンプルさうえ、あえて特定のライブラリを使わずにいたのかもしれない。そして、もし XML なコードが非常に複雑になったときに、特定のライブラリに移行するつもりなのかもしれない。

このケースでは、少なくとも懸命に設計した開発者の立場を考慮すると「悪いコードを書いたつもりはない」と言えると思う。そこには、改善すらないかもしれない。新しい要求に合わせて、コードを変更しただけだといえる。


ちょっと前に書いた http://d.hatena.ne.jp/asato-d/20050113 の内容とも一致するけど、この二つのリファクタリングのケースの違いが、微妙に気になる。