nprogram’s blog

気ままに、プログラミングのトピックについて書いていきます

リファクタリング入門

はじめに

以下の書籍を読んでリファクタリングを学習します。

書籍

  • 新装版 リファクタリング 既存のコードを安全に改善する
    • Martin Fowler [著]

リファクタリングの定義

外部から見たときのふるまいを保ちつつ、理解や修正が簡単になるようにソフトウェアの内部構造を変化させること

変更しにくいプログラムとは

  • 読みにくいプログラムは変更しにくい
  • ロジックが重複しているプログラムは変更しにくい
  • 機能追加に伴い、既存のコード修正が必要となるプログラムは変更しにくい
  • 複雑な条件分岐の多いプログラムは変更しにいくい

リファクタリングのコツ

  • 小さな単位で行うこと

    • 失敗する(バグを埋め込む)可能性を軽減できる
  • 新規追加の作業とリファクタリングの作業を同じ作業単位(コミット)で行ってはならない。必ず分けること

    • バグ発生時、バグ発生個所の特定が難しい (新規追加部分が原因か、リファクタリング部分が原因か・・・)
    • コード変更差分がとても見づらくなる (コード差分が新規追加の差分なのか、リファクタリングの差分なのかすぐに判別不可能)

リファクタリングトピック集

巨大なクラス

1つのクラスがあまりにも多くの仕事をしている場合は、たいていインスタンス変数を持ちすぎています。
インスタンス変数が多すぎると、重複コードが存在する可能性が高くなります

巨大クラスをクラス抽出で爆散 - nprogram’s blog

長すぎるパラメータリスト

  • メソッドによるパラメータの置き換え(P.292)
    • 既知のオブジェクトに問い合わせることでパラメータのデータの1つを取得できる
  • オブジェクトそのものの受け渡し (P.288)
    • データをばらばらに渡さずにオブジェクトそのものを渡すようにできます
  • 論理的なオブジェクトとしてデータの集まりを表現できない場合
    • パラメータオブジェクトの導入 (P.295)

switch文に気をつけろ

他のオブジェクトの属性を調べるswitch文処理を書くことは常に間違いである。

switch文処理は、他のオブジェクトについてではなく、自分自身のオブジェクトの情報について行うべきである。

switch文を爆散 - nprogram’s blog

データの群れ

数個のデータがグループとなって、クラスのフィールドやメソッドのシグニチャなど、さまざまな箇所に現れることがあります。

こうした群れをなしたデータはオブジェクトとして、1つにまとめるべき。

属性や操作のパラメータの数を絞り込むことはコードの不吉なにおいをなくすのに役立ちます。

特性の横恋慕

処理の際に、他のオブジェクトのgetメソッドを何度も何度も呼び出している間違ったメソッドがよく見受けられる

処理、および処理に必要なデータを1つにまとめる

あとがき

本の格言は素晴らしいと思います。

  • コンパイラが理解できるコードは誰にでも書ける。優れたプログラマは、人間にとってわかりやすいコードを書く
  • 新規追加の帽子とリファクタリングの帽子を同時にかぶるな