リファクタリング

「プログラムの外部的振る舞いを保ったままで、内部の構造を改善していく作業」(『リファクタリング:プログラミングの体質改善テクニック』、マーチン・ファウラー著、児玉公伸ほか訳)(新装版『リファクタリング 既存のコードを安全に改善する』でも同訳)。

つまり同じ動作をしつつも、違う実装に変える作業、あるいはそのためのテクニックをリファクタリングという。
配列要素を昇順に並べ替えるための実装をバブルソートからクイックソートに変える──というのもリファクタリングといえるだろう。

* * *

リファクタリングを英単語で綴ると refactoring で、これには factor という単語が隠れている。 factor は「要素」。これに接頭辞 re- と動名詞化語尾 -ing をつけている。日本語をあてるなら「再要素化」だろう。

ところで読者諸氏が中学校で習っただろう「因数分解」。因数分解は英語で factorization という。小学校で習う「素因数分解」は integer factorization。

英語圏の習慣なのだろうか? 彼らは数や式を要素の「積」の形に分解することが大好きなようだ。(分析のために対象を要素に分解することは理解できる。分解したものを掛け算、「積」であらわすことに特殊性を感じる。ぼくは分解したものの「和」だと感じる)

もとい。

英語圏に住む彼らは、その用いる言語から自然にプログラムを「要素」の「積」だと捉えているのだろう。そしてプログラムを別の積の形に表現しなおすこと──これを「リファクタリング」と呼んでいるのではないだろうか。

因数分解にしても素因数分解でも、ある式(もしくは数)の積の形は(交換法則を使う限りにおいて)唯一定まる。
一方でプログラムの場合は、同じ動作をさせるにしても違った表現方法を取りえる。(他人に意図を伝えるにしても、選ぶ言葉や表現方法がたくさんある、ということに近いか?)
つまり数式とは違い、プログラムにはいくつかの因数分解方法がある。リファクタリングが実際に可能なのはそういう事情だろう。(あるいはプログラムの「仕様」が多様な解釈を可能にする程度に「緩い」ため)

「積」つながりで。
プロダクトという単語には「積」の意味がある。英語圏の彼らは、ものごとを「積」の形で捉えることがかなり好きなのではないだろうか?
余談の余談だけれど、高校で習う総和の演算Σ(シグマ)に対して、総積演算Π(パイ)がある。シグマは sum の S、パイは product の P、それぞれのギリシャ文字である。

プログラムの先頭文字は p。そしてプログラムは「関数」 function の組みあわせで構成する。 p = Π fn。この fn が無数に変化しうる。その形を見つける方法をリファクタリングと言うのだろう、とも。

* * *

リファクタリングの技術は冒頭に挙げた書籍『リファクタリング』に数多く挙げられている。参考にするとよいだろう。

また特に Java 言語では開発環境(IDE)で「変数の名前変更」や「関数の抽出」、「インライン化」といった面倒な作業を過たず実行できる。これは是非とも、そして大いにつかってほしい。

「プログラムの外部的振る舞いを変えないこと」には「単体テスト」による保護が効く。

この記事が気に入ったらサポートをしてみませんか?