mcpField
M
m12-lifecycle

m12-lifecycle

github.com/actionbook開発1.6k3.4k 回インストール9 週間前に更新
リポジトリ

m12-lifecycle について

m12-lifecycleは、Rust開発者向けのリソースライフサイクル設計スキルです。リソースの作成時期、使い方、後片付けの責任を検討し、Rustの仕組みに結び付けます。

主な機能

  1. 01リソースのコストとスコープの評価
  2. 02RAII、遅延初期化、プールの比較
  3. 03後片付けの責任とエラー処理の説明
  4. 04ライフサイクルパターンのテンプレート
  5. 05よくあるリソース管理エラーの提示

活用シーン

  1. 01データベース接続の再利用または作成方針の選択
  2. 02スコープ終了時の自動クリーンアップ設計
  3. 03遅延初期化とトランザクション境界の処理

インストール

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

$npx skills add https://github.com/actionbook/rust-skills --skill m12-lifecycle

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

詳細

リソースのライフサイクル

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

中心となる問い

このリソースはいつ作成し、使用し、クリーンアップすべきですか?

ライフサイクルを実装する前に:

  • リソースのスコープは何ですか?
  • クリーンアップの責任者は誰ですか?
  • エラーが発生した場合、どうなりますか?

ライフサイクルのパターン → 実装

パターン場面実装
RAII自動クリーンアップDrop トレイト
遅延初期化作成の先送りOnceLock、LazyLock
プール高コストなリソースの再利用r2d2、deadpool
ガードスコープ内のアクセスMutexGuard パターン
スコープトランザクション境界カスタム構造体 + Drop

考えるための問い

ライフサイクルを設計する前に:

  1. リソースのコストはどの程度ですか?

    • 低コスト → 使用のたびに作成
    • 高コスト → プールまたはキャッシュ
    • グローバル → 遅延シングルトン
  2. スコープは何ですか?

    • 関数内 → スタック割り当て
    • リクエスト単位 → 渡すか、抽出する
    • アプリケーション全体 → static または Arc
  3. エラーについてはどうしますか?

    • クリーンアップが必須 → Drop
    • クリーンアップは任意 → 明示的な close
    • クリーンアップが失敗する可能性がある → close から Result を返す

上へたどる ↑

ドメインの制約(レイヤー 3)へ:

"How should I manage database connections?"
    ↑ Ask: What's the connection cost?
    ↑ Check: domain-* (latency requirements)
    ↑ Check: Infrastructure (connection limits)
問いたどり先確認事項
コネクションプーリングdomain-*許容できるレイテンシはどの程度ですか?
リソース制限domain-*インフラの制約は何ですか?
トランザクションのスコープdomain-*何をアトミックにする必要がありますか?

下へたどる ↓

実装(レイヤー 1)へ:

"Need automatic cleanup"
    ↓ m02-resource: Implement Drop
    ↓ m01-ownership: Clear owner for cleanup

"Need lazy initialization"
    ↓ m03-mutability: OnceLock for thread-safe
    ↓ m07-concurrency: LazyLock for sync

"Need connection pool"
    ↓ m07-concurrency: Thread-safe pool
    ↓ m02-resource: Arc for sharing

クイックリファレンス

パターン型ユースケース
RAIIDrop トレイトスコープ終了時の自動クリーンアップ
遅延初期化OnceLock、LazyLock初期化の先送り
プールr2d2、deadpoolコネクションの再利用
ガードMutexGuardスコープ終了時のロック解放
スコープカスタム構造体トランザクション境界

ライフサイクルイベント

イベントRust の仕組み
作成new()、Default
遅延初期化OnceLock::get_or_init
使用&self、&mut self
クリーンアップDrop::drop()

パターンテンプレート

RAII ガード
struct FileGuard {
    path: PathBuf,
    _handle: File,
}

impl Drop for FileGuard {
    fn drop(&mut self) {
        // Cleanup: remove temp file
        let _ = std::fs::remove_file(&self.path);
    }
}
遅延シングルトン
use std::sync::OnceLock;

static CONFIG: OnceLock<Config> = OnceLock::new();

fn get_config() -> &'static Config {
    CONFIG.get_or_init(|| {
        Config::load().expect("config required")
    })
}

よくあるエラー

エラー原因修正方法
リソースリークDrop を忘れたDrop または RAII ラッパーを実装する
二重解放手動でのメモリ管理Rust に任せる
drop 後の使用ダングリング参照ライフタイムを確認する
E0509 Drop 型からの移動所有するフィールドの移動Option::take()
プールの枯渇リソースが返却されないDrop によって返却されることを確認する

アンチパターン

アンチパターン問題点より良い方法
手動クリーンアップ忘れやすいRAII/Drop
lazy_static!外部依存std::sync::OnceLock
グローバルな可変状態スレッド安全ではないOnceLock または適切な同期
close を忘れるリソースリークDrop を実装する

関連スキル

場面参照先
スマートポインターm02-resource
スレッドセーフな初期化m07-concurrency
ドメインのスコープm09-domain
クリーンアップ時のエラーm06-error-handling

コメント