Skip to content

Commit 0af0e12

Browse files
refactor: 重构事件处理器模块 - 分离处理器实现 (#147)
- 将事件处理器从 concrete_handlers.py 拆分到独立模块 - 创建 handlers/ 目录包含各类事件处理器 - 改进类型提示和文档字符串 - 修正分支名称拼写错误 (splie -> split) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude <noreply@anthropic.com>
1 parent 2e79494 commit 0af0e12

18 files changed

Lines changed: 928 additions & 811 deletions

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ node_modules/
3333
CLAUDE.md
3434
.mcp.json
3535
QWEN.md
36+
AGENTS.md
3637
# Ai学习用的文件
3738
knowledge_base*
3839
# 运行时生成的文件

zsim/sim_progress/ScheduledEvent/event_handlers/__init__.py

Lines changed: 2 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -4,118 +4,8 @@
44
该模块定义了事件处理的工厂类,用于管理各种类型的事件处理器。
55
"""
66

7-
from typing import Any
8-
97
from .base import EventHandlerABC
10-
from .concrete_handlers import register_all_handlers
118
from .context import EventContext
9+
from .handlers import event_handler_factory, register_all_handlers
1210

13-
14-
class EventHandlerFactory:
15-
"""事件处理器工厂类"""
16-
17-
def __init__(self):
18-
self._handlers: dict[str, EventHandlerABC] = {}
19-
self._handler_cache: dict[type, EventHandlerABC] = {}
20-
self._cache_hits = 0
21-
self._cache_misses = 0
22-
23-
def register_handler(self, handler: EventHandlerABC) -> None:
24-
"""
25-
注册事件处理器
26-
27-
Args:
28-
handler: 事件处理器实例
29-
30-
Raises:
31-
ValueError: 如果已存在相同事件类型的处理器
32-
"""
33-
event_type = handler.event_type
34-
if event_type in self._handlers:
35-
raise ValueError(f"事件类型 '{event_type}' 的处理器已存在")
36-
self._handlers[event_type] = handler
37-
38-
def get_handler(self, event: Any) -> EventHandlerABC | None:
39-
"""
40-
获取适合处理指定事件的处理器(带缓存)
41-
42-
Args:
43-
event: 待处理的事件对象
44-
45-
Returns:
46-
EventHandler | None: 如果找到合适的处理器则返回,否则返回None
47-
"""
48-
# 检查缓存
49-
event_type = type(event)
50-
if event_type in self._handler_cache:
51-
self._cache_hits += 1
52-
return self._handler_cache[event_type]
53-
54-
# 缓存未命中,查找处理器
55-
for handler in self._handlers.values():
56-
if handler.can_handle(event):
57-
self._handler_cache[event_type] = handler
58-
self._cache_misses += 1
59-
return handler
60-
61-
self._cache_misses += 1
62-
return None
63-
64-
def get_handler_by_type(self, event_type: str) -> EventHandlerABC | None:
65-
"""
66-
根据事件类型获取处理器
67-
68-
Args:
69-
event_type: 事件类型名称
70-
71-
Returns:
72-
EventHandler | None: 如果找到处理器则返回,否则返回None
73-
"""
74-
return self._handlers.get(event_type)
75-
76-
def list_handlers(self) -> list[str]:
77-
"""
78-
获取所有已注册的处理器类型列表
79-
80-
Returns:
81-
list[str]: 处理器类型名称列表
82-
"""
83-
return list(self._handlers.keys())
84-
85-
def clear_handlers(self) -> None:
86-
"""清除所有已注册的处理器"""
87-
self._handlers.clear()
88-
self._handler_cache.clear()
89-
90-
def get_cache_stats(self) -> dict[str, int | float]:
91-
"""
92-
获取缓存统计信息
93-
94-
Returns:
95-
dict[str, int]: 包含缓存命中率和统计信息的字典
96-
"""
97-
total_requests = self._cache_hits + self._cache_misses
98-
hit_rate = (self._cache_hits / total_requests * 100) if total_requests > 0 else 0
99-
100-
return {
101-
"cache_hits": self._cache_hits,
102-
"cache_misses": self._cache_misses,
103-
"total_requests": total_requests,
104-
"hit_rate_percent": round(hit_rate, 2),
105-
}
106-
107-
def reset_cache_stats(self) -> None:
108-
"""重置缓存统计信息"""
109-
self._cache_hits = 0
110-
self._cache_misses = 0
111-
112-
def clear_cache(self) -> None:
113-
"""清除处理器缓存"""
114-
self._handler_cache.clear()
115-
self.reset_cache_stats()
116-
117-
118-
# 全局处理器工厂实例
119-
event_handler_factory = EventHandlerFactory()
120-
121-
__all__ = ["event_handler_factory", "register_all_handlers", "EventContext"]
11+
__all__ = ["EventHandlerABC", "event_handler_factory", "register_all_handlers", "EventContext"]

zsim/sim_progress/ScheduledEvent/event_handlers/base.py

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,8 @@
66
from .context import EventContext
77

88
if TYPE_CHECKING:
9-
from zsim.sim_progress.data_struct import (
10-
ActionStack,
11-
)
129
from zsim.sim_progress.Enemy import Enemy
1310
from zsim.simulator.dataclasses import ScheduleData
14-
from zsim.simulator.simulator_class import Simulator
1511

1612

1713
class EventHandlerABC(ABC):
@@ -78,19 +74,19 @@ def _get_context_enemy(self, context: EventContext) -> Enemy:
7874
"""从上下文中获取敌人对象"""
7975
return context.get_enemy()
8076

81-
def _get_context_dynamic_buff(self, context: EventContext) -> dict:
77+
def _get_context_dynamic_buff(self, context: EventContext):
8278
"""从上下文中获取动态buff"""
8379
return context.get_dynamic_buff()
8480

85-
def _get_context_exist_buff_dict(self, context: EventContext) -> dict:
81+
def _get_context_exist_buff_dict(self, context: EventContext):
8682
"""从上下文中获取已存在buff字典"""
8783
return context.get_exist_buff_dict()
8884

89-
def _get_context_action_stack(self, context: EventContext) -> ActionStack:
85+
def _get_context_action_stack(self, context: EventContext):
9086
"""从上下文中获取动作栈"""
9187
return context.get_action_stack()
9288

93-
def _get_context_sim_instance(self, context: EventContext) -> Simulator:
89+
def _get_context_sim_instance(self, context: EventContext):
9490
"""从上下文中获取模拟器实例"""
9591
return context.get_sim_instance()
9692

@@ -132,12 +128,14 @@ def _validate_context(self, context: EventContext) -> None:
132128
Raises:
133129
ValueError: 当上下文无效时
134130
"""
135-
if not isinstance(context, EventContext):
131+
if not isinstance(context, EventContext): # type: ignore
136132
raise TypeError("上下文必须是EventContext类型")
137133

138134
# Pydantic模型已经确保了数据的完整性和有效性
139135

140-
def _handle_error(self, error: Exception, operation: str, event: Any = None) -> None:
136+
def _handle_error(
137+
self, error: Exception, operation: str, event: Any = None
138+
) -> None:
141139
"""
142140
统一错误处理方法
143141

0 commit comments

Comments
 (0)