combine-code-review について
combine-code-reviewは、Swift Combineのコードを審査する開発者向けのレビュー用スキルです。購読のライフタイム、参照サイクル、オペレーター、エラー処理、UIのスレッド制御を確認し、指摘前の検証ゲートを設けています。
主な機能
- 01購読とAnyCancellableの保持確認
- 02クロージャーの循環参照リスク検出
- 03Publisherオペレーターの用法確認
- 04チェーン内のエラー処理確認
- 05UI更新のメインスレッド制御確認
活用シーン
- 01sinkとassignのライフタイム管理のレビュー
- 02Combineチェーンのメモリ問題の調査
- 03検索処理でのflatMapとswitchToLatestの評価
- 04UI向けPublisherチェーンのスレッド制御確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ existential-birds/ beagle --skill combine-code-reviewインストール後、Claude Code で/combine-code-reviewを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/error-handling.mdmemory.mdoperators.mdpublishers.md詳細
Combine のコードレビュー
クイックリファレンス
| 問題の種類 | リファレンス |
|---|---|
| Publisher、Subject、AnyPublisher | references/publishers.md |
| map、flatMap、combineLatest、switchToLatest | references/operators.md |
| AnyCancellable、循環参照、[weak self] | references/memory.md |
| tryMap、catch、replaceError、Never | references/error-handling.md |
レビューチェックリスト
-
sinkクロージャで、self が cancellable を所有している場合は[weak self]を使用している -
assign(to:on:self)を使用していない(assign(to: &$property)または sink を使用する) - すべての AnyCancellable を Set またはプロパティに保持している(破棄していない)
- Subject を
eraseToAnyPublisher()でAnyPublisherとして公開している -
flatMapを適切に使用している(map + switchToLatestが必要な場合に使用していない) - メインチェーンを維持するため、エラーハンドリングを
flatMap内で行っている - エラー型を元に戻すため、
tryMapの後にmapErrorを使用している - UI を更新する前に
receive(on: DispatchQueue.main)を使用している - イベントには PassthroughSubject、状態には CurrentValueSubject を使用している
- retry と併用する場合、Future を Deferred でラップしている
リファレンスを読み込むタイミング
- Subject または publisher の選択をレビューする → publishers.md
- オペレーターのチェーンまたは publisher の結合をレビューする → operators.md
- サブスクリプションまたはメモリの問題をレビューする → memory.md
- エラーハンドリングまたは try* オペレーターをレビューする → error-handling.md
ハードゲート(指摘を報告する前に)
順番に完了してください。前のゲートが未完了のまま先に進まないでください。
- スコープ — 合格: レビュー対象のうち、Combine をインポートしているファイルまたは型、あるいはクイックリファレンスの API(例:
AnyPublisher、@Published、PassthroughSubject)を使用しているファイルまたは型を、少なくとも 1 つ挙げてください。該当するものがなければ、「対象外」として終了してください。 - サブスクリプションの保持 — 合格: スコープ内の各
sink、assign、store(in:)について、AnyCancellableがどこに保持されているか(プロパティ、Set、タスクの存続期間)を明記するか、1 行の理由(例:呼び出し元より長く存続しない、同期的な 1 回限りの処理)を添えて 一時的 と示してください。コードの断片から判断できない場合は 不明 とし、安全だと決めつけず、周辺の保持方法を確認してください。 - 循環参照の主張 — 合格: リークが確認されたという指摘では、キャプチャの連鎖(例:self → 保持された cancellable → self を強くキャプチャするクロージャ)を明示してください。疑いのあるケースは、リークが確認されたとせず、リスク/要確認 としてください。安全性を述べる場合は、根拠とした
[weak self]、[unowned self]、またはキャプチャを行わないパターンを示してください。 - UI/メインスレッド — 合格: チェーンから UIKit/SwiftUI を更新する場合、UI 処理の前に
receive(on: DispatchQueue.main)、@MainActor、または同等の指定があることを示すか、スケジューリングの欠落をファイル名:行番号で指摘してください。 - 重要度とチェックリスト — 合格: 高または重大の各項目には
ファイル名:行番号(または貼り付けられたコードの正確な行)を含め、違反しているレビューチェックリストの項目を明示してください。重要度の低い指摘では行番号を省略できますが、名前を挙げたファイルから再現できる必要があります。
レビュー時の質問
- すべてのサブスクリプションが保持されていますか?(破棄された AnyCancellable がないか確認してください)
- sink または assign が self との循環参照を作る可能性はありますか?
- 検索/オートコンプリートでは、flatMap の代わりに switchToLatest が必要ですか?
- この publisher が失敗した場合、どうなりますか?(メインチェーンが終了しませんか?)
- try* オペレーターの後で、エラー型は保持されているか、適切に変換されていますか?
コメント
Markdown 対応