リファクタリングとは何か?その意味とやり方、目的を解説

2022年5月13日

リファクタリングの概要

リファクタリングとは、ソフトウェアのコンポーネントの機能や振る舞いを変更せず、設計やソースコードを簡潔にする再組織化の技法です。簡単に言うとプログラムを整理整頓することがリファクタリングです。

リファクタリングを私たちが暮らす家の中でたとえると、本棚を増やしたり、余計なものを片付けたりして、探している物をすぐに見つけやすくするために整理整頓を行うことです。外から見た家の姿は変わりませんが、家の中は整理整頓されることでスッキリします。
設計やプログラムも同様に、誰が見ても分かりやすくするために、リファクタリングで整理整頓を行います。

リファクタリングの定義

リファクタリングとは「プログラムの機能仕様は変えずに、内部構造を変えること」です。
ここからは「機能仕様」「内部構造」という言葉について、解説していきます。

機能仕様とは何か?

機能仕様はそのプログラムがどのような入力を受け付けることができるか、そしてどのような入力を受け付けると、どのような動きをするかを書いておくものです。
つまり、機能仕様は「外から見たプログラムの動き」と言えます。

たとえば自動販売機のシステムなら「このボタンを押すとジュースが出ます」といった説明を書いておくようなイメージです。
実際にプログラミングをする前にこのような機能仕様を書いて、どのようなプログラムを作るのかをしっかりと計画しておくと、プログラミングを進めやすくなります。

内部構造とは何か?

内部構造はプログラムのソースコードに書かれている「中身」です。
機能仕様が日本語で分かりやすく書かれているのに対し、内部構造はプログラミング言語を使用して、情報をどのように処理するか具体的に書かれています。
先ほどの自動販売機の「このボタンを押すとジュースが出ます」という機能を、プログラミング言語で構築したコードの構造が内部構造です。

まとめると「機能仕様」は外から見たプログラムの動き、「内部構造」はプログラムの中身です。この「機能仕様」は変えないで、「内部構造」を変えるのがリファクタリングです。

リファクタリングのやり方

ここからはリファクタリングのやり方について説明していきます。
リファクタリングの対象になるものは以下のとおりです[1]Roger S. Pressman(著)、Bruce R. Maxim(著)、SEPA翻訳プロジェクト(翻訳)『実践ソフトウェアエンジニアリング(第9版)』オーム社、2021年、118~119頁。

  • 冗長な設計要素
  • 未使用の設計要素
  • 非効率なアルゴリズム
  • 不要なアルゴリズム
  • 稚拙なデータ構造
  • 不適切なデータ構造

上記の内容に限らず、ソフトウェアの保守性凝集度を考慮しながら、リファクタリングする内容を考えていく必要があります。
保守性とは、メンテナンスや管理のしやすさのことです。ソフトウェアを開発した後は、そのソフトウェアを管理・運用していく保守がはじまります。この保守の活動をしやすくするために、リファクタリングを行い、保守性を高めていきます。
たとえば、以下のようなことに気をつけ、コードを書き直していきます。

  • インデントを使って、コードの構造を分かりやすくする
  • ネストをあまり深くしすぎない
  • ひとつの関数を大きくしない
  • ループ処理を使うことで無駄なコードを書かない
  • 変数のスコープ(有効な範囲)を小さくする
  • 後から変更される可能性がある部分は定数としハードコーディングを控える
  • 簡潔で分かりやすいコメントを付ける

コーディングについては、下記の記事もご参照ください。

次は凝集度について解説していきます。凝集度とはモジュール強度とも呼ばれるもので、プログラム全体の中のモジュールに収められている機能が、どの程度独立して存在しているかの度合いを表す指標です。
たとえば1つのファイルの中で3つの機能のコードが書かれていたとします。3つの機能の関係性が低いのであれば、1つのファイルに収めるのではなく、個別にモジュール化して機能ごとにファイルを分けたほうが管理がしやすくなります。
この凝集度については下記の記事でも解説しているので、ご参照ください。

リファクタリングの目的

この「リファクタリング」の目的について考えてみます。
外から見た動きが変わらないなら、プログラムを利用するユーザーにとっては、特にメリットがありません。たとえば先ほどの自動販売機のシステムなら、中身が変わったとしても、ユーザーにとってはボタンを押したらジュースが出てくることは結局一緒です。

一方、プログラムを作ったり、修正したりする開発者にとって、リファクタリングは大きなメリットがあります。
プログラム内部のソースコードを分かりやすく整理することで、もし修正が必要になったとき、ソースコードを書いた人でなくてもスムーズにソースコードを理解して修正に取りかかることができます。また、コードが簡潔に整理されていると、不具合をみつけて修理することも、簡単にすばやく行えるようになります。

リファクタリングに該当しないもの

これまでリファクタリングの内容を見てきました。リファクタリングでは設計やコードを見直していきますが、システムの機能追加やプログラムの修正はリファクタリングとは呼びません
家の中で例えると、テレビを購入してから部屋に置く場所を作る、壁の修理をするなどはリファクタリング、すなわち整理整頓ではありません。
リファクタリングは動作そのものに問題が無いプログラムを対象としています。そのため、機能追加やバグの修正などはリファクタリングとは呼びません。

参考

文献

  • Roger S. Pressman(著)、Bruce R. Maxim(著)、SEPA翻訳プロジェクト(翻訳)『実践ソフトウェアエンジニアリング(第9版)』オーム社、2021年

Webページ

1Roger S. Pressman(著)、Bruce R. Maxim(著)、SEPA翻訳プロジェクト(翻訳)『実践ソフトウェアエンジニアリング(第9版)』オーム社、2021年、118~119頁。