レガシーコード改善ガイド読書会 第10章
DESCRIPTION
レガシーコード改善ガイド読書会第10章TRANSCRIPT
1
楽天株式会社 開発部 アーキテクトGよしおかひろたか |2023年4月12日
よしおかひろたかレガシーコード改善ガイド
読書会、第 10章
2
No TEST, No LIFE
3
No TEST, No LIFE 第 10章
• このメソッドをテストハーネスで動かすことができません– そのメソッドにテストからアクセスできな
い。メソッドが private など– メソッド呼び出しに必要なパラメータの生
成が困難。– メソッドに悪い副作用がある( DB の更
新)– メソッドが使うオブジェクトについて事前
に検出を行う必要がある
4
No TEST, No LIFE 隠れたメソッド
• private メソッドのテスト方法– public メソッドを通じたテストが可能か?
• 利点:実際のコードと同じ方法でテストできる• 作業量を少し抑えることができる
– private メソッドを public メソッドに変えてしまう。• 副作用がある:そのクラスの他のメソッドの結果に悪影響を
及ぼす可能性がある• 対処法:新しいクラスに移動させ public メソッドにする• 議論:よい設計はテスト可能であり、テストができないのは
悪い設計である。• 変更のステップ
– private から protected へ– 当該クラスのサブクラスを作る– public なインターフェースを公開する
5
No TEST, No LIFE 言語の「便利な」機能
• C# においてインスタンスもサブクラスも作れない機能 (sealed) がある。 Java には同様な機能 (final) がある。
• 間違い:制御不可能なライブラリに直接依存したこと
• いつの日かテストを支援するような機能をプログラミング言語が用意してくれるかもしれないが…
• お勧め: sealed や final は控えめに使う
6
No TEST, No LIFE 検出できない副作用
• 他のオブジェクトを使わないオブジェクトはめったにない
• GUI に依存する処理から、 GUI に直接関係しない処理を分離する
• コマンドメソッド、クエリーメソッドを作っていく。– コマンド ( オブジェクトの状態を変更できる)
とクエリー(オブジェクトの状態を変更できない、値を返す)を分離する
7
No TEST, No LIFE 依存関係を排除する手法
• 静的メソッドの公開• メソッドオブジェクトの取り出し• インタフェースの抽出• 実装の抽出• パラメータの適合• コンパイラまかせ• API をラップする• メソッドの抽出• サブクラス化とメソッドのオーバーライド