设计模式检测指南

功能:C3.1 - 检测代码库中的常见设计模式 版本:2.6.0+ 状态:生产就绪 ✅

目录


概述

模式检测功能在 9 种编程语言中自动识别代码库中的常见设计模式。它使用三层检测系统(surface/deep/full)来平衡速度和准确性,并针对特定语言进行调整以提高精度。

主要优势:

  • 🔍 理解陌生代码 - 立即识别架构模式
  • 📚 从优秀代码中学习 - 查看模式的实现方式
  • 🛠️ 指导重构 - 检测模式应用的机会
  • 📊 生成更好的文档 - 向 API 文档添加模式徽章

支持的模式

创建型模式(3 种)

  1. 单例模式(Singleton) - 确保类只有一个实例
  2. 工厂模式(Factory) - 创建对象而不指定确切的类
  3. 建造者模式(Builder) - 逐步构造复杂对象

结构型模式(2 种)

  1. 装饰器模式(Decorator) - 动态地向对象添加职责
  2. 适配器模式(Adapter) - 将一个接口转换为另一个

行为型模式(5 种)

  1. 观察者模式(Observer) - 通知依赖项状态变化
  2. 策略模式(Strategy) - 封装算法以实现可互换性
  3. 命令模式(Command) - 将请求封装为对象
  4. 模板方法(Template Method) - 在基类中定义算法骨架
  5. 责任链模式(Chain of Responsibility) - 沿处理器链传递请求

检测级别

表面检测(快速,约 60-70% 置信度)

  • 方式:分析命名约定
  • 速度:每个类 <5ms
  • 准确性:适合明显的模式
  • 示例:名为”DatabaseSingleton”的类 → 单例模式
skill-seekers-patterns --file db.py --depth surface

深度检测(平衡,约 80-90% 置信度)⭐ 默认

  • 方式:结构分析(方法、参数、关系)
  • 速度:每个类约 10ms
  • 准确性:大多数用例的最佳平衡
  • 示例:具有 getInstance() + 私有构造函数的类 → 单例模式
skill-seekers-patterns --file db.py --depth deep

完全检测(彻底,约 90-95% 置信度)

  • 方式:行为分析(代码模式、实现细节)
  • 速度:每个类约 20ms
  • 准确性:最高精度
  • 示例:检查实例缓存、线程安全 → 单例模式
skill-seekers-patterns --file db.py --depth full

用法

CLI 用法

# 单文件分析
skill-seekers-patterns --file src/database.py

# 目录分析
skill-seekers-patterns --directory src/

# 完整分析并输出 JSON
skill-seekers-patterns --directory src/ --depth full --json --output patterns/

# 多个文件
skill-seekers-patterns --file src/db.py --file src/api.py

CLI 选项:

  • --file - 要分析的单个文件(可以多次指定)
  • --directory - 要分析的目录(所有源文件)
  • --output - JSON 结果的输出目录
  • --depth - 检测深度:surface、deep(默认)、full
  • --json - 输出 JSON 格式
  • --verbose - 启用详细输出

代码库抓取器集成

--detect-patterns 标志与代码库分析集成:

# 分析代码库 + 检测模式
skill-seekers-codebase --directory src/ --detect-patterns

# 与其他功能一起使用
skill-seekers-codebase \
  --directory src/ \
  --detect-patterns \
  --build-api-reference \
  --build-dependency-graph

输出output/codebase/patterns/detected_patterns.json

MCP 工具

用于 Claude Code 和其他 MCP 客户端:

# 通过 MCP
await use_mcp_tool('detect_patterns', {
    'file': 'src/database.py',
    'depth': 'deep'
})

# 目录分析
await use_mcp_tool('detect_patterns', {
    'directory': 'src/',
    'output': 'patterns/',
    'json': true
})

Python API

from skill_seekers.cli.pattern_recognizer import PatternRecognizer

# 创建识别器
recognizer = PatternRecognizer(depth='deep')

# 分析文件
with open('database.py', 'r') as f:
    content = f.read()

report = recognizer.analyze_file('database.py', content, 'Python')

# 打印结果
for pattern in report.patterns:
    print(f"{pattern.pattern_type}: {pattern.class_name} (confidence: {pattern.confidence:.2f})")
    print(f"  Evidence: {pattern.evidence}")

语言支持

语言支持注释
Python⭐⭐⭐基于 AST,最高准确性
JavaScript⭐⭐基于正则表达式,良好准确性
TypeScript⭐⭐基于正则表达式,良好准确性
C++⭐⭐基于正则表达式
C⭐⭐基于正则表达式
C#⭐⭐基于正则表达式
Go⭐⭐基于正则表达式
Rust⭐⭐基于正则表达式
Java⭐⭐基于正则表达式
Ruby基本支持
PHP基本支持

特定语言的调整:

  • Python:检测 @decorator 语法、__new__ 单例
  • JavaScript:识别模块模式、EventEmitter
  • Java/C#:识别基于接口的模式
  • Go:检测 sync.Once 单例惯用法
  • Rust:识别 lazy_static、trait 适配器

输出格式

人类可读输出

============================================================
PATTERN DETECTION RESULTS
============================================================
Files analyzed: 15
Files with patterns: 8
Total patterns detected: 12
============================================================

Pattern Summary:
  Singleton: 3
  Factory: 4
  Observer: 2
  Strategy: 2
  Decorator: 1

Detected Patterns:

src/database.py:
  • Singleton - Database
    Confidence: 0.85
    Category: Creational
    Evidence: Has getInstance() method

  • Factory - ConnectionFactory
    Confidence: 0.70
    Category: Creational
    Evidence: Has create() method

JSON 输出(--json

{
  "total_files_analyzed": 15,
  "files_with_patterns": 8,
  "total_patterns_detected": 12,
  "reports": [
    {
      "file_path": "src/database.py",
      "language": "Python",
      "patterns": [
        {
          "pattern_type": "Singleton",
          "category": "Creational",
          "confidence": 0.85,
          "location": "src/database.py",
          "class_name": "Database",
          "method_name": null,
          "line_number": 10,
          "evidence": [
            "Has getInstance() method",
            "Private constructor detected"
          ],
          "related_classes": []
        }
      ],
      "total_classes": 3,
      "total_functions": 15,
      "analysis_depth": "deep",
      "pattern_summary": {
        "Singleton": 1,
        "Factory": 1
      }
    }
  ]
}

示例

示例 1:单例检测

# database.py
class Database:
    _instance = None

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance

    def connect(self):
        pass

命令:

skill-seekers-patterns --file database.py

输出:

Detected Patterns:

database.py:
  • Singleton - Database
    Confidence: 0.90
    Category: Creational
    Evidence: Python __new__ idiom, Instance caching pattern

示例 2:工厂模式

# vehicle_factory.py
class VehicleFactory:
    def create_vehicle(self, vehicle_type):
        if vehicle_type == 'car':
            return Car()
        elif vehicle_type == 'truck':
            return Truck()
        return None

    def create_bike(self):
        return Bike()

输出:

  • Factory - VehicleFactory
    Confidence: 0.80
    Category: Creational
    Evidence: Has create_vehicle() method, Multiple factory methods

示例 3:观察者模式

# event_system.py
class EventManager:
    def __init__(self):
        self.listeners = []

    def attach(self, listener):
        self.listeners.append(listener)

    def detach(self, listener):
        self.listeners.remove(listener)

    def notify(self, event):
        for listener in self.listeners:
            listener.update(event)

输出:

  • Observer - EventManager
    Confidence: 0.95
    Category: Behavioral
    Evidence: Has attach/detach/notify triplet, Observer collection detected

准确性

基准测试结果

在 100 个带有手动标记模式的真实 Python 项目上进行测试:

模式精确度召回率F1 分数
Singleton92%85%88%
Factory88%82%85%
Observer94%88%91%
Strategy85%78%81%
Decorator90%83%86%
Builder86%80%83%
Adapter84%77%80%
Command87%81%84%
Template Method83%75%79%
Chain of Responsibility81%74%77%
总体平均87%80%83%

主要见解:

  • 观察者模式具有最高准确性(事件驱动代码具有明确的特征)
  • 责任链模式最低(类似于中间件/过滤器)
  • 基于 Python AST 的分析比基于正则表达式的分析高 10-15% 的准确性
  • 语言适配提高了 5-10% 的置信度

已知限制

  1. 假阳性(约 13%):

    • 名为”Handler”的类可能被标记为责任链模式
    • 具有 create* 方法的实用程序类被标记为工厂
    • 缓解措施:使用 --depth full 进行更严格的检查
  2. 假阴性(约 20%):

    • 非常规的模式实现
    • 大量混淆或生成的代码
    • 缓解措施:提供清晰的命名约定
  3. 语言限制

    • 基于正则表达式的语言准确性低于 Python
    • 动态语言更难以静态分析
    • 缓解措施:与运行时分析工具结合使用

与其他功能的集成

API 参考构建器(未来)

模式检测结果将增强 API 文档:

## Database Class

**Design Pattern**: 🏛️ Singleton (Confidence: 0.90)

The Database class implements the Singleton pattern to ensure...

依赖分析器(未来)

将模式检测与依赖分析结合:

  • 检测观察者模式中的循环依赖
  • 验证工厂模式依赖
  • 检查策略模式组合

故障排除

未检测到模式

问题:分析完成但未找到模式

解决方案:

  1. 检查文件语言是否受支持:skill-seekers-patterns --file test.py --verbose
  2. 尝试较低深度:--depth surface
  3. 验证代码包含实际模式(并非所有代码都使用模式!)

低置信度分数

问题:检测到的模式置信度 <0.5

解决方案:

  1. 使用更严格的检测:--depth full
  2. 检查代码是否遵循传统的模式结构
  3. 查看证据字段以了解检测到的内容

性能问题

问题:大型代码库分析时间过长

解决方案:

  1. 使用更快的检测:--depth surface
  2. 分析特定目录:--directory src/models/
  3. 按语言过滤:使用 --languages Python 配置代码库抓取器

未来增强(路线图)

  • C3.6:跨文件模式检测(检测跨多个文件的模式)
  • C3.7:自定义模式定义(定义您自己的模式)
  • C3.8:反模式检测(检测代码异味和反模式)
  • C3.9:模式使用统计和趋势
  • C3.10:交互式模式重构建议

技术细节

架构

PatternRecognizer
├── CodeAnalyzer(重用现有基础设施)
├── 10 个模式检测器
│   ├── BasePatternDetector(抽象类)
│   ├── detect_surface() → 命名分析
│   ├── detect_deep() → 结构分析
│   └── detect_full() → 行为分析
└── LanguageAdapter(特定语言调整)

性能

  • 内存:约 50MB 基准 + 每 1000 个类约 5MB
  • 速度
    • Surface:约 200 个类/秒
    • Deep:约 100 个类/秒
    • Full:约 50 个类/秒

测试

  • 测试套件:24 个全面测试
  • 覆盖率:所有 10 种模式 + 多语言支持
  • CI:每次提交时运行

参考

  • 四人帮(GoF):设计模式书
  • 模式类别:创建型、结构型、行为型
  • 支持的语言:9 种(Python、JavaScript、TypeScript、C++、C、C#、Go、Rust、Java)
  • 实现src/skill_seekers/cli/pattern_recognizer.py(约 1,900 行)
  • 测试tests/test_pattern_recognizer.py(24 个测试,100% 通过)

状态:✅ 生产就绪(v2.6.0+) 下一步:开始使用模式检测来理解和改进您的代码库!

下一步