リファクタリングとは?
「リファクタリング」とは、作成したコードを変えることなく、コードを改善することを言います。
「リファクタリング」は、メソット(内部構造)のみを変更し、書き出したプログラムの外の動きは変わりません。車で例えると、エンジン部品を違うメーカーで整理整頓して、同じスピードで車が走るようなイメージでしょうか。
「リファクタリング」を簡潔に覚えるとするならば、「動きは同じで、中身を変えること」と覚えておくと理解しやすいです。
よく混同されがちになりますが、バグの修正や機能の追加などは、「リファクタリング」ではないので注意しておきましょう。
リファクタリングを行う理由
「リファクタリング」を行う理由は、主に3点にあります。
- ソフトウェアの劣化を防ぐため
- 少ない労力でシステム効率を上げるため
- システムのパフォーマンスをあげたい時
なぜ?「リファクタリング」を行うのか、一つずつみていきましょう。
ソフトウェアの劣化を防ぐため
ソフトウェアの劣化を防ぐために「リファクタリング」の作業は、おこなわれます。
一度システム開発したプログラムを初期設計のまま放置しておくと、バグが発生したりと不具合が必ずでてきます。住宅購入した後に、掃除、メンテナンスをせずに放置しておくと、家はボロボロになります。
システム開発、メンテナンスを繰り返すほど、コードはより複雑になりゴチャゴチャになるでしょう。
しかし、定期的に「リファクタリング」でコードを整理することにより、システム開発やメンテナンスする時も、バグが発生する可能性も低くなり、不具合もなくなります。
住宅に例えると、定期的に掃除をすることにより、劣化が進むのを抑制。劣化が進み、取り替えが必要になった箇所もすぐに取り替えれば、住宅も長持ちします。
システム開発にも同じことが言えます。住宅のように、定期的に「リファクタリング」で整理整頓を行うことで、システム自体も安全に使用が可能。ソフトウェアの劣化を防ぐことができるようになります。
少ない労力で効率を上げるため
「リファクタリング」が必要な2点目の理由は、少ない労力で効率を上げるためです。
「リファクタリング」を行うことで、プロダクト(商品)のシステム開発をしている途中でも、プロダクト(商品)の起動修正も可能になります。
その他にも、定期メンテナスの際に、「リファクタリング」されているコードが、キレイに整理整頓されていることによって、エンジニアの方も修正作業がしやすくなります。
パフォーマンスを向上させたい時
「リファクタリング」を行う理由の3つ目は、システム自体のパフォーマンスを向上させたい時です。
例えば、同じシステム処理を行う際でも、少しコードを整理するだけで、3秒かかる処理が、0.1秒で完了すれば、「リファクタリング」する方がよいでしょう。
システムのパフォーマンスを向上させたい時も「リファクタリング」を検討するのがよいと言えます。
リファクタリングを行う際の注意点
リファクタリングを行う際の注意点は、4点あります。
- チームで運用する場合は、ルールを決める
- 「リファクタリング」を行うタイミング
- 「リファクタリング」がそもそも必要かを考える
- 「リファクタリング」後は小さくテスト確認をする
「リファクタリング」を行う際は、以上のような事に注意しなければいけません。
一つずつみていきましょう。
チームで運用する場合は、ルールを決める
チーム単位で、システム開発やメンテナンスを行う際は、必ずルールを決めるようにしましょう。理由としては、コードの読みやすさは、人によって異なるからです。
Aさんは、OOがわかりやすいけど、Bさんは××の方がわかりやすいなどが出てきます。Aさんがせっかく「リファクタリング」をしていても、Bさんが何も聞いてない状態で、システム開発をする際にパニックになる可能性もあります。
チーム単位でプロジェクトを進める場合は、必ず「リファクタリング」に関するルールを定めておきましょう。
リファクタリングを行うタイミング
「リファクタリング」を行う際は、日程調整にも気を付けなければなりません。
「リファクタリング」を行うということは、「リファクタリング」をおこなっている時は、その他の作業に取りかかれないことになります。
システムの開発を止めてよいか?など社内での状況に応じて、「リファクタリング」は行うようにしましょう。
リファクタリングがそもそも必要かを考える
「リファクタリング」がそもそも必要なのか?考えることも大切です。なぜなら、すでにベストの状態のコードなら「リファクタリング」する必要がないから。
あくまで、「リファクタリング」は、システムやエンジニアの人の効率性、パフォーマンス向上を目的として行うものです。
「リファクタリング」をして、バグがおこってどうしようもなくなったり、工数が取られて、無駄な時間を消費するくらいなら「リファクタリング」は、おこなわない方がよいでしょう。
リファクタリング後は小さくテスト確認をする
「リファクタリング」をおこなった後は、必ずテストをしましょう。「リファクタリング」は、人間の手によっておこなわれるので、ミスが起こる場合があります。
「リファクタリング」後にすぐテストを行うことで、バグが起こってもその場で修正することができます。
【リファクタリングNGな事例】
- 前:Aコード→リファクタリング処理→Bコード
- 後:Aコード→リファクタリング処理→Cコード
以上のように、出力結果が異なる場合は、修正作業が必要になります。
【リファクタリングOKな事例】
- 前:Aコード→リファクタリング処理→Bコード
- 後:Aコード→リファクタリング処理→Bコード
以上のように「リファクタリング」前と後も同じ情報が出力されたら、「リファクタリング」は、成功ということになります。
テスト結果を確認せずに、後々、バグ修正で時間が取られたら、本末転倒になりますので、注意しておきましょう。
リファクタリングのメリット
「リファクタリング」を行うメリットは、以下の3点になります。
- 内部構造が整理されてメンテナンスしやすい
- トラブルが発見しやすくなる
- システム設計の劣化を防ぐことができる
「リファクタリング」のメリットは以上になります。
それぞれみていきましょう。
内部構造が整理されてメンテナンスしやすい
「リファクタリング」を行うことで、基本的には、システムのメンテナンスがやりやすくなります。
書類整理に例えると、乱雑に散らかっている書類から、必要なことを探すより、ファイルにしっかりまとめられているファイルの方が、必要な情報は見つけやすくなります。
チーム単位で、「リファクタリング」する場合も、自分自身が書いたコードを「リファクタリング」する場合も、コードが整理されてメンテナンスしやすいのは、メリットと言えるでしょう。
システムトラブルが発見しやすくなる
「リファクタリング」を行うことで、システムトラブルが発見しやすくなります。
コードが簡略化されたことにより、余計なコードを読み、理解しなくて済むのと、以前リファクタリングした記録から、システムトラブルを発見しやすくなるからです。
システムトラブルを見つけやすくなることで、無駄な工数削減や時間の削減にも繋がるので、「リファクタリング」をするメリットは大きいと言えるでしょう。
システム設計の劣化を防ぐことができる
「リファクタリング」を行うことで、システム設計の劣化を防ぐことができるのも、大きなメリットになります。
冒頭でもお伝えしましたが、システム設計をしていても、時間が経つにつれ不具合は、必ず出てきます。不具合が出て来て、いきなりコード修正をしようとしても、何が悪いかわかりません。
不具合がでた場合、原因を見つけるところから始めないといけないので、かなりの手間になります。しかし、「リファクタリング」を定期的に行うことにより、システム自体を常にアップデートすることができます。
システム設計の劣化が防げるのも、「リファクタリング」のメリットと言えるでしょう。
リファクタリングのデメリット
「リファクタリング」には、多くのメリットがありますが、デメリットも存在します。以下の2点が「リファクタリング」を行う際のデメリットになります。
- バグが発生した場合、復旧に時間がかかる
- 人によってはコードがわかりにくくなる
バグが発生した場合、復旧に時間がかかる
「リファクタリング」を行う際のデメリット1点目は、バグが発生した場合、復旧に時間がかかることです。
「リファクタリング」を行うことにより、コードも整理され、システム開発やメンテナンスが効率よくおこなわれることも事実。しかし、正しいコードが入力されていないと、正しくコードが出力されずに、バグを起こしてしまいます。
バグが発生してしまうことで、復旧作業等での損害も、大きいものになるでしょう。
「リファクタリング」を行う際の注意点でも述べましたが、「リファクタリング」を行う際は、「リファクタリング」が完了した時点で、必ず確認のテストは、行うようにしてください。
テストを行うことで、仮にバグが出たとしても、すぐに復旧作業ができるので、大きな損害は発生しなくなります。
バグが発生した場合、復旧作業に時間がかかることは、念頭において、「リファクタリング」作業に取り組むようにしましょう。
人によってはコードがわかりにくくなる
「リファクタリング」は、人によっては、コードがわかりにくくなるのも、デメリットと言えるでしょう。料理のおいしさも人によって違うように、コードに関しても、人により読みやすさは違います。
しかし、あらかじめルール等を定めておくことで、コードが理解できないというミスは無くすことができます。
プロジェクトのチームリーダーを中心として「リファクタリング」に関するルールを定めておきましょう。
リファクタリングでどのようなことを行う?
「リファクタリング」を実施する際に、どのようなことを行うか?を説明します。
「リファクタリング」を行う具体的な事項は、以下3点になります。
- 重複部分を減らす
- ネストを浅くする
- 変数名と関数名の修正を行う
以上の3点を「リファクタリング」で行うのが、一般的です。
重複部分を減らす
「リファクタリング」を行う際は、重複部分を減らす作業をおこないます。
グループでシステム開発をおこなっている場合、システム規模が大きくなればなるほど、色んな人が同じコードを書いてしまうことで、コードがグチャグチャになります。
グチャグチャになったコードをclassや関数でまとめることで、重複部分を減らすことができます。
重複部分を減らすことは、「リファクタリング」の際によくおこなわれます。
ネストを浅くする
「リファクタリング」をする際に、ネストを浅くする作業もしていきます。
プログラムのループがどんどん深くなっていってしまうと、コード全体がわかりづらくなってしまいます。
ネストが深くなっている部分を関数切り出ししておくことで、ネストを浅くすることが可能になり、コードが理解しやすくなります。
コードを読みやすくする「リファクタリング」を行う際には、ネストを浅くする対策が必要と言えるでしょう。
変数名と関数名の修正を行う
「リファクタリング」を行う作業では、変数名と関数に関しても修正をおこなっていきます。
【作業内容】
- 使ってない変数、関数をコードから削除する
- 他の作業をする際にまとめて削除をする
- 名前をつける際、短くて端的な関数名をつけるようにする
以上のような「リファクタリング」を行うことで、バグが起きにくいシステム構築とメンテナンスが可能になります。
まとめ
今回は、「リファクタリング」とは何か?について解説してきました。「リファクタリング」を行うことで、システム開発やメンテナンス等の効率、費用対効果は、大きくなります。
リファクタリングについて、しっかり理解をして、今後のプロダクト開発にお役立て頂ければ幸いです。