【cyberx読書会】リファクタリング 2012/02/06

33
第2章 リファクタリングの原則 リファクタリングの原則 2012/02/06 CyberX エンジニア 石川泰式

Upload: suguru-shirai

Post on 19-Jul-2015

1.571 views

Category:

Education


1 download

TRANSCRIPT

Page 1: 【CyberX読書会】リファクタリング 2012/02/06

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

2012/02/06CyberX エンジニア 石川泰式

Page 2: 【CyberX読書会】リファクタリング 2012/02/06

リファクタリングの原則

• リファクタリングの重要な原則を改めて振り返り,リファクタリングを実践する上での考慮点について見て行く.

Page 3: 【CyberX読書会】リファクタリング 2012/02/06

リファクタリングの定義(1)

• リファクタリング(名詞)• 外部から見たときの振る舞いを保ちつつ,理解や修正が簡単になるように,ソフトウェアの内部構造を変化させること

Page 4: 【CyberX読書会】リファクタリング 2012/02/06

リファクタリングの定義(2)

• リファクタリングする(動詞)• 一連のリファクタリングを行って,外部から見た振る舞いの変更なしに,ソフトウェアを再構築すること

Page 5: 【CyberX読書会】リファクタリング 2012/02/06

2つの帽子

• ソフトウェア開発でリファクタリングを使うときには,2つの活動に作業を区分すべき

Page 6: 【CyberX読書会】リファクタリング 2012/02/06

2つの帽子(1)

• 機能追加• 既存のコードを変更してはいけない• 機能を拡張することに専念する.• 作業の進度は,テストの追加と正常な実行結果によって測れる.

Page 7: 【CyberX読書会】リファクタリング 2012/02/06

2つの帽子(2)

• リファクタリング• リファクタリングをしている時は,機能追加は行わない

• 原則としてテストの追加はしない

Page 8: 【CyberX読書会】リファクタリング 2012/02/06

2つの帽子(まとめ)

• コードの構造がよくなったところで,機能追加を行う.

• 重要なのは,どちらの帽子をかぶっているかを常に意識しておくこと

Page 9: 【CyberX読書会】リファクタリング 2012/02/06

リファクタリングを行う理由

• リファクタリングがすべてのソフトウェアの問題を解決するわけではない

• 「銀の弾」は存在しない

Page 10: 【CyberX読書会】リファクタリング 2012/02/06

設計の向上

• リファクタリングなしでは,プログラムの設計は徐々に劣化する.

• 設計のまずいコードは,余計にコードを書くことになる.

• 重複の排除は優れた設計のポイント

Page 11: 【CyberX読書会】リファクタリング 2012/02/06

ソフトウェアを理解しやすくする

• 何を意味しているかを正確に表現することが重要

• コードの不明な部分を理解するのに役立つ

• より深いコードへの理解を得られる.

Page 12: 【CyberX読書会】リファクタリング 2012/02/06

バグを見つけ出す

• コードが理解出来るようになると,バグが見つけやすくなる.

• 「僕は,偉大なプログラマなんかじゃない.偉大な習慣を身につけたプログラマなんだ.」 (Kent Beck)

Page 13: 【CyberX読書会】リファクタリング 2012/02/06

より速くプログラミングできる

• 間違った設計でもしばらくは順調に開発できる.

• やがて設計のまずさが徐々に足をひっぱるようになる.

• リファクタリングが設計の劣化を防ぐ

Page 14: 【CyberX読書会】リファクタリング 2012/02/06

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

• リファクタリングは時間を決めて行うような活動ではない

• 何かを行うための手段としてリファクタリングが行われる.

Page 15: 【CyberX読書会】リファクタリング 2012/02/06

3度目の法則

• 最初は単純に作業を行う.• 2回目では重複や無駄を意識しつつも,とにかく作業を行う.

• 3度目同じようなことをしていると気づいたらリファクタリングする.

Page 16: 【CyberX読書会】リファクタリング 2012/02/06

リファクタリングのタイミング

• 機能追加時にリファクタリングを行う• バグフィックスの時にリファクタリングを行う.

• コードレビューの時にリファクタリングを行う.

Page 17: 【CyberX読書会】リファクタリング 2012/02/06

コードレビューについて

• 開発チームに知識を浸透することができる.

• 経験者による知識の共有• アイデアを引き出せる.• レビューは少人数で行うべき

Page 18: 【CyberX読書会】リファクタリング 2012/02/06

プログラムの2つの価値

• 今何ができるのか• 将来何ができるようになるのか

Page 19: 【CyberX読書会】リファクタリング 2012/02/06

理想的なプログラムとは

• コードが読みやすい• 1ヶ所にのみロジックが書かれている• 既存の動作に影響を与えない• 条件分岐が簡潔に表現できている

Page 20: 【CyberX読書会】リファクタリング 2012/02/06

管理者の説得方法

• 品質を気にする管理者なら,品質向上を強調する.

• スケジュールを気にする管理者なら,黙ってやる.リファクタリングすることにより開発速度が上がる.

Page 21: 【CyberX読書会】リファクタリング 2012/02/06

間接層とリファクタリング(1)

• 「コンピュータサイエンスは,間接層(indirection)を設けることであらゆる問題が解決できるという信念に基づいた学問である.」(Dennis Debruler)

Page 22: 【CyberX読書会】リファクタリング 2012/02/06

間接層とリファクタリング(2)

• ロジックの共有を可能にする.• 図と実装を独立して説明できる.• 変更を分離する.• 条件分岐をポリモーフィズムで表現する

Page 23: 【CyberX読書会】リファクタリング 2012/02/06

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

• データベース• インターフェースの変更• メソッド名を変更した場合は,古いメッソドを削除せずに,内部で新しいメソッドを呼ぶように変更する.

Page 24: 【CyberX読書会】リファクタリング 2012/02/06

リファクタリングしにくい設計(1)

• リファクタリングが容易な場合• あまり検討に時間をかけずに,とにかく単純な方法を採用する.

• 将来的な要求の可能性をすべてとらえきれていないとしても気にしない

Page 25: 【CyberX読書会】リファクタリング 2012/02/06

リファクタリングしにくい設計(2)

• リファクタリングが困難な場合• 時間を掛けて検討する.

Page 26: 【CyberX読書会】リファクタリング 2012/02/06

リファクタリングと設計(1)

• リファクタリングには,設計を補完する役割がある.

• 思いつくままコーディングして,ともかく動作させ,その後リファクタリングで形を整える.

Page 27: 【CyberX読書会】リファクタリング 2012/02/06

リファクタリングと設計(2)

• 「設計時には,順調に思考が進みますが,それは隙だらけなのです」 (Alistair Cockburn)

• すべてにおいて柔軟性を実現しようとすると,ソフトウェアが過度に複雑化し,保守が難しくなる.

Page 28: 【CyberX読書会】リファクタリング 2012/02/06

リファクタリングと設計(3)

• リファクタリングは,柔軟性を損なわずに設計をシンプルにする.

• リファクタリングを簡単に行えるという感覚が身につけば,柔軟な解決策をむやみに求めなくなる.

Page 29: 【CyberX読書会】リファクタリング 2012/02/06

何も作り出さないことにかけた時間

• システムが行っていることを十分に分かっているつもりでも,推測はやめて,まず実際に計測をすること.そこで何が本質かをつかむこと.十中八九,あなたの推測は間違っている.

Page 30: 【CyberX読書会】リファクタリング 2012/02/06

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

• ソフトウェアを理解しやすくするための変更は,しばしばプログラムの実行速度を落としてしまう.

Page 31: 【CyberX読書会】リファクタリング 2012/02/06

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

• ホットスポットに集中してパフォーマンスを改善する.

• 改善されなかった変更は元に戻す.• ユーザの満足する水準に達するまで,ホットスポットを見つけては退治していく.

Page 32: 【CyberX読書会】リファクタリング 2012/02/06

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

• 設計が明確なため,より速く機能改善でき,その分,最適化に割ける時間も増える.

• プログラムの設計が優れていると,パフォーマンス解析の際,より細かな単位へ集中することが可能になる.

Page 33: 【CyberX読書会】リファクタリング 2012/02/06

まとめ

• リファクタリングは銀の弾ではない.• リファクタリングは運用・変更をしやすくする為の方法