mxivideo/docs/modular-commander-architect...

8.3 KiB
Raw Permalink Blame History

模块化Commander架构

🎯 重构目标

将原来的大文件拆分成更小、更专注的模块,提高代码的可维护性和可重用性。

📊 重构结果

🎉 所有模块化测试通过!

✅ 模块化优势:
   1. 代码组织 - 每个模块职责单一明确
   2. 易于维护 - 修改某个功能只需改对应模块
   3. 可重用性 - 模块可以独立使用
   4. 测试友好 - 可以单独测试每个模块
   5. 扩展性强 - 新功能可以独立添加

📁 新的模块结构

Commander模块 (python_core/utils/commander/)

commander/
├── __init__.py      - 统一导入接口
├── types.py         - 数据类型定义
├── parser.py        - 参数解析器
├── base.py          - 基础Commander类
└── simple.py        - 简化Commander类

1. types.py - 数据类型定义

@dataclass
class CommandConfig:
    """命令配置"""
    name: str
    description: str
    required_args: List[str]
    optional_args: Dict[str, Dict[str, Any]]

2. parser.py - 参数解析器

class ArgumentParser:
    """命令行参数解析器"""
    
    def parse_arguments(self, args: List[str]) -> Tuple[str, Dict[str, Any]]:
        # 解析命令行参数,支持类型转换和验证

3. base.py - 基础Commander类

class JSONRPCCommander(ABC):
    """JSON-RPC Commander 基类"""
    
    @abstractmethod
    def _register_commands(self) -> None:
        pass
    
    @abstractmethod
    def execute_command(self, command: str, args: Dict[str, Any]) -> Any:
        pass

4. simple.py - 简化Commander类

class SimpleJSONRPCCommander(JSONRPCCommander):
    """简化的JSON-RPC Commander用于快速创建命令行工具"""
    
    def add_command(self, name: str, handler: Callable, ...):
        # 动态添加命令处理器

Progress模块 (python_core/utils/progress/)

progress/
├── __init__.py      - 统一导入接口
├── types.py         - 进度相关类型
├── task.py          - 任务管理
├── reporter.py      - 进度报告
├── generator.py     - 进度生成器
├── decorators.py    - 装饰器
└── commander.py     - 进度Commander

1. types.py - 进度相关类型

@dataclass
class ProgressInfo:
    current: int
    total: int
    message: str = ""
    percentage: float = 0.0
    elapsed_time: float = 0.0
    estimated_remaining: float = 0.0

@dataclass
class TaskResult:
    success: bool
    result: Any = None
    error: str = None
    total_time: float = 0.0

2. task.py - 任务管理

class ProgressiveTask:
    """渐进式任务包装器"""
    
    def start(self):
        # 开始任务
    
    def update(self, step: int = None, message: str = ""):
        # 更新进度
    
    def finish(self, message: str = "任务完成"):
        # 完成任务

3. reporter.py - 进度报告

class ProgressReporter:
    """进度报告器"""
    
    def report_progress(self, progress: ProgressInfo) -> None:
        # 报告进度到JSON-RPC或控制台

4. generator.py - 进度生成器

class ProgressGenerator:
    """进度生成器工具类"""
    
    @staticmethod
    def for_iterable(iterable, task, description="处理中"):
        # 为可迭代对象添加进度报告
    
    @staticmethod
    def for_range(start, end, task, description="处理中"):
        # 为范围添加进度报告

5. decorators.py - 装饰器

def with_progress(total_steps: int = 100, task_name: str = None):
    """为函数添加进度报告的装饰器"""

6. commander.py - 进度Commander

class ProgressJSONRPCCommander(JSONRPCCommander):
    """带进度条的JSON-RPC Commander基类"""
    
    @contextmanager
    def create_task(self, task_name: str, total_steps: int = 100):
        # 创建带进度的任务上下文

🔧 使用方式

1. 基础Commander

from python_core.utils.commander import JSONRPCCommander

class MyCommander(JSONRPCCommander):
    def _register_commands(self):
        self.register_command("process", "处理数据", ["input"])
    
    def execute_command(self, command, args):
        return {"result": "processed"}

2. 简单Commander

from python_core.utils.commander import create_simple_commander

commander = create_simple_commander("my_service")
commander.add_command("hello", lambda name="World": f"Hello, {name}!", "打招呼")
commander.run()

3. 进度Commander

from python_core.utils.progress import ProgressJSONRPCCommander

class MyProgressCommander(ProgressJSONRPCCommander):
    def _execute_with_progress(self, command, args):
        with self.create_task("处理中", 100) as task:
            for i in range(100):
                # 处理工作
                task.update(i, f"处理步骤 {i}")
            return {"completed": True}

4. 统一导入

# Commander模块
from python_core.utils.commander import (
    JSONRPCCommander, SimpleJSONRPCCommander, create_simple_commander
)

# Progress模块
from python_core.utils.progress import (
    ProgressJSONRPCCommander, ProgressiveTask, with_progress
)

📈 重构对比

重构前的问题

文件 行数 问题
jsonrpc_commander.py 301行 功能混杂,难以维护
progress_commander.py 350行 代码重复,职责不清

重构后的优势

模块 文件数 平均行数 优势
commander/ 5个 ~60行 职责单一,易于理解
progress/ 7个 ~50行 模块化,可独立使用

🎯 架构优势

1. 单一职责原则

  • 每个模块只负责一个特定功能
  • 降低模块间的耦合度
  • 提高代码的可读性

2. 开放封闭原则

  • 对扩展开放:可以轻松添加新模块
  • 对修改封闭:修改一个模块不影响其他模块

3. 依赖倒置原则

  • 高层模块不依赖低层模块
  • 通过抽象接口进行交互

4. 接口隔离原则

  • 客户端不应该依赖它不需要的接口
  • 每个模块提供最小化的接口

🚀 扩展性

添加新功能

# 1. 在commander/下添加新模块
# python_core/utils/commander/advanced.py
class AdvancedCommander(JSONRPCCommander):
    # 高级功能实现

# 2. 在progress/下添加新功能
# python_core/utils/progress/scheduler.py
class TaskScheduler:
    # 任务调度功能

# 3. 更新__init__.py导入

独立使用模块

# 只使用参数解析器
from python_core.utils.commander.parser import ArgumentParser

# 只使用进度任务
from python_core.utils.progress.task import ProgressiveTask

# 只使用进度装饰器
from python_core.utils.progress.decorators import with_progress

🧪 测试友好

单元测试

# 测试单个模块
def test_argument_parser():
    from python_core.utils.commander.parser import ArgumentParser
    # 只测试解析器功能

def test_progress_task():
    from python_core.utils.progress.task import ProgressiveTask
    # 只测试任务管理功能

集成测试

# 测试模块组合
def test_commander_with_progress():
    from python_core.utils.progress import ProgressJSONRPCCommander
    # 测试完整功能

🎉 总结

重构成果

  • 代码行数减少: 从651行拆分为12个小文件
  • 职责明确: 每个模块功能单一
  • 易于维护: 修改影响范围小
  • 可重用性: 模块可独立使用
  • 测试友好: 可单独测试每个模块

架构原则

  • 🎯 单一职责 - 每个模块只做一件事
  • 🔧 开放封闭 - 易于扩展,稳定修改
  • 📦 模块化 - 高内聚,低耦合
  • 🧪 可测试 - 独立测试,集成验证

使用体验

  • 💡 简单易用 - 清晰的API设计
  • 🚀 快速开发 - 便捷的创建函数
  • 📈 渐进增强 - 从简单到复杂的使用路径
  • 🔄 向后兼容 - 保持原有接口不变

通过模块化重构,我们不仅提高了代码质量,还为未来的功能扩展奠定了坚实的基础!


模块化架构 - 让代码更清晰、更易维护、更具扩展性!