80
7いつまでたっても 変更作業が終わりません Takahiro Okada レガシーコード改善ガイド読書会

レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

Embed Size (px)

Citation preview

Page 1: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

第7章 いつまでたっても 変更作業が終わりません

Takahiro Okada

レガシーコード改善ガイド読書会

Page 2: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

変更は

素早く行えるほどよいという話

Page 3: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

そもそも、

変更の理由とは?

Page 4: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

•変更の理由

–バグ修正

–機能追加

–仕様変更

–リファクタリング

Page 5: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

•変更の理由

–バグ修正

–機能追加

–仕様変更

–リファクタリング

日々の業務

Page 6: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

われわれの

日々の業務は、

コードの変更である。

Page 7: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

仕事を速く行うには?

Page 8: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

仕事を速く行うには?

→ 変更を速く行う。

Page 9: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

変更は

素早く行えるほどよい

Page 10: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

小休止 (ここまでOK?)

Page 11: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

変更は

素早く行えるほどよい

Page 12: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

現実には…

Page 13: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

「いつまでたっても

変更作業が

終わりません」

Page 14: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

なぜ?

Page 15: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

他にあるかな・・・?

なぜ?

1. コードの内容が

理解出来ない。

2. 変更を行なってから、

結果を得るまでに時間がかかる。

Page 16: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

1. コードの内容が

理解出来ない。

Page 17: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

1. コードの内容が理解出来ない

• 変更方法を調査するのに時間がかかる。

–ある程度はしかたないこと。

–ただし、整理されたコードのほうが時間は短い。

• 変更自体に時間がかかる。

–レガシーコード特有の問題

Page 18: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

1. コードの内容が理解出来ない

• 変更方法を調査するのに時間がかかる。

–ある程度はしかたないこと。

–ただし、整理されたコードのほうが時間は短い。

• 変更自体に時間がかかる。

–レガシーコード特有の問題

→「小さく、理解しやすく、適切なパーツに分割されたシステム」

Page 19: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

1. コードの内容が理解出来ない

• 変更方法を調査するのに時間がかかる。

–ある程度はしかたないこと。

–ただし、整理されたコードのほうが時間は短い。

• 変更自体に時間がかかる。

–レガシーコード特有の問題

→「小さく、理解しやすく、適切なパーツに分割されたシステム」

→どうすればいい?

Page 20: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

詳細は後日

→第16章「変更できるほど十分に私はコードを理解していません」

→第17章「私のアプリケーションには構造がありません」

Page 21: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

今日はこっちが本題

2. 変更作業を行なってから、結果を得るまでに時間がかかる

Page 22: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

2. 変更作業を行なってから、結果を得るまでに時間がかかる

変更できた!

コンパイル

リンク

パッケージング

インストール

テスト

Page 23: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

2. 変更作業を行なってから、結果を得るまでに時間がかかる

変更できた!

コンパイル

リンク

パッケージング

インストール

テスト

フルビルドして 40分

Page 24: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

2. 変更作業を行なってから、結果を得るまでに時間がかかる

変更できた!

コンパイル

リンク

パッケージング

インストール

テスト

フルビルドして

Flash image作って 10分

40分

Page 25: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

2. 変更作業を行なってから、結果を得るまでに時間がかかる

変更できた!

コンパイル

リンク

パッケージング

インストール

テスト

フルビルドして

Flash image作って

Boardに焼いて

10分

40分

10分

Page 26: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

2. 変更作業を行なってから、結果を得るまでに時間がかかる

変更できた!

コンパイル

リンク

パッケージング

インストール

テスト

フルビルドして

Flash image作って

Boardに焼いて

Manual testして

10分

40分

10分

30分

Page 27: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

2. 変更作業を行なってから、結果を得るまでに時間がかかる

変更できた!

コンパイル

リンク

パッケージング

インストール

テスト

フルビルドして

Flash image作って

Boardに焼いて

Manual testして

やっぱりダメだった!

10分

40分

10分

30分

Page 28: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

2. 変更作業を行なってから、結果を得るまでに時間がかかる

変更できた!

コンパイル

リンク

パッケージング

インストール

テスト

10秒以内に!

Page 29: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

でも、どうやって?

Page 30: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

小休止 (ここまでOK?)

Page 31: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

どうやって 確認作業を早くする?

Page 32: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

どうやって 確認作業を早くする?

依存関係を排除する

Page 33: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

コンパイル・リンク範囲の減少 差分パッケージング/インストール

テスト範囲の減少 テストハーネスの使用

依存関係を排除する

Page 34: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

コンパイル・リンク範囲の減少 差分パッケージング/インストール

テスト範囲の減少 テストハーネスの使用

速い

Page 35: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

速い

依存関係を排除する

まとめると

Page 36: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

依存関係を排除する 1

テストにおける

依存関係を排除する。

Page 37: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

テスト時の依存関係を排除する

• テストハーネスで必要なクラスのインスタンス化を試みる。

• すなわち、テストに必要な周辺のクラスはすべて、テストハーネスで作成する。

Page 38: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

テストハーネスで必要なクラスの インスタンス化を試みる。

• 速度向上ポイント1

– コンパイル・リンクの速度が向上する。

• 速度向上ポイント2

–テストの速度が向上する。

–外部リソース(DB / Network / HW etc)の呼び出し時間を短縮できる。

Page 39: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

テストハーネスで必要なクラスの インスタンス化を試みる。

インスタンス化できない?

Page 40: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

テストハーネスで必要なクラスの インスタンス化を試みる。

インスタンス化できない? →第9章

「このクラスをテストハーネスに入れることができません」 →第10章 「このメソッドをテストハーネスで動かすことができません」

Page 41: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

依存関係を排除する 2

ビルドにおける

依存関係を排除する。

Page 42: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

そのまえに、小休止 (ここまでOK?)

Page 43: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

依存関係を排除する 2

ビルドにおける

依存関係を排除する。

Page 44: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

ビルド時の依存関係を排除する

インターフェースを

抽出する。

Page 45: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

インタフェースの抽出(1/3)

Before

Page 46: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

インタフェースの抽出(2/3)

After

Page 47: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

インタフェースの抽出(3/3)

1. 適切な名前のインターフェースを作成する。

2. 抽出対象のクラスで、インタフェースを実装する

3. 変更対象オブジェクトの使用箇所を変更して、クラスの代わりにインターフェースを呼び出すようにする。

4. コンパイルする。コンパイルで出たエラーを取り除く。

Page 48: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

ビルド時の依存関係を排除する

実装を

抽出する。

名前を変えたくない場合など

Page 49: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

実装の抽出(1/2)

Before

Page 50: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

インタフェースの抽出(2/2)

After

Page 51: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

小休止 (次はちょっと長い)

Page 52: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

実践してみよう

Page 53: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません
Page 54: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

こいつをビルドしたいだけなのに

Page 55: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

こいつをビルドしたいだけなのに

依存しているこいつもビルドしないと

Page 56: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

こいつをビルドしたいだけなのに

依存しているこいつもビルドしないと しかも、テストの際にDB接続必要?

Page 57: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

こいつをビルドしたいだけなのに

依存しているこいつもビルドしないと しかも、テストの際にDB接続必要? さらに、こいつが別クラスに 依存してて・・・

Page 58: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

これは遅い。

Page 59: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

実装を抽出する。

Page 60: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

ココ

これで、ビルドが速くなった

ちなみに、Implっていう名前はどうなの?

Page 61: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

これで、 これで、テストも速くなった

ココ

Page 62: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

もっとやりたい?

ココ

やりすぎはほどほどに。

Page 63: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

コンパイラのファイアウォール

Page 64: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

コンパイラの ファイアウォール

Page 65: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

コンパイラの ファイアウォール

素早く変更し放題

Page 66: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

コンパイラの ファイアウォール

素早く変更し放題

Page 67: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

これでおわり?

Page 68: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

よく見ると まだ依存が。

Page 69: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

依存を取り除く

Page 70: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

小休止 (ここまでOK?)

Page 71: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

ひとことででまとめると

Page 72: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

具象クラスに 依存するよりも インタフェースや 抽象クラスに 依存すべし

Page 73: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

いいかえると

Page 74: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

変更の少ないものに依存すべし

Page 75: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

確かに

全体をビルドする時間は増えるかもしれない

Page 76: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

けど、部分を ビルド/テストする時間は

大幅に減るはず

Page 77: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

構造が見えにくく なるかもしれないが

Page 78: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

妥当なオーバーヘッド である。

ほんとかな

Page 79: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

パッケージ間の インターフェースを すべて抽象型に

すると、何が起こるだろう?

Page 80: レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません

おわり

しかし、この本、 章と章の間の依存が強すぎて、

読むのがちょっと辛い。