AgentSkillsCN

reviewing-fraktor-types

从“Less is more”“YAGNI”的视角出发,对 fraktor-rs 的模块与类型设计进行审查,及时发现过度设计的问题。通过与参考实现(pekko/protoactor-go)的对比、定量分析,以及对公开范围的优化,此技能可有效发挥作用。当用户提出“审查类型设计”“检查过度设计”“进行 YAGNI 检查”“整合文件”“重新审视公开范围”“type review”“overengineering check”等类型设计审查需求时,可使用此技能。

SKILL.md
--- frontmatter
name: reviewing-fraktor-types
description: fraktor-rsのモジュール・型設計を「Less is more」「YAGNI」の観点でレビューし、過剰設計を検出する。参照実装(pekko/protoactor-go)との比較、定量分析、公開範囲の最適化を行う。トリガー:「型の設計をレビューして」「過剰設計チェック」「YAGNIチェック」「ファイル統合」「公開範囲を見直して」「type review」「overengineering check」等の型設計レビューリクエスト時に使用。

fraktor-rs 型設計レビュー

モジュール・型の設計を「Less is more」「YAGNI」の観点でレビューし、過剰設計を検出・改善提案する。

Workflow

1. 対象の特定

レビュー対象を確認する:

  • スコープ: 特定モジュール / サブディレクトリ / クレート全体
  • 動機: 新規設計のレビュー / 既存コードのリファクタリング / 定期点検

2. 定量分析

対象ディレクトリに対して以下を計測する:

bash
# ファイル数・行数(テストファイル除外)
find <target> -name "*.rs" ! -name "tests.rs" | wc -l
find <target> -name "*.rs" ! -name "tests.rs" -exec wc -l {} + | sort -n

# 30行以下のファイル数(基準値テーブルの「30行以下ファイル率」に対応)
find <target> -name "*.rs" ! -name "tests.rs" -exec wc -l {} + | awk '$1 <= 30 {count++} END {print count}'

# 公開型の数
grep -r "^pub struct\|^pub trait\|^pub enum" <target> --include="*.rs" | wc -l

基準値(Phase 1-4 の実績から導出):

指標正常要注意過剰
30行以下ファイル率< 20%20-35%> 35%
平均行数/ファイル> 80行50-80行< 50行
pub 型 vs pub(crate) 型比率外部利用に応じた比率-pub が大半

3. 参照実装との比較

対象と同等の機能を持つ参照実装の型数を確認する:

  1. pekko (references/pekko/): Scala の対応クラス数を調査
  2. protoactor-go (references/protoactor-go/): Go の対応型数を調査
code
fraktor-rs の型数 / 参照実装の型数 = 倍率

倍率 1-2x: 正常(Rust の所有権・ライフタイム要件で型が増えるのは自然)
倍率 2-3x: 要注意(no_std/std 分離や Shared 型を差し引いても多い可能性)
倍率 3x+:  過剰(設計見直し推奨。Phase 1-4 で message_adapter が 6.5x → 統合で改善した実績あり)

4. 問題パターン検出

以下のパターンを探す:

a) 薄い型の過剰分離

  • 20行以下の enum / newtype が独立ファイルになっている
  • 関連する親型と「同一概念の部品」であり、単独では再利用されない

b) 型の重複

  • 同じフィールドを持つ複数の struct
  • 同じバリアントを持つ複数の enum(例: 両方に TypeMismatch がある)
  • Error 型と Failure 型の重複

c) 不要な公開

  • pub だが crate 外から参照されていない型
  • 再エクスポートされているが直接参照がない型

d) 過剰な抽象化

  • trait の実装が1つしかない
  • ジェネリクスが不要な場面でジェネリクスを使用

5. 改善提案

検出した問題に対して具体的な改善案を提示する:

問題改善案
薄い型の過剰分離親型と同居(ただし同居先200行以下)
型の重複統合して単一型に
不要な公開pub(crate) に変更
過剰な抽象化具体型に簡素化

6. 公開範囲の最適化

mcp__serena__find_referencing_symbols で各公開型の参照元を調査し、以下に分類:

  • pub: 外部クレートから参照される / 公開 API
  • pub(crate): crate 内部でのみ参照
  • 非公開: 特定モジュール内でのみ参照

使用例

例1: tick_driver モジュールのレビュー

リクエスト: 「tick_driver の型を見直したい」

定量分析結果:

  • 29サブモジュール、10-20行のファイルが多数
  • 30行以下ファイル率: 45%

参照実装比較:

  • pekko: Scheduler 関連 5型 → fraktor-rs: 27公開型(5.4倍)

検出パターン:

  • TickDriverId(u64): 20行、独立ファイル → newtype は維持(ドメインプリミティブ)
  • HardwareKind: 再エクスポートのみ、直接参照なし → 削除候補
  • TickMetricsMode: 22行、TickDriverConfig でのみ使用 → pub(crate) 化候補

改善提案:

  • 未使用の公開型6個を pub(crate) に変更
  • 再エクスポートのみの型3個を整理

例2: 新規モジュールの事前レビュー

リクエスト: 「ClusterMembership の設計をレビューして」

参照実装比較:

  • protoactor-go: cluster/membership に 4型
  • 設計案: 12型

判定: 3倍超 → 設計の簡素化を推奨

  • 内部状態型3個を pub(crate) に
  • 設定enum2個を親型に同居

参照ドキュメント

  • claudedocs/actor-module-overengineering-analysis.md: Phase 1-4 の分析基準と実績。基準値テーブルの根拠や過去の改善事例を確認する際に参照
  • references/pekko/: Scala 参照実装。ステップ3 で対応クラス数を調査する際に参照
  • references/protoactor-go/: Go 参照実装。ステップ3 で対応型数を調査する際に参照

出力ガイドライン

  • レビュー結果は定量データと具体的な改善案をセットで提示
  • 「ドメインプリミティブは統合しない」原則を尊重(TickDriverId 等の newtype は維持)
  • 改善案は懸念度(高/中/低)で優先順位をつける
  • 大規模な変更は Phase 分けして段階的に提案