Eビジネスを推進するORANGEシリーズ

EC-ORANGE
お役立ち資料ダウンロード ニュースレター登録

リファクタリングとは?メリットやデメリット、コツを解説します

「リファクタリングって何を指すのだろう。会社にとってどんなメリットがあるのかな」

と思っている方。

リファクタリングとは「外部から見た時の挙動は変えずに、プログラムの内部構造を整理すること」です。リファクタリングによりシステムを長く使い続けることや、トラブル時の対応を早めることが可能です。
とはいえ、リファクタリングが会社の事業にどんな良い影響を与えるのか、なかなかわかりづらいですよね。

そこで、この記事では、
  • リファクタリングの概要
  • リファクタリングのメリット、デメリット
  • リファクタリングを失敗しないためのコツ
  • リファクタリングに使えるツール
を、お伝えします。

リファクタリングを完璧に理解するのは難しいのですが、概要をつかむだけなら簡単です。まずはこの記事で、リファクタリングについてざっくり理解しましょう。

【目次】

リファクタリングとは

リファクタリングとは、「外部から見た時の挙動は変えずに、プログラムの内部構造を整理すること」です。英語ではRefactoringと表記します。

例えるなら、リファクタリングは部屋の整理整頓のようなもの。今のところ特に問題はないけれども、物が増えたときなどに備えて今ある物を整理整頓するのがリファクタリングなのです。

あくまで外部から見た時の挙動は変えないため、機能追加はリファクタリングではありません。
またリファクタリングは、動作そのものには問題のないプログラムが対象です。したがってバグの修正も、リファクタリングではありません。

具体的には、
  • 構造の階層化
  • プログラム内の要素につける名前を、簡潔なものに書き換える
などがリファクタリングにあたります。

アジャイル開発においてリファクタリングは重要な手法

短期間で設計から実装、テストまでの流れを繰り返すアジャイル開発において、リファクタリングはおさえておきたい手法の1つです。

というのも、プログラムを設計するさいにどれだけ予想しても、どうしても想定外のことは起こるものです。

そのため、むしろはじめからリファクタリングで構造を整える想定で進めていくことで、一定のスピードで安定して開発できます。

ただしリファクタリングするからといって最初の設計を適当にしてもよいわけではないので、その点は注意が必要です。


リファクタリングとリバースエンジニアリングの違い

リファクタリングもリバースエンジニアリングも、既存の製品を見直すことに違いはありません。しかし、
  • リファクタリング:「自社」の製品、サービスを見直す
  • リバースエンジニアリング:「他社」の製品、サービスを見直す
ことに違いがあります。

リバースエンジニアリングは他社の製品を分解することでそのつくりを理解して、自社の製品に活かすことを指します。

かたやリファクタリングは自社の製品を見直すことなので、ある意味反対ともいえますね。

次では、リファクタリングのメリットをご紹介します。

リファクタリングのメリット

リファクタリングのメリットは、以下の3つです。
  • 設計の劣化を防ぐことができ、システムを長く使える
  • コードを理解しやすくなり、引き継ぎ時の手間が減る
  • 修正、追加をより早く、正確に行えるため、トラブル時の対応が速くなる
以下、それぞれを解説します。

設計の劣化を防ぐことができ、システムを長く使える

まずリファクタリングによって設計の劣化を防ぐことができ、システムを長く使えるようになります。
ここでの設計の劣化とは、コードが煩雑になることなどです。部屋に例えるなら、物が散らかった状態ですね。

煩雑になったコードはトラブルの元になります。プログラムの仕組みがわかりにくいために、例えばプログラムをちょっと変えたつもりが、別の部分で意図せず大きな変化が起きる可能性があります。

このような状態になると、改善も簡単ではありません。

リファクタリングによって、システムがそのような複雑な物になるのを防ぐことができます。この点においてリファクタリングは、将来のトラブルを減らしている可能性もあります。

コードを理解しやすくなり、引き継ぎ時の手間が減る

リファクタリングによって、コードを理解しやすくなり、引き継ぎ時の手間が減ります。これはバイキング形式のレストランに例えるとわかりやすいです。

料理がなんの区別もなく並べられたレストランと和・洋・中で分けられたレストランでは、後者のほうがどこに何があるか、がわかりやすいですよね。

このようにリファクタリングによって、コードを理解するのにかける時間を減らすことができます。


修正、追加をより早く、正確に行えるため、トラブル時の対応が速くなる

リファクタリングによってコードがシンプルになっていると、トラブル時の対応も速くなります。
例えば片付けてない部屋でスマホが鳴っても、すぐには見つけられませんよね。

一方で綺麗な部屋なら、ケータイをすぐに見つけることができます。このようにリファクタリングによって、バグの早期発見ができる可能性があります。

リファクタリングのデメリット

リファクタリングのデメリットは、工数がかかっているように見えることです。前述の通りリファクタリングの対象は問題なく動いているコード。それをわざわざ修正するのは、一見無駄な作業に見えるかもしれません。

しかしメリットにあげたように、リファクタリングは長期的に見れば、むしろ将来のトラブルやそれにかける時間を減らしている可能性もあります。

そのため目的をはっきりさせてから、その目的を解決するための手法としてリファクタリングを取り入れるようにしましょう。

次では、リファクタリングをいつ行うべきか?を解説します。

リファクタリングをすべきタイミング

以下の2つが、リファクタリングをすべきタイミングです。
  • プログラムに改善の余地を見つけたとき
  • 機能など、プログラムを追加するさい

プログラムに改善の余地を見つけたとき

まずプログラムに改善の余地を見つけたときは、リファクタリングの実行に適しています。思い立ったが吉日、ということですね。

具体的な改善の余地としては、例えばifなどの入れ子の構造が、何重にもなっている、などが挙げられます。これら改善の余地は、実際にコードを見るプログラマが見つけることが多いです。

機能など、プログラムを追加するさい

機能追加のタイミングでリファクタリングをするのも有効です。しかしここで重要なのは、機能追加とリファクタリングは分けて行うこと。

機能追加とリファクタリングを分けることで、問題が発生したときの対処をしやすくなります。
次に、実際にリファクタリングする際のコツを紹介します。

リファクタリングを失敗しないためのコツ

リファクタリングする際のコツとしては、以下の4つが挙げられます。
  • 最初に、リファクタリングの対象を絞り込む
  • バックアップをとっておく
  • ステップを細かく分けて進める
  • 何度もテストをする
以下、それぞれを解説します。


最初に、リファクタリングの対象を絞り込む

最初に、リファクタリングの対象を絞り込む必要があります。なぜならリファクタリングするからといって、対象のプログラム全体が悪い、というわけではないため。

リファクタリング対象のプログラムには、長年使われてきた実績があります。その実績を考慮して、まずは良い点、悪い点をそれぞれ把握。次に良い点は残す一方で、複雑でよく修正するものからリファクタリングするのがおすすめです。

バックアップをとっておく

リファクタリングの前また最中は、頻繁にバックアップをとっておくのがおすすめです。こうすることで、リファクタリング中に問題が起こった場合に、すぐに元に戻せます。


ステップを細かく分けて進める

リファクタリングは、ステップを細かく分けて進めるのが重要です。というのもそのほうが、バグが発生した時の修正が容易なためです。

部屋掃除にしても、全体を一気にやるよりは、部分ごとに分けた方がいいですよね?全体を一気にやると、物をなくす可能性があります。

何度もテストをする

リファクタリング前後でプログラムが今まで通りに動作するのか、確認する必要があります。テストはステップごとにやるのがおすすめです。

またデグレ(デグレード)と呼ばれる、いわば「修正前より状況が悪化する」ことを防ぐために、既存のコードを全て書き換える箇所は特に入念にテストしましょう。

おすすめのリファクタリングツール、サービス

ここではおすすめのリファクタリングツールやサービスとして、以下の5つを紹介します。
  • Lattix
  • understands
  • Eclipse
  • flake8
  • SourceMonitor

Lattix:アーキテクチャ分析ツール

「Lattix」は、テクマトリックス株式会社が提供しているアーキテクチャ分析ツールです。

具体的には、ソフトウェア内の要素間の関係を表形式で可視化してくれます。これにより構造上の問題点が一目でわかるように。

Lattixは、15日間の無料体験版が提供されています。

https://www.techmatrix.co.jp/product/lattix/index.html


understands:ソースコード解析ツール

「understands」は、テクマトリックス株式会社が提供しているソースコード解析ツールです。主にLattixよりも細部の問題を探す際に使われます。
Lattixと同じく、プログラム内の部分同士の関係を図で表示する機能があります。

https://www.techmatrix.co.jp/product/understand/


Eclipse:phpなどに使える名前変更、移動ツール

「Eclipse」は、エクリプス財団が提供しているオープンソースソフトウェアです。プログラム上におけるラベルのような物、クラスや変数を一括して変更できます。

https://www.eclipse.org/


flake8:Pythonの文法チェックツール

「flake8」は、PyPIが提供している文法チェックツールです。「Python」というプログラミング言語で書かれたプログラムに対して使用されます。「Python」の言語には使えません。
flake8でプログラムを読み込むと、エラーメッセージとエラーが起きる部分が検出、表示されます。エラーが多いものから表示されるので、緊急度も大まかに把握できるのが特徴です。

https://pypi.org/project/flake8/


SourceMonitor:C#などのコードの複雑さを計測するツール

「SourceMonitor」は、Campwood Softwareが提供しているツールです。C#、Java、HTMLなどの言語に対応。
プログラムの階層がどれほど深くなっているか、などを計測できます。

http://www.campwoodsw.com/index.html


リファクタリングで言語変更はするべきか?

プログラムを見直した結果、「プログラミング言語から変更したほうがよい気がしてきた…」と思う場面もあるかもしれません。

しかし、リファクタリングとして言語変更から行うのは、正直おすすめできません。

というのも、コードを1から書き直すときというのは、社内で製品に対する不満があるときであることが少なくないです。

その場合、プログラム単位で見直すよりも、製品そのもの、ひいてはビジネスモデルから見直したほうがよいことが多いです。

「本当にリファクタリングが最適な手段なのか?」という問いは常に持っておくことをおすすめします。

リファクタリングによって、保守性の高いプログラミングを!

この記事では、最初にリファクタリングとは「外部から見た時の挙動は変えずに、プログラムの内部構造を整理すること」である、と述べました。

次にリファクタリングのメリットとして、
  • プログラムの品質を保つことができる
  • 引き継ぎの手間が減る
  • トラブル発生時の対応を速くすることができる
を挙げました。

リファクタリングは、プログラマが「このプログラムは改善できる」と思った時や、機能追加の際にやるのがおすすめです。
実際にリファクタリングを行う際には、既存のコードを安全に改善するためにも、作業を細かく分けて逐一テスト、バックアップを取らなくてはなりません。

そして最後に、リファクタリングに役立つツールを紹介しました。

リファクタリングは上手くやれば、システムの保守性を高めることができます。リファクタリングを作業に予め組み込むことで、未来のトラブルを減らしましょう。

PR:「EC-ORANGE」のパッケージ販売に加え、多くの構築ノウハウを生かした受託開発をおこないます。

>>お問合せはこちらから