t0mmy

2020年12月30日に参加

学習履歴詳細

リファクタリング 第二版 1章 読了

やったこと

リファクタリング 第二版 1章 読了

学んだこと

リファクタリングは、人間のために行う。
優れたプログラマは、人間にとってわかりやすいコードを書く。

リファクタリングでやること

  • 小さな単位に分割する
  • フェーズを分割する
  • ポリモーフィズムを駆使して処理を動的に変化させる

(順不同だけど、上からやる方がやりやすそう。また、対応済みだったり対応不要だったりする場合はスキップする)

小さな単位に分割する

長い処理を、意味のある小さな単位に分割する。

関数化を駆使するとやりやすい。

...
let thisAmount = ...; // 長い長い処理
...
const amountFor = () => {...}; /// 長い長い処理を関数化
...
let thisAmount = amountFor();
...

ローカル変数は、「小さな単位に分割する」際の障害になりやすい。
ローカル変数の排除を心掛けてリファクタリングしていくと、小さな単位に分割しやすい。 (=> 変数のインライン化)

フェーズを分割する

小さな単位に分割したコンポーネントを、取り回しの効くような意味のある単位にまとめていく。

この時、最も大雑把なまとめ方として、「入力処理」「計算」「出力処理」がある。

ポリモーフィズムを駆使して処理を動的に変化させる

成し遂げたいこと(例: 料金を計算する)は同じだけど、分類によって計算ロジックを変化させたい(例: 通常価格、特売価格、会員価格など)ような状況。
計算ロジックをサブコンポーネントに委譲し、メインロジックを親コンポーネントでまとめ上げる... といった設計を行う。
これを実現するキーワードの一つが ' ポリモーフィズム ' 。

リファクタリングの第一歩

  • テストを作成する
  • リファクタリングの度にコミットする
  • 変数、関数などに、適切な名前を付ける

テストを作成する

リファクタリングによるコードの変更よって、新たにバグ(≒振る舞いが変化してしまうこと)が混入する事は十分考えられる。
このバグを早期に発見するためには、「振る舞いが変化していないこと」を検証する手段が必要。
テストは、この検証手段に相当する。

テストを作成することで、「振る舞いが変化していないこと」を常に確認できる。
振る舞いが変化していたとしても、それは「テスト失敗」という形である程度検知できる。

リファクタリングの度にコミットする

リファクタリングに成功(≒コードを修正して、テストもパス)したタイミングでコミットする。
小さな単位でコミットしておくことで、万が一リファクタリングに失敗した場合でも、動いていた状態に戻すことが出来る。
コミット単位が小さいと、コードのロールバック量が少なくなり、開発効率が上がる。

意味のある単位としてまとまったてから、共有のリポジトリに変更をプッシュすると良い。

変数、関数などに、適切な名前を付ける

適切な名前を付けられた変数は、中身の値が容易に特定できる。
適切な名前を付けられた関数は、中身の処理が容易に想像できる。

名前が適切であれば、「コードを読んで中身を理解する」手間を省く。
開発効率の向上に寄与すると同時に、バグの発生を防ぐことにもつながる。

良いコードとは

好みによる部分も大きいが、「どれだけ変更が容易か」(≒どれだけソフトか)という視点は、共通してそう。

コーディング

2024年08月25日(日)

2.0時間