リファクタリングとは
リファクタリングとは、メンテナンスしやすくなるように、ソースコードを書き換えていく作業の事です。
きれいなコードを書く指針として、徐々に浸透してきています。
公式ホームページは、Refactoring.comにあります。(日本語版はこちら)
リファクタリングの原典はマーチン・ファウラー著「Refactoring(洋書)」になります。
日本語版も出版されていますので、まずこの原典は手に入れておきましょう。
リファクタリングの思想や基礎、カタログごとの手順などが詳しく解説されています。
マーチン ファウラー Martin Fowler 児玉 公信 平澤 章 友野 晶夫 梅沢 真史
ピアソンエデュケーション(2000-05)
このページでは、リファクタリング入門としてできるだけ簡潔にまとめています。
より詳しく知りたい方などは、上記の書籍のほかにもたくさんの解説書がでていますので、参考にしてください。
リファクタリングの基本方針
-
コードをできるだけ小さな単位に分割する
-
処理のかたまりに名前をつける
-
処理を重複して記述しない
リファクタリングの基本的方針のひとつめは、コードをできるだけ小さな単位に分割することです。
小さな部品のほうが理解しやすく、バグも少なくなるからです。
また、コードを小さく分割することで、そのまとまりごとにメソッド名やクラス名などの名前を付けることができます。
実は、この名前がコードがわかりやすくなるかどうかの分かれ目になります。
コメントを充実させるよりも、リファクタリングによってコードの断片をまとめ、適切な名前を付けるべしというのがリファクタリングの教えです。
(もちろん、実際にはコメントも重要ではありますが。)
そして最後に重要なのが、コードの重複をできるだけ少なくすることです。重複コードを見つけたらまず間違いなくリファクタリングの対象になります。
重複するコードがあるということは、プログラムの変更時に変更しなくてはならない箇所が分散してしまい、変更時のバグが入り込みやすくなってしまうということです。それを防ぐためには、重複するコードをできるだけ少なくするというのはコードの保守性を高めるためにきわめて重要な作業となります。
ただし、あまりに共通ルーチンを使い回すと、逆にメンテナンスのしやすさを低下させてしまうこともあることを覚えておいてください。
あまりに多くのモジュールから、ひとつの共通ルーチンが参照されているときは、その共通ルーチンを変更するときの影響が大きすぎることになってしまいます。
このへんのさじ加減を広い視点で判断し、コードの保守を行っていくことが重要です。
どんなプログラマーでもコンピュータに理解できるコードは書ける。しかし優秀なプログラマーだけが、人間に理解できるコードを書くことができる。
〜Martin Fowler
リファクタリングのルール
-
リファクタリングと機能改変を同時にはおこなわない。リファクタリングをしてから新しい機能を追加する。
-
リファクタリングを始める前と後にはユニットテストを実行しコードの機能が変更ないかを確認する。
-
パフォーマンスよりもメンテナンス性を重視する。
-
こだわり過ぎてはいけない。
-
小さなリファクタリングとテストの組み合わせを繰り返す。決して一度に大きなリファクタリングをしない。
大きなリファクタリングは惨事のもとである。
〜Kent Beck
それぞれのリファクタリングを日本語で独自に解説しています。
*サンプルコードはC#で書かれています。
-
-
Change Bidirectional Association to Unidirectional
-
Change Reference to Value
-
Change Unidirectional Association to Bidirectional
-
Change Value to Reference
-
Collapse Hierarchy
-
Consolidate Conditional Expression
-
Consolidate Duplicate Conditional Fragments
-
Convert Dynamic to Static Construction by Gerard M. Davison
-
Convert Static to Dynamic Construction by Gerard M. Davison
-
-
-
Eliminate Inter-Entity Bean Communication (Link Only)
-
Encapsulate Collection
-
Encapsulate Downcast
-
Encapsulate Field
-
-
-
-
-
-
-
-
-
-
Hide presentation tier-specific details from the business tier
-
-
-
-
-
-
Introduce Business Delegate
-
-
-
Introduce Local Extension
-
-
Introduce Parameter Object
-
Introduce Synchronizer Token
-
-
-
Move Business Logic to Session
-
Move Class by Gerard M. Davison
-
-
-
-
-
-
-
-
-
-
Reduce Scope of Variable by Mats Henricson
-
Refactor Architecture by Tiers
-
-
-
Remove Double Negative by Ashley Frieze and Martin Fowler
-
-
-
-
-
Replace Array with Object
-
Replace Assignment with Initialization by Mats Henricson
-
Replace Conditional with Polymorphism
-
Replace Conditional with Visitor by Ivan Mitrovic
-
Replace Constructor with Factory Method
-
Replace Data Value with Object
-
Replace Delegation with Inheritance
-
Replace Error Code with Exception
-
Replace Exception with Test
-
Replace Inheritance with Delegation
-
Replace Iteration with Recursion by Dave Whipp
-
Replace Magic Number with Symbolic Constant
-
-
Replace Nested Conditional with Guard Clauses
-
Replace Parameter with Explicit Methods
-
-
Replace Record with Data Class
-
Replace Recursion with Iteration by Ivan Mitrovic
-
Replace Static Variable with Parameter by Marian Vittek
-
Replace Subclass with Fields
-
-
Replace Type Code with Class
-
Replace Type Code with State/Strategy
-
Replace Type Code with Subclasses
-
Reverse Conditional by Bill Murphy and Martin Fowler
-
-
Separate Data Access Code
-
Separate Query from Modifier
-
Split Loop by Martin Fowler
-
-
-
-
Wrap entities with session
-
Preserve Whole Object:
-
Introduce Prameter Object:
-
Introduce Null Object: