不要な複雑性を持つ差分をレビューします。各発見は1行で報告: 場所、何を削除するか、代替案。差分の最良の結果は短くなることです。
フォーマット
L<行番号>: <タグ> <何を>. <代替案>.、または複数ファイルの差分の場合は <ファイル>:L<行番号>: ...。
タグ:
delete:デッドコード、未使用の柔軟性、投機的機能。代替案: なし。stdlib:標準ライブラリに既にある機能を自前実装しているもの。関数名を明記。native:プラットフォームが既に提供していることを実現する依存関係やコード。機能名を明記。yagni:実装が1つしかない抽象化、誰も設定しない設定値、呼び出し元が1つしかないレイヤー。shrink:同じロジックをより少ない行数で実現できるもの。短い形式を示す。
例
❌ 「このEmailValidatorクラスは必要以上に複雑かもしれませんね。これらのバリデーションルールが本当に全て必要なのか、検討されましたか?」
✅ L12-38: stdlib: 27行のバリデータクラス。メールアドレスの「@」チェックは1行、実際の検証は確認メールで行う。
✅ L4: native: moment.jsが1回のフォーマット呼び出しのためにインポートされている。Intl.DateTimeFormatで、依存関係0。
✅ repo.py:L88: yagni: 実装が1つしかないAbstractRepository。2つ目ができるまでインライン化する。
✅ L52-71: delete: 冪等なローカル呼び出しをラップするリトライラッパー。何も置き換えない。
✅ L30-44: shrink: 手動ループで辞書を構築中。dict(zip(keys, values))、1行。
スコアリング
唯一の指標で終了します: net: -<N> lines possible.
削除するものが何もない場合は、Lean already. Ship. と表示して停止します。
範囲
対象: 過度な設計と複雑性のみ。正確性のバグ、セキュリティホール、パフォーマンスは明示的に対象外です。それらは通常のレビューパスに回してください。1回のスモークテストや assert ベースのセルフチェックはポニーテールの最低限であり、肥大化ではありません。絶対に削除対象としてフラグを立てないでください。修正は適用せず、リストアップのみを行います。
"stop ponytail-review" または "normal mode": 通常の詳細なレビュースタイルに戻します。