リファクタリング 第2章

621 Views

February 27, 23

スライド概要

輪読会用の資料です。

輪読書は「リファクタリング(第2版) Martin Fowler (著)」です。

profile-image

サーバーサイドエンジニア Webアプリケーションの開発・運用業務を行なっています。 PHP, Node.jsなど。

シェア

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

2022/03/03 リファクタリング 第2章(社内勉強会用資料) 矢島 達朗 第2版

2.

自己紹介 名前 矢島 達朗(Tatsuro Yajima) 趣味 ● 写真 ○ ● 散歩ついでに、雲とかビルとかを撮影してます。 ベース ○ YouTube の音楽に合わせて弾いたりしてます。 最近やってること ● ● GraphQL の勉強 Next.js でブログ作成

3.

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

4.

リファクタリングとは何か?

5.

リファクタリングの定義 1 リファクタリング(名詞) 外部から見た時の振る舞いを保ちつつ、理解や修正が簡単になるように、 ソフトウェアの内部構造を変化させること。 2 リファクタリングする(動詞) リファクタリングを適用して、外部から見た振る舞いの変化なしに、ソフトウェ アを再構築すること。

6.

Q. なぜリファクタリングが必要なのか?

7.

A. コードの理解や修正を容易にするため

8.

振る舞いは変えず、コードの質を上げる!

9.

振る舞いが変わらない、とはどういうことか? ● インプット & アウトプット ○ 変わらない ● 処理速度 ○ 変わるかもしれない ○ 速くなったり、遅くなったりする ● バグ ○ 修正しない

10.

開発とリファクタリングは、分けて行う 『2つの帽子』 開発時 リファクタリング時

11.

理想の流れ ① 機能Aの開発 (テストまで実装する) ② リファクタリング (テストOK) ③ 機能Bの開発 (テストまで実装する) ④ リファクタリング (テストOK) ・・・

12.

Q. 誰のためにリファクタリングするのか?

13.

A. 将来の開発者のため

14.

将来の開発者の負担を減らす 将来コードを触る開発者のために、例え少しだけ処理速度が落ちたとして も、わかりやすい記述をすべき。 ※ 開発者の中には、自分自身も含まれます!

15.

リファクタリングのメリット

16.

リファクタリングのメリット① バグの発見を助けられる! コードが理解しやすい = バグを見つけやすい

17.

リファクタリングのメリット② 開発速度が上がる! 詳細は次ページ →

18.

リファクタリングをすると開発速度が上がる https://martinfowler.com/bliki/DesignStaminaHypothesis.html

19.

いつリファクタリングすべきか

20.

三度目の法則 1. 開発する 2. 「この処理、前も書いたな」と気付く 3. 「この処理書くの、3回目だな」と気付く a. ↑ここでリファクタリング開始!

21.

3種類のリファクタリング

22.

1. 準備のためのリファクタリング

23.

1. 準備のためのリファクタリング 将来的な変更に備えるためのリファクタリング。 【例】 ● リテラル、マジックナンバーを排除 ● 重複している処理をメソッド化

24.
[beta]
Before(メインルーチン内で処理が重複している)

switch ($result) {
case self::TYPE_1:
$result[message] .= "({$result['message_for_type_1']})";
break;
case self::TYPE_2:
$result[message] .= "({$result['message_for_type_2']})";
break;
}

25.
[beta]
After(メソッドを定義することで、処理を分離)

$result['message'] = $this->getMessage($result['result_code'], $result['messages']);
// ----- 中略

-----

private function getMessage(int $resultCode, array $messages):string {
switch ($resultCode) {
case self::TYPE_1:
return "({$messages['message_for_type_1']})";
break;
case self::TYPE_2:
return "({$messages['message_for_type_2']})";
break;
}
}

26.

2. 理解のためのリファクタリング

27.

2. 理解のためのリファクタリング そこでどんな処理をしているかを理解するためのリファクタ リング。 【例】 ● 適切な変数名をつける ● 長いメソッドを分割する

28.

Before(変数名、メソッド名がわかりづらい) $data = fetchData($id); $isExists = false; $count = 0;

29.

After $orderDataArray = fetchOrderData($orderId); $isExistsInvalidOrder = false; $invalidOrderCount = 0; 注文データを取得し、想定通りの値かをチェックする処理を行う、と予想できる。

30.

3. ゴミ拾いのためのリファクタリング

31.

3. ゴミ拾いのためのリファクタリング 手をつけたコードの周辺を少しでも綺麗にしておく ためのリファクタリング。 【例】 ● タイポ修正 ● 入り組んだロジックをシンプルに書き直す

32.
[beta]
Before(タイポあり。処理もわかりづらい)

$this->setConfition($conditions, $postedData);
private function setConfition(&$conditions, $postedData)
{
foreach ($postedData['orderIdArray'] as $orderId) {
$conditions[][$orderId] = $postedData['conditions'];
}
}

33.
[beta]
After(タイポ修正&処理をわかりやすくした)

$conditions[] = $this->setCondition($postedData);
private function setCondition(array $postedData): array
{
foreach ($postedData['orderIdArray'] as $orderId) {
$conditions[$orderId] = $postedData['conditions'];
}
return $conditions;
}

34.

ここまでのまとめ ソフトウェアが「完成」することはない。 いつか修正する日のために、 変更しやすい状態を保つことが大事。

35.

リファクタリングの問題点

36.

リファクタリングは、(短期的な)開発 時間とのトレードオフが発生する。

37.

リファクタリングを後回しにしても良いケース 1. 些細な機能追加 2. めったに触らない & 不便さを感じていない箇所 かけた時間と効果が見合わないことが想定される。

38.

注意点 リファクタリングは、純粋に経済的な基準で測られるもので ある。 下記のような思考はNG ● 美しいコードを書くためにリファクタリングする ● リファクタリングはエンジニアの責務である

39.

リファクタリングとテスト

40.

リファクタリングは、 自動テスト と深い関わりがあります。

41.

リファクタリングの前にテストを書くことが大事。 テストがあれば、振る舞いの変化にすぐ気付ける。

42.

リファクタリングとアーキテクチャ、Yagni

43.

その昔 設計・アーキテクチャを完成させてから、開発を行う。

44.

現代 リファクタリングにより、設計・アーキテクチャは 柔軟に変更可能

45.

ウォーターフォールの問題点 「ソフトウェアの要求は事前に把握できる」 という前提に立ってしまうこと! 実際に作ってみないとわからないことも多い。

46.

Yagni

47.

Yagni (You aren’t going to need it! ) ● 要求は変わる ● 必要になったら作る ● シンプルに、必要なものだけ作る

48.

関連ワード ● アジャイル開発 ● CI/CD ● KISS原則(Keep it simple, stupid.)

49.

リファクタリングとパフォーマンス

50.

パフォーマンスとの関連 リファクタリングは、パフォーマンスを落とす可能性もある。 リファクタリングとチューニングは、分けて考えること。 リファクタリングしておけば、チューニングもやりやすくなる。

51.

パフォーマンスで大事なこと 推測ではなく、計測すべき! ↓の流れがおすすめ パフォーマンスは気にしない! 1. 開発 2. リファクタリング 3. 計測しながら、チューニング リファクタリング後なので、 チューニングしやすい!

52.

まとめ

53.

第2章 リファクタリングの原則 まとめ ● なぜリファクタリングをするの? ○ 処理をわかりやすく、変更を容易にするため ● 2つの帽子を交互にかぶる ● リファクタリングのためには自動テストが必要 ● チューニングは別途行う

54.

ご静聴ありがとうございました! Martin Fowler氏 (Wikipedia)