リファクタリング
TOC
- 現状の問題点
- なぜか?
- 開発スピードをあげるにはどうするか?
- なにができるか?
- どう実践すればいいのか?
- プログラムは完成しない
- リファクタリングしやすいコード
- SOLID の原則
- オブジェクト指向プログラミング
- プロトコル指向プログラミング
現状の問題点
なぜか?
- 意図の分かりづらいコードが多い
- ライブラリへの依存が多くの箇所にまたがっている
- ライブラリの破壊的なアップデートに対応できない
- 新しいライブラリへの変更が難しい
- 同じ処理が複数の箇所に散乱している
- 変更時の影響範囲を把握しづらい
開発スピードをあげるにはどうするか?
- 機能追加・変更を容易にする
- 変更に対する強度をあげる
- 環境の変化に対応する
なにができるか?
どう実践すればいいのか?
- テストの書きやすいコードを書く
- リファクタリングのしやすいコードを書く
テストを書く目的とは?(前フリ)
書いたコードにバグがないことを保証するため?
- テストでバグが見つかることは少ない
- テストコードを書いているエンジニアがテストしたいことしかテストできない
- プロダクションコードを書いているエンジニアがテストするのであれば、なおさら想定通りに動くコードを想定通りにテストしてしまう
「テストの書きやすいコードを書く」とは、テストを書くことが目的ではない
テストを書く目的とは?(本題)
追加・変更・リファクタリングが容易になっていれば、テストなしでも担保できる強度がある
-> 設計する
なぜ将来変更されるコードを設計をするのか
- 将来変更されるからこそ、設計する
- 変更していいこと・変更してはいけないことを設計する
- 設計を確認すれば、影響範囲や意図を知ることができる
- 変更ではなく、追加・削除が正しいという判断ができるかも
リファクタリング の目的とは?
-
ソフトウェア開発環境の変化に対応するため
- 変化に乗り遅れたプログラムはユーザーの期待に応えられない
- ex. iOS14 で追加されるウィジェット・App Clips
-
アーキテクチャを柔軟に変更するため
プログラムは完成しない
ソフトウェア開発環境は常に変化している
- 高度なビジネス要件
- 新しい技術・機能
- 新しいアーキテクチャ
- ライブラリサポートの終了
機能変更や追加があるかぎり、リファクタリングを続ける
-> リファクタリングを続けるためには、リファクタリングしやすいコードにしておくべき
リファクタリングしやすいコード
リファクタリングしやすいコードを書くためにいくつかの原則を知っておくとやりやすい
SOLID の原則
S: Single Pesponsibility Principle(単一責任の原則)
単一のアクター(ユーザー・クラス・データベース・etc...)に対してだけ機能を提供できるように分割する
変更する理由が同じものは集める、変更する理由が違うものは分ける。
参考: 単一責任原則
O: Open/Closed Principle(オープン/クロースドの原則)
拡張に対してオープン、変更に対してクローズド
主に機能追加時には、クラスの内部実装を変更するのではなく拡張する
L: Liskov Substitution Principle(リスコフの置換原則)
型 T と 派生型 S がある時、プログラム内で T 型のオブジェクトが使われている箇所は全て S 型のオブジェクトで置換可能
T 型のオブジェクトが使われている箇所では T の振る舞いだけを許可する
I: Interface Segregation Principle(インターフェース分離の原則)
インターフェースの利用者(実装クラス)にとって不要なメソッドに依存させてはいけない
D: Dependency Inversion Principle(依存性逆転の原則)
依存対象の実装を知るのではなく、抽象に依存する
オブジェクト指向プログラミング
クラスはデータとデータを扱うメソッドをもつ
カプセル化
継承
多態性(ポリモーフィズム)
アドホック多相
パラメータ多相
部分型付け
他
メッセージパッシング
遅延バインディング
プロトコル指向プログラミング