will and way

ただの自分用メモを人に伝える形式で書くことでわかりやすくまとめてるはずのブログ

レガシーコード改善ガイド1〜5

1、ソフトウェアの変更

変更は4種類

機能追加
バグ改修
設計改善
リソース利用の最適化

機能追加と改善は紙一重だが現場では分けなければならないケースが多い。この議論は現場で様々

ソフトウェアで一番重要なのは振る舞い。

コードの変更で振る舞いが変わるか否かが重要。
変更の影響の把握が非常に大変であるが、振る舞いを変えないためには重要。

既存の振る舞いを変えずに設計を改善することをリファクタリングという

2、フィードバックを得ながらの作業

「変更して祈る」のリスクは、注意力を高めても、結果が比例しないこと。

ツールとしてテストを使う。

テストは変更を見つけるためとしても使える。
テストはライトに出来るようにしておく。

単体テストは関数、クラスレベルの粒度でたてる。

テストハーネスとは

テスト用に動かすために書くコード

優れたテストの条件

* 実行が速い
* 問題箇所が特定しやすい
* ロジック部分がテストに近い
* 1メソッド1機能に気をつけてるとよろしい

単体テストに含まれない条件

* DBとやりとりする
* ネットワーク通信が有る
* ファイルシステムにアクセスする
* 環境設定を必要とする

上記の理由は外部の要素に依存するため、実行環境に依ってテスト結果が変わる可能性があり
テストの根本目的であるコードの保護がされてない状態になるためである。

他のコードとの依存関係を取り除くには

依存部分をインターフェース化してモックを使えるようにする

レガシーコードの変更手順

1. 変更点を洗い出す
2. テストを書く場所を見つける
3. 依存関係を排除
4. テストを書く
5. 変更とリファクタリング
注目すべきは、変更とリファクタリングが最後であるということ

3、検出と分離

検出→コードの計算した値にアクセス出来ない時に、それを検出するために依存関係を排除する。
分離→コードをテストハーネスに入れて実行すらできない時、分離するために依存関係を排除する

検出のためのTips

目的:テストしたい対象があり、その対象の役割にフォーカスする。そして他との依存関係を排除する。

擬装オブジェクト
呼び出しをインターフェース化し、実際テストに使われるオブジェクトは同じインターフェースの全くの別物を使う。
副産物として、別物はテスト用なのでテストのためのメソッドを準備しても構わない。内部的にロギングさせたり。

4、接合部

接合部とはその場所を直接変更しなくとも、振る舞いをかえられるポイント
本番環境では実行されるべきだがテストでは実行されて欲しくないところのモッキングが厳しい場所や、
ポリモーフィズムを使いたいポイントでかなり有効に使うことが出来る。

接合部の種類

1. プリプロセッサ接合部
2. リンク接合部→プロパティファイルなど。
3. オブジェクト接合部javaはほぼこれ。

5、ツール

スキップ