「コードカーペンター」は、仕様書もテストも無い古いコードに、壊さずに手を入れる12の技法を、古い木造建築の修復工事として描く連載です。素屋根の下で、棟梁のクロベさんと弟子のナギさんが、住人を追い出さずに建物を直していきます。語り手は、その建物を三十年守ってきた管理人のシオリさんです。全12回、実装は素の Perl で、コアモジュールの Test::More だけで確かめます。
このページは目次を兼ねた案内板です。初めてなら「まず読むなら」の3本から、いま困っていることが決まっているなら「困りごとから探す」から、順に通して読むなら「全話一覧」から選んでください。
まず読むなら
- Characterization Test — 仕様もテストも無いコードに触る前に、今出ている出力をそのまま期待値にして固定する回。古いコードに手を入れるなら、最初に当たる作業
- Sprout Method — 巨大な既存関数に書き足さず、新しい処理を別に作って呼び出し1行だけ足す回。明日からの機能追加にそのまま使える
- Pinch Point — 単体テストは緑なのに全体が壊れるとき、影響が集まる1か所にテストを1本置く回。テストを足す場所に迷っているなら
困りごとから探す
手を入れる前に、今の動きを押さえたい
- Characterization Test — 仕様も期待値も無い。今の挙動をそのままテストに書き写す
- Effect Sketch — 変更がどこまで響くか分からない。響く先を図に描いて、テストを置く場所を絞る
- Pinch Point — 単体テストは全部緑なのに、締め処理が壊れる。影響が集まる1か所を守る
テストを書こうにも、差し替える場所が無い
- Seam — 本体を書き換えずに差し替えたい。
localで関数をテストの間だけ置き換える - Extract and Override Call — テストのたびに外部 API を叩いてしまう。呼び出しを切り出して、サブクラスで差し替える
- Parameterize Constructor — 組み立てた途端に本番の帳簿ファイルを開く。依存を外から渡せる形にする
- Introduce Instance Delegator — 関数名を揃えたらモックが効かなくなった。差し替えを、渡すオブジェクトで決める
既存のコードに触れずに機能を足したい
- Sprout Method — 巨大な関数に書き足したくない。新しいメソッドを別に作り、呼び出し1行だけ足す
- Sprout Class — テストで組み立てられないクラスに足したい。新しいクラスを起こして委譲する
- Wrap Method — 呼び出し元が数えきれない。呼ばれる側を包んで、全箇所にログを効かせる
大きすぎる関数・渡し方の曖昧な部品を組み直したい
- Break Out Method Object — 数百行の関数の途中だけをテストしたい。関数をクラスへ移して段ごとに割る
- Extract Interface — 差し替えた部品が月末だけ落ちる。使う側が呼ぶメソッド名を1か所に書き、
canで確かめる
全話一覧
| 公開日 | 技法 | 記事 |
|---|---|---|
| 9/24 | Characterization Test | テストの無い古いコード、直す前に「今の挙動」をテストに書き写す【Characterization Test】 |
| 9/25 | Effect Sketch | この変更はどこまで響く?全部テストする前に影響範囲を図で絞る【Effect Sketch】 |
| 9/26 | Seam | コードを書き換えずにテスト用の差し替え口を見つける。Perl の local で関数を一時置換【Seam】 |
| 9/27 | Sprout Method | 巨大な既存関数に書き足さない。新メソッドを生やして呼び出し1行だけ足す【Sprout Method】 |
| 9/28 | Sprout Class | テストで組み立てられないクラスへの機能追加は、新しいクラスを別に起こす【Sprout Class】 |
| 9/29 | Wrap Method | 呼び出し元を1行も変えずに、全箇所へログを仕込む【Wrap Method】 |
| 9/30 | Extract and Override Call | テストのたびに外部 API を叩いてしまうコードを、サブクラスで差し替える【Extract and Override Call】 |
| 10/1 | Parameterize Constructor | コンストラクタが本番の帳簿ファイルを開いてしまうクラスを、テストできる形にする【Parameterize Constructor】 |
| 10/2 | Introduce Instance Delegator | 関数名を揃えたらモックが効かなくなった。テストは緑のまま本物が動く罠【Introduce Instance Delegator】 |
| 10/3 | Break Out Method Object | 数百行の関数の「途中だけ」をテストしたい。関数をクラスへ移して段ごとに割る【Break Out Method Object】 |
| 10/4 | Extract Interface | 差し替えた部品が月末だけ落ちる。Perl でインタフェースを書き、can で確かめる【Extract Interface】 |
| 10/5 | Pinch Point | 単体テストは全部緑なのに締め処理が壊れる。1か所のテストで全体を守る【Pinch Point】 |
タグページ #code-carpenter からも全12本をたどれます。
