mcpField
M
m15-anti-pattern

m15-anti-pattern

github.com/actionbookテスト・品質1.6k8.7k 回インストール9 週間前に更新
リポジトリ

m15-anti-pattern について

設計上のアンチパターンに焦点を当てた Rust コードレビュー用スキルです。過剰なクローンや本番コードでの unwrap などを代替案や関連スキルに結び付けます。

主な機能

  1. 01アンチパターンと代替案の対応
  2. 02所有権とエラー処理の確認
  3. 03コードの臭いと関連スキルの接続
  4. 04Rust レビュー用チェックリスト

活用シーン

  1. 01Rust コードの過剰なクローンの確認
  2. 02本番コードの unwrap の検出
  3. 03借用チェッカーの問題から設計を追跡

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/actionbook/rust-skills --skill m15-anti-pattern

インストール後、Claude Code で/m15-anti-patternを入力して読み込まれたか確認します。

同梱ファイルpatterns/common-mistakes.md

詳細

アンチパターン

レイヤー 2:設計上の選択

中心となる問い

このパターンは設計上の問題を隠していませんか?

コードをレビューするときは、次の点を確認します。

  • 症状と原因のどちらを解決していますか?
  • より慣用的なアプローチはありませんか?
  • Rust に逆らっていますか、それとも Rust の流れに沿っていますか?

アンチパターン → より良いパターン

アンチパターン問題点より良い方法
あらゆる場所で .clone()所有権の問題を隠します適切な参照または所有権
本番環境での .unwrap()実行時にパニックします?、expect、またはエラー処理
単独の所有者なのに Rc不要なオーバーヘッドシンプルな所有権
手軽さのための unsafe未定義動作のリスク安全なパターンを探す
Deref による OOP誤解を招く APIコンポジション、トレイト
巨大な match アーム保守が困難メソッドに切り出す
あらゆる場所で String不要なアロケーション&str、Cow<str>
#[must_use] の無視エラーの見落とし処理するか let _ = を使う

考えるための問い

疑わしいコードを見つけたとき:

  1. これは症状ですか、それとも原因ですか?

    • 借用を避けるために Clone していますか? → 所有権設計の問題
    • 「失敗しないから」と Unwrap していますか? → 未処理のケース
  2. 慣用的なコードはどのようなものでしょうか?

    • Clone ではなく参照を使う
    • インデックスループではなくイテレーターを使う
    • フラグではなくパターンマッチングを使う
  3. Rust に逆らっていませんか?

    • 借用チェッカーと格闘している → 構造を見直す
    • unsafe を過剰に使っている → 安全なパターンを探す

上位をたどる ↑

設計の理解のために:

"Why does my code have so many clones?"
    ↑ Ask: Is the ownership model correct?
    ↑ Check: m09-domain (data flow design)
    ↑ Check: m01-ownership (reference patterns)
アンチパターンたどり先問い
あらゆる場所で Clonem01-ownershipこのデータを所有すべきなのは誰ですか?
あらゆる場所で Unwrapm06-error-handlingエラー処理の方針は何ですか?
あらゆる場所で Rcm09-domain所有権は明確ですか?
ライフタイムとの格闘m09-domainデータ構造を変えるべきですか?

下位をたどる ↓

実装(レイヤー 1)へ:

"Replace clone with proper ownership"
    ↓ m01-ownership: Reference patterns
    ↓ m02-resource: Smart pointer if needed

"Replace unwrap with proper handling"
    ↓ m06-error-handling: ? operator
    ↓ m06-error-handling: expect with message

初心者によくある間違いトップ 5

順位間違い修正方法
1借用チェッカーを回避するために Clone する参照を使う
2本番環境で Unwrap する? で伝播させる
3何にでも String を使う&str を使う
4インデックスループを使うイテレーターを使う
5ライフタイムと格闘するデータを所有するように構造を見直す

コードの臭い → リファクタリング

臭い示唆する問題リファクタリング
.clone() が多い所有権が不明確データフローを明確にする
.unwrap() が多いエラー処理が不足している適切なエラー処理を追加する
pub フィールドが多いカプセル化が崩れている非公開にしてアクセサーを追加する
ネストが深いロジックが複雑メソッドに切り出す
関数が長い複数の責務を持っている分割する
列挙型が巨大抽象化が不足しているトレイトと型を使う

よくあるエラーパターン

エラーアンチパターンの原因修正方法
E0382 move 後の使用所有権ではなく Clone を使っている適切な参照
本番環境でのパニックあらゆる場所で Unwrap?、マッチング
パフォーマンスの低下すべてのテキストに String を使う&str、Cow
借用チェッカーとの格闘不適切な構造構造を見直す
メモリの肥大化あらゆる場所で Rc/Arcシンプルな所有権

非推奨 → より良い方法

非推奨より良い方法
インデックスベースのループ.iter()、.enumerate()
collect::<Vec<_>>() してから反復イテレーターを連結する
手動の unsafe cellCell、RefCell
キャストのための mem::transmuteas または TryFrom
独自の連結リストVec、VecDeque
lazy_static!std::sync::OnceLock

すばやく確認するためのチェックリスト

  • 正当な理由のない .clone() がない
  • ライブラリーコードで .unwrap() を使っていない
  • 不変条件を持つフィールドを pub にしていない
  • イテレーターを使える場面でインデックスループを使っていない
  • &str で十分な場面で String を使っていない
  • #[must_use] の警告を無視していない
  • SAFETY コメントのない unsafe がない
  • 巨大な関数(50 行超)がない

関連スキル

場面参照先
所有権のパターンm01-ownership
エラー処理m06-error-handling
メンタルモデルm14-mental-model
パフォーマンスm10-performance

コメント