🧹

[図解][解説動画付き] リファクタリングの原則

2023/02/06に公開

始めに

  • この記事はマーティン・ファウラーのリファクタリング本の第2章「リファクタリングの原則」の図解まとめです
  • この本はオライリーサブスクで読めます
  • 動画テキストの両方を用意しています
    • 片方だけ読んでも内容は把握できますので、お好きなスタイルで閲覧ください。
  • 【書籍概要】「Refactoring: Improving the Design of Existing Code
    • アジャイル17人衆の1人マーティン・ファウラーによるリファクタリング本第2版(部分的にケント・ベックも参加)。一般に「リファクタリング本」といえばこの本のことを指すくらい有名な名著。リファクタリングの概要・適用すべきポイント・適用方法等が具体的に説明されていてわかりやすい
  • この記事は以前にQiita投稿した記事の再構成です。

https://learning.oreilly.com/library/view/refactoring-improving-the/9780134757681/

なんで第2章なのか?

  • 本書の構成は以下のようになっています。下記の通り第2章が個人的に分かりにくかったためまとめています
概要 まとめるべきかどうか
第1章 リファクタリングの実例を通してリファクタリングの 雰囲気を遣む ✖本章の内容は書籍を見ないと要点はつかめないかと思いました
第2章 リファクタリングの定義やメリット、いつリファクタリングすべきか等といった リファクタリングの基本 を紹介 🔵読み物風に書かれており要点がつかみにくかったため本記事でまとめ直そうと思いました
第3章 より具体的に どのようなコードに対してどのようなリファクタリングを適用すべきか を紹介 REFACTORING・GURUのまとめが良くできていたのでそちらを読んでいただいたほうが良いかと思います
第4章 リファクタリングと一緒に 使用が必須な技術でもあるテスト(特にTDD)について 簡単に例を通して紹介 ✖必須技術なので紹介されていますが、本書はテスト本でもないので深くは書かれていたいため特にまとめる必要はないと感じました。
第5章以降 リファクタリングカタログ を掲載 ✖書籍の記載が非常にわかりやすく、まとめる必要もないほどです(図による解説、サンプルコード、動機、適用方法と項目が分かれており、理解しやすいです)。
REFACTORING・GURUのまとめもおススメです

第2章「リファクタリングの原則」

概要

そもそもリファクタリングとは何か?どういうときにリファクタリングすべきか?など、リファクタリングの基本原則を紹介する

テキスト

image.png

image.png

  • リファクタリングの定義

    • ソフトウェアの動作は変えずに内部構造を変えて理解しやすく変更を容易にする(もしくはそのこと)
      • つまり、リファクタリング中は 機能追加しない
  • リファクタリングの利点

    • コード品質向上(割れ窓対策、DRY原則準拠等)
    • コードが読みやすくなる
    • バグが見つけやすくなる
    • (長期的に見れば)高速化しやすくなる
  • リファクタリング開始のサイン

    • 似たようなことを行ったとき(3ストライク)
    • 新機能実装前
    • コードの理解を頭の中で形成したとき(パッと見で理解できないコードに出くわしたとき)
  • リファクタリング推奨事項

    • 数週間を要する大規模のリファクタリングの場合、小さいリファクタリングを散発的に適用していくことで対処可能(例:mf-bba等)

    • コードは特定の人物が独占するのではなく、チームメンバーからもプルリクを出せるようにする

    • image.png

    • 開発ブランチとリファクタリングブランチを分けるべきではない(サクッとリファクタリングしづらくなる。ただしCIを導入してバグ混入を監視している前提)

    • テストは自己テストコード必須(mf-stc(Unitテストとほぼ同義?))

    • 古いコードもリファクタリング対象となり得る

    • データベースのリファクタリング

      • データと呼び出し元コードが分散しており難しい(密結合/影響範囲が広い)
      • リファクタリング後にシステムが正しく動くことを確認する必要がある
      • コミットを細かく切るのをお勧め
      • image.png
  • SWの柔軟性

    • 将来書いているコードに対するニーズが変わった時に向けてコードに柔軟性を持たせるかどうか
      • リファクタリングするのが難しそうな場合のみ柔軟性を持たせる
      • それ以外はyagniの法則を適用する(今いらない機能は持たせない)
      • image.png
  • リファクタリングはXPの一部として発生してきた

  • 3種の神器「自己テスト」「リファクタリング」「CI」

    • これがないと上記のyagniは実践できない
  • リファクタリングとパフォーマンスの影響

    • 一時的に性能低下する可能性はあるが、パフォーマンスチューニングしやすくなる
    • パフォーマンスに影響するコードは全体の10%に集中しがち(パレートの法則)
      • 問題になるまでパフォーマンスよりもプログラム構造の良さを追求、そして必要になったらその10%をチューニングする方が早く高速化できる

【参考】IDEのリファクタリング支援機能例

最近のほとんどのIDEでは関数の抽出などリファクタリングを支援する便利な機能がついています。
テストスイートと並んでともに快適にリファクタリングを行うための必須機能の1つです。

VSCode(python/Java/PHP/SCSS等)

https://code.visualstudio.com/docs/editor/refactoring

Visual studio(C#/VB/python/C++)

https://docs.microsoft.com/ja-jp/visualstudio/ide/refactoring-in-visual-studio?view=vs-2022

https://docs.microsoft.com/ja-jp/visualstudio/python/refactoring-python-code?view=vs-2022

https://docs.microsoft.com/ja-jp/cpp/ide/writing-and-refactoring-code-cpp?view=msvc-170

動画

https://youtu.be/vKMh94C43FE

オライリー・ジャパンブスクについて

オライリー・ジャパンサブスクO'Reilly「Learning Platform」では、オライリー・ジャパン書籍を初めに、約6万冊の書籍や動画等が読み放題です。話題になった技術書は半数以上は読める印象です。英書がメインなのがネックですが、ブラウザの翻訳機能を使えば問題なく読めます。個人的にこのサブスクで学習の質が劇的に改善したので、全然関係ない立場ですが勧めて回っています。

概要/使い方/価格などは 以前にまとめたこちらの記事 を参考にしてください

Discussion