Skip to content

Latest commit

 

History

History
61 lines (36 loc) · 4.59 KB

refactoring-workflow.md

File metadata and controls

61 lines (36 loc) · 4.59 KB

リファクタのループ

リファクタのループ 1 周

目の前の作業に合わせて並べ替える

既定の順序は合成された priority です。作業がある 1 つの指標そのものである場合は、その軸で並べ替えてください。繰り返されているトークン量なら --sort duplicated-tokens、複製された箇所の多さなら --sort instances、名前がまだ一致しているコピーなら --sort identifier-jaccard です。レポートの読み方を参照してください。

ファイルを開く前に数値を読む

-v でグループの下に出る類似度の内訳は、ファイルを開く前に読む価値があります。構造と制御フローが完全に一致していて識別子だけが一致しないグループは、同じ処理を別々の名前で 2 回書いたものであることが多く、違う部分を引数に取る 1 つの関数に畳めます。識別子まで一致するグループはコピーであることが多く、片方をそのまま消せます。

これは数値の読み方であって、ツールが適用する規則ではありません。codehelion は各出現が何を共有しているかを報告するだけで、リファクタの判断は利用者に委ねます。

リファクタ直後の再スキャン

スキャンは、終えたばかりのリファクタに対する検査でもあります。次の作業へ移る前に、書き換えたツリーをもう一度読ませてください。

codehelion scan --mode structural

読み方は規則ひとつです。書いたばかりのヘルパが、置き換えたはずの呼び出し元と同じグループに現れたら、その呼び出し元は置換漏れです。これを報告するものは他にありません。コンパイルは通り、挙動も変わらないため、テストが通ることはすべてのコピーが消えた証拠になりません。通常の規模のツリーならスキャンは数秒で終わるので、リファクタごとに 1 回走らせる運用が現実的に成り立ちます。

自分の進み具合を追う

そのための準備は要りません。各スキャンは記録されるので、次のスキャンの合計欄が前回の実行で上位にあったグループがどうなったかを述べ、

codehelion explain <id>

が特定のグループが最新の実行に残っているかを述べます。baseline は CI で閾値を凍結するためのもので、進行中のリファクタを追うだけなら要りません。

seam はクローングループとは別種の作業単位

クローングループが名指しするのは繰り返されているコードです。seam が名指しするのは一緒に動かす必要のあるパスであり、レポートは、一緒に動かさなかったことが何を要したかを述べます。

seams: frontend-c-cpp 12 asymmetric changes, 7 breaches (last 6e014d86), 1,553 findings

並べる軸にするのは breach の件数です。非対称変更とは、メンバーの一部だけを触って残りをそのままにしたコミットのことで、そのうち相当数は正しい変更です。breach はそのあとに、触らなかったメンバーへの fix: が続いたものであり、そのリポジトリは非対称の代償をすでに一度払っています。隣の findings は、同じパスの中でスキャンが見つけた重複の件数です。ここで 2 種類の作業単位が交わります。breach していて finding も抱えている seam は、このループがそのまま手を付けられる対象です。

編集した後ではなく編集する前に、

codehelion guard --paths crates/codehelion-frontend-c/src/lex.rs

を走らせると、目の前のファイルと一緒に動かす必要のあるメンバーが分かります。

成果物も小さくなったか

これは別の問いです。finding が名指しするのは読み手が同期を取り続ける必要のあるコードであり、コンパイラが出力するバイト数ではありません。

codehelion artifact analyze path/to/binary

がそちらを測ります。両者の隔たりがどれほど大きいかは制限にあります。ソース側の重複の統合は、まず保守性のために行う価値があり、サイズのために行う価値があるのはサイズの上限が非圧縮の値である場合だけです。