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

873 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
873
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

  1. 1. 第7章 いつまでたっても変更作業が終わりません Takahiro Okada レガシーコード改善ガイド読書会
  2. 2. 変更は素早く行えるほど よいという話
  3. 3. そもそも、変更の理由とは?
  4. 4. •変更の理由 –バグ修正 –機能追加 –仕様変更 –リファクタリング
  5. 5. •変更の理由 –バグ修正 –機能追加 日々の業務 –仕様変更 –リファクタリング
  6. 6. われわれの日々の業務は、コードの変更である。
  7. 7. 仕事を速く行うには?
  8. 8. 仕事を速く行うには?→ 変更を速く行う。
  9. 9. 変更は素早く行えるほど よい
  10. 10. 小休止(ここまでOK?)
  11. 11. 変更は素早く行えるほど よい
  12. 12. 現実には…
  13. 13. 「いつまでたっても 変更作業が 終わりません」
  14. 14. なぜ?
  15. 15. なぜ?1. コードの内容が 理解出来ない。2. 変更を行なってから、 結果を得るまでに時間がかかる。 他にあるかな・・・?
  16. 16. 1. コードの内容が 理解出来ない。
  17. 17. 1. コードの内容が理解出来ない• 変更方法を調査するのに時間がかかる。 – ある程度はしかたないこと。 – ただし、整理されたコードのほうが時間は短い。• 変更自体に時間がかかる。 – レガシーコード特有の問題
  18. 18. 1. コードの内容が理解出来ない• 変更方法を調査するのに時間がかかる。 – ある程度はしかたないこと。 – ただし、整理されたコードのほうが時間は短い。• 変更自体に時間がかかる。 – レガシーコード特有の問題→「小さく、理解しやすく、適切なパーツに分割 されたシステム」
  19. 19. 1. コードの内容が理解出来ない• 変更方法を調査するのに時間がかかる。 – ある程度はしかたないこと。 – ただし、整理されたコードのほうが時間は短い。• 変更自体に時間がかかる。 – レガシーコード特有の問題→「小さく、理解しやすく、適切なパーツに分割 されたシステム」→どうすればいい?
  20. 20. 詳細は後日→第16章「変更できるほど十分に私 はコードを理解していません」→第17章「私のアプリケーションには 構造がありません」
  21. 21. 2. 変更作業を行なって から、結果を得るま でに時間がかかる 今日はこっちが本題
  22. 22. 2. 変更作業を行なってから、結果を得 るまでに時間がかかる変更できた!コンパイルリンクパッケージングインストールテスト
  23. 23. 2. 変更作業を行なってから、結果を得 るまでに時間がかかる変更できた! フルビルドして 40分コンパイルリンクパッケージングインストールテスト
  24. 24. 2. 変更作業を行なってから、結果を得 るまでに時間がかかる変更できた! フルビルドして 40分コンパイル Flash image作って 10分リンクパッケージングインストールテスト
  25. 25. 2. 変更作業を行なってから、結果を得 るまでに時間がかかる変更できた! フルビルドして 40分コンパイル Flash image作って 10分リンク Boardに焼いて 10分パッケージングインストールテスト
  26. 26. 2. 変更作業を行なってから、結果を得 るまでに時間がかかる変更できた! フルビルドして 40分コンパイル Flash image作って 10分リンク Boardに焼いて 10分パッケージングインストール Manual testして 30分テスト
  27. 27. 2. 変更作業を行なってから、結果を得 るまでに時間がかかる変更できた! フルビルドして 40分コンパイル Flash image作って 10分リンク Boardに焼いて 10分パッケージングインストール Manual testして 30分テスト やっぱりダメだった!
  28. 28. 2. 変更作業を行なってから、結果を得 るまでに時間がかかる変更できた!コンパイルリンクパッケージング 10秒以内に!インストールテスト
  29. 29. でも、どうやって?
  30. 30. 小休止(ここまでOK?)
  31. 31. どうやって確認作業を早くする?
  32. 32. どうやって確認作業を早くする?依存関係を排除する
  33. 33. コンパイル・リンク範囲の減少差分パッケージング/インストール テスト範囲の減少 テストハーネスの使用依存関係を排除する
  34. 34. コンパイル・リンク範囲の減少差分パッケージング/インストール テスト範囲の減少 テストハーネスの使用 速い
  35. 35. まとめると 依存関係を排除する 速い
  36. 36. 依存関係を排除する 1テストにおける依存関係を排除する。
  37. 37. テスト時の依存関係を排除する• テストハーネスで必要なクラスのインスタンス 化を試みる。• すなわち、テストに必要な周辺のクラスはす べて、テストハーネスで作成する。
  38. 38. テストハーネスで必要なクラスの インスタンス化を試みる。• 速度向上ポイント1 – コンパイル・リンクの速度が向上する。• 速度向上ポイント2 – テストの速度が向上する。 – 外部リソース(DB / Network / HW etc)の呼び出し 時間を短縮できる。
  39. 39. テストハーネスで必要なクラスの インスタンス化を試みる。インスタンス化できない?
  40. 40. テストハーネスで必要なクラスの インスタンス化を試みる。インスタンス化できない?→第9章 「このクラスをテストハーネスに入れることができません」→第10章 「このメソッドをテストハーネスで動かすことができません」
  41. 41. 依存関係を排除する 2ビルドにおける依存関係を排除する。
  42. 42. そのまえに、小休止 (ここまでOK?)
  43. 43. 依存関係を排除する 2ビルドにおける依存関係を排除する。
  44. 44. ビルド時の依存関係を排除するインターフェースを抽出する。
  45. 45. インタフェースの抽出(1/3) Before
  46. 46. インタフェースの抽出(2/3) After
  47. 47. インタフェースの抽出(3/3)1. 適切な名前のインターフェースを作成する。2. 抽出対象のクラスで、インタフェースを実装 する3. 変更対象オブジェクトの使用箇所を変更して、 クラスの代わりにインターフェースを呼び出 すようにする。4. コンパイルする。コンパイルで出たエラーを 取り除く。
  48. 48. ビルド時の依存関係を排除する実装を抽出する。 名前を変えたくない場合など
  49. 49. 実装の抽出(1/2) Before
  50. 50. インタフェースの抽出(2/2) After
  51. 51. 小休止(次はちょっと長い)
  52. 52. 実践してみよう
  53. 53. こいつをビルドしたいだけなのに
  54. 54. こいつをビルドしたいだけなのに依存しているこいつもビルドしないと
  55. 55. こいつをビルドしたいだけなのに依存しているこいつもビルドしないとしかも、テストの際にDB接続必要?
  56. 56. こいつをビルドしたいだけなのに依存しているこいつもビルドしないとしかも、テストの際にDB接続必要?さらに、こいつが別クラスに依存してて・・・
  57. 57. これは遅い。
  58. 58. 実装を抽出する。
  59. 59. これで、ビルドが速くなったココ ちなみに、Implっていう 名前はどうなの?
  60. 60. これで、テストも速くなったこれで、ココ
  61. 61. もっとやりたい? ココ やりすぎはほどほどに。
  62. 62. コンパイラのファイアウォール
  63. 63. コンパイラのファイアウォール
  64. 64. コンパイラの ファイアウォール素早く変更し放題
  65. 65. コンパイラの ファイアウォール素早く変更し放題
  66. 66. これでおわり?
  67. 67. よく見るとまだ依存が。
  68. 68. 依存を取り除く
  69. 69. 小休止(ここまでOK?)
  70. 70. ひとことででまとめると
  71. 71. 具象クラスに依存するよりもインタフェースや抽象クラスに依存すべし
  72. 72. いいかえると
  73. 73. 変更の少ないものに依存すべし
  74. 74. 確かに全体をビルドする時間は 増えるかもしれない
  75. 75. けど、部分をビルド/テストする時間は 大幅に減るはず
  76. 76. 構造が見えにくくなるかもしれないが
  77. 77. 妥当なオーバーヘッド である。 ほんとかな
  78. 78. パッケージ間のインターフェースをすべて抽象型にすると、何が起こるだろう?
  79. 79. おわり しかし、この本、 章と章の間の依存が強すぎて、 読むのがちょっと辛い。

×