西村さんの雑記ログ

技術や趣味について色々。

レガシーコード改善ガイドを読み終わりました

ゆるゆると読んでいた「レガシーコード改善ガイド」を読み終わりましたので、ちょっとした感想とかを書いておきます。

どんな本か

レガシーなコードにリファクタリングを加えるためのやり方や心構え、アドバイスについて述べられた本です。

特に、「依存関係の排除」については数多く述べられています。

依存関係の排除とは

他のクラスやインスタンスへの依存関係を排除することです。

本書内でも例はあげられていますが、例えばハードウェアへの出力や入力のためのライブラリがあったとして、そのライブラリのクラスインスタンスの作成やメソッド呼び出しを処理のメソッド(例えば、「なにかの計算結果を出力する」メソッドなど)内で書いてしまうと、依存関係が成立します。

依存関係があると、入力/出力のライブラリを変更したいときや、ユニットテストで一時的に別の場所へ出力したい/別の場所から入力したいとなったときに、大きな困難を伴ったり、そもそもそういうテストが不可能になったりします。

これを排除するために、インスタンスを作る処理とそのインスタンスを保持する変数を同じクラスの別メソッドとクラス変数に移行したり、インターフェースを使用したり、更には別のクラスに完全に任せてしまって、対象のクラスからは「出力」、「読み込み」といった処理を新しいクラスのインスタンスメソッド呼び出しで済ませるなどのリファクタリングを行います。

構成

大きく以下の3部で構成されています。

  1. 変更のメカニズム
  2. ソフトウェアの変更
  3. 依存関係を排除する方法

「1. 変更のメカニズム」では、「ソフトウェアにはどういった変更があるのか?」、「ソフトウェアにどういった依存関係の発生しやすい部分があるのか」、「変更やリファクタリングで有用なツール」について記載されています。

「2. ソフトウェアの変更」では、ソフトウェアの変更やリファクタリングに取り組んだときに遭遇する様々な困難について、アドバイスや有効な手法を記載しています。

「3. 依存関係を排除する方法」では、「2. ソフトウェアの変更」で取り上げている様々な手法についてより詳細に書かれています。

どう使うか

ソフトウェアの修正やリファクタリングの大きな視点から知りたいときは、「1. 変更のメカニズム」から読むのが良いかなと。

もし、そういった視点や理念を理解した上で修正やリファクタリングで「辛い……」となったときは、「2. ソフトウェアの変更」でその辛さにあった章を読むと良いでしょう。

とにかく手法を知りたい、網羅してみたいというときは、「3. 依存関係を排除する方法」を読むのがおすすめです。

関連書籍

本書内でも参考書籍として頻繁に出てきている以下の書籍がまず入るかと。

テスト駆動開発

テスト駆動開発

次点で、大規模にリファクタリングするときにどういうクラスの構成にするかという面で以下の書籍でしょうか。

レガシーなコードやソフトウェアの改善という視点では、類書のこちらも入るかもしれません。

余談

本書内で面白いなと思ったやり方として、「チェックアウトしたクラスをとにかく試行的にリファクタリングしてみる」という手法の記載があったことです。

なぜなら、この方法は私もシステムの修正時に時々やる方法だからです。

コミットしないことを前提にして要所要所で出力系メソッドで変数内容を出力してみたり、色々な処理をするメソッドを各種の小さなメソッドに分解して、元のメソッドはその小さなメソッドの呼び出しの羅列に変えるなどして、ソースコードを読むだけでは予測し得ない挙動を見つけ出すのには中々有用です。

この本を読むにあたって、最初は黙読で読むという形にしていたのですが、後付でscrapboxを使ったまとめを作っていくという形をとったので、実質2回読む事になり、結構な時間がかかりました。この辺は反省点なので、今読んでいる本からは読み込みとscrapboxまとめを並行で進めています。