Featured image of post コードカーペンター シリーズ目次【困りごとから探す案内板】

コードカーペンター シリーズ目次【困りごとから探す案内板】

「コードカーペンター」シリーズ全12回の案内板です。仕様書もテストも無い古い Perl コードに、壊さずに手を入れるための12の技法を、古い木造建築の修復工事の物語で扱う連載を、困りごとから探せます。

「コードカーペンター」は、仕様書もテストも無い古いコードに、壊さずに手を入れる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/24Characterization Testテストの無い古いコード、直す前に「今の挙動」をテストに書き写す【Characterization Test】
9/25Effect Sketchこの変更はどこまで響く?全部テストする前に影響範囲を図で絞る【Effect Sketch】
9/26Seamコードを書き換えずにテスト用の差し替え口を見つける。Perl の local で関数を一時置換【Seam】
9/27Sprout Method巨大な既存関数に書き足さない。新メソッドを生やして呼び出し1行だけ足す【Sprout Method】
9/28Sprout Classテストで組み立てられないクラスへの機能追加は、新しいクラスを別に起こす【Sprout Class】
9/29Wrap Method呼び出し元を1行も変えずに、全箇所へログを仕込む【Wrap Method】
9/30Extract and Override Callテストのたびに外部 API を叩いてしまうコードを、サブクラスで差し替える【Extract and Override Call】
10/1Parameterize Constructorコンストラクタが本番の帳簿ファイルを開いてしまうクラスを、テストできる形にする【Parameterize Constructor】
10/2Introduce Instance Delegator関数名を揃えたらモックが効かなくなった。テストは緑のまま本物が動く罠【Introduce Instance Delegator】
10/3Break Out Method Object数百行の関数の「途中だけ」をテストしたい。関数をクラスへ移して段ごとに割る【Break Out Method Object】
10/4Extract Interface差し替えた部品が月末だけ落ちる。Perl でインタフェースを書き、can で確かめる【Extract Interface】
10/5Pinch Point単体テストは全部緑なのに締め処理が壊れる。1か所のテストで全体を守る【Pinch Point】

タグページ #code-carpenter からも全12本をたどれます。

comments powered by Disqus
システム開発・AIワークフローのご相談は Meetsource へ
Hugo で構築されています。
テーマ Stack は Jimmy によって設計されています。