|
|
@@ -0,0 +1,170 @@
|
|
|
+# 重构ProcessActiveSkillsJob调用服务层保持简洁
|
|
|
+
|
|
|
+**时间**: 2025年07月20日 03:29
|
|
|
+**任务**: 重构ProcessActiveSkillsJob,让它调用服务层保持简洁
|
|
|
+
|
|
|
+## 任务背景
|
|
|
+
|
|
|
+原有的 `ProcessActiveSkillsJob` 包含了大量的业务逻辑,违反了单一职责原则。Job类应该保持简洁,只负责任务调度,具体的业务逻辑应该由服务层处理。
|
|
|
+
|
|
|
+## 重构内容
|
|
|
+
|
|
|
+### 1. 创建PetActiveSkillService服务类
|
|
|
+
|
|
|
+**文件**: `app/Module/Pet/Services/PetActiveSkillService.php`
|
|
|
+
|
|
|
+新建服务类,包含以下主要方法:
|
|
|
+- `processActiveSkills()`: 批量处理激活技能
|
|
|
+- `processSkill()`: 处理单个激活技能
|
|
|
+- `processSkillEffect()`: 处理技能效果
|
|
|
+- `executeSkillByType()`: 根据技能类型执行对应逻辑
|
|
|
+- `extractProcessData()`: 提取处理数据用于日志记录
|
|
|
+- `getSkipReason()`: 获取跳过原因
|
|
|
+
|
|
|
+### 2. 重构ProcessActiveSkillsJob
|
|
|
+
|
|
|
+**文件**: `app/Module/Pet/Jobs/ProcessActiveSkillsJob.php`
|
|
|
+
|
|
|
+**重构前**:
|
|
|
+- 包含200多行复杂业务逻辑
|
|
|
+- 直接处理技能效果、日志记录、统计等
|
|
|
+- 违反单一职责原则
|
|
|
+
|
|
|
+**重构后**:
|
|
|
+- 只有64行代码,保持简洁
|
|
|
+- 只调用服务层方法 `PetActiveSkillService::processActiveSkills()`
|
|
|
+- 专注于任务调度职责
|
|
|
+
|
|
|
+### 3. 代码对比
|
|
|
+
|
|
|
+#### 重构前的run方法(简化):
|
|
|
+```php
|
|
|
+public function run(): bool
|
|
|
+{
|
|
|
+ // 获取激活技能列表
|
|
|
+ $activeSkills = PetActiveSkill::where(...)->get();
|
|
|
+
|
|
|
+ foreach ($activeSkills as $activeSkill) {
|
|
|
+ // 检查过期
|
|
|
+ if ($activeSkill->isExpired()) {
|
|
|
+ // 处理过期逻辑...
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查是否需要执行
|
|
|
+ if (!$activeSkill->shouldCheck()) {
|
|
|
+ // 处理跳过逻辑...
|
|
|
+ }
|
|
|
+
|
|
|
+ // 处理技能效果
|
|
|
+ DB::transaction(function () use ($activeSkill) {
|
|
|
+ $this->processSkillEffect($activeSkill);
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ // 大量的统计和日志记录代码...
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+#### 重构后的run方法:
|
|
|
+```php
|
|
|
+public function run(): bool
|
|
|
+{
|
|
|
+ try {
|
|
|
+ // 调用服务层处理激活技能
|
|
|
+ $result = PetActiveSkillService::processActiveSkills(100);
|
|
|
+
|
|
|
+ return true;
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ Log::error('宠物激活技能定时任务执行失败', [
|
|
|
+ 'error' => $e->getMessage(),
|
|
|
+ 'trace' => $e->getTraceAsString()
|
|
|
+ ]);
|
|
|
+
|
|
|
+ throw $e;
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+## 重构优势
|
|
|
+
|
|
|
+### 1. 职责分离
|
|
|
+- **Job类**: 专注于任务调度和异常处理
|
|
|
+- **Service类**: 专注于业务逻辑处理
|
|
|
+
|
|
|
+### 2. 代码简洁性
|
|
|
+- Job类从253行减少到64行
|
|
|
+- 移除了复杂的业务逻辑代码
|
|
|
+- 提高了代码可读性
|
|
|
+
|
|
|
+### 3. 可维护性
|
|
|
+- 业务逻辑集中在服务层,便于维护
|
|
|
+- 服务层可以被其他地方复用
|
|
|
+- 单元测试更容易编写
|
|
|
+
|
|
|
+### 4. 可测试性
|
|
|
+- 服务层可以独立测试
|
|
|
+- Job类测试更简单
|
|
|
+- 业务逻辑测试与任务调度测试分离
|
|
|
+
|
|
|
+## 测试验证
|
|
|
+
|
|
|
+### 1. 创建单元测试
|
|
|
+
|
|
|
+**文件**: `tests/Unit/Pet/PetActiveSkillServiceTest.php`
|
|
|
+
|
|
|
+测试内容:
|
|
|
+- 服务层方法存在性测试
|
|
|
+- Job类简洁性验证
|
|
|
+- Job类是否正确调用服务层
|
|
|
+
|
|
|
+### 2. 测试结果
|
|
|
+
|
|
|
+```bash
|
|
|
+PHPUnit 11.5.20 by Sebastian Bergmann and contributors.
|
|
|
+
|
|
|
+... 3 / 3 (100%)
|
|
|
+
|
|
|
+Time: 00:00.011, Memory: 12.00 MB
|
|
|
+
|
|
|
+OK (3 tests, 5 assertions)
|
|
|
+```
|
|
|
+
|
|
|
+所有测试通过,验证重构正确性。
|
|
|
+
|
|
|
+## 架构改进
|
|
|
+
|
|
|
+### 重构前架构
|
|
|
+```
|
|
|
+ProcessActiveSkillsJob
|
|
|
+├── 直接处理业务逻辑
|
|
|
+├── 直接操作模型
|
|
|
+├── 直接记录日志
|
|
|
+└── 直接处理统计
|
|
|
+```
|
|
|
+
|
|
|
+### 重构后架构
|
|
|
+```
|
|
|
+ProcessActiveSkillsJob
|
|
|
+└── PetActiveSkillService
|
|
|
+ ├── PetAutoSkillLogic
|
|
|
+ ├── PetSkillProcessLog
|
|
|
+ └── 各种业务逻辑处理
|
|
|
+```
|
|
|
+
|
|
|
+## 符合项目规范
|
|
|
+
|
|
|
+1. **服务层设计**: 使用静态方法对外提供服务
|
|
|
+2. **逻辑层分离**: 服务层内部调用Logic类处理具体逻辑
|
|
|
+3. **异常处理**: 逻辑层不捕获异常,由上层处理
|
|
|
+4. **日志记录**: 在适当的层级记录日志
|
|
|
+5. **事务管理**: 在服务层管理事务
|
|
|
+
|
|
|
+## 总结
|
|
|
+
|
|
|
+通过这次重构:
|
|
|
+1. **提高了代码质量**: Job类保持简洁,符合单一职责原则
|
|
|
+2. **改善了架构设计**: 明确了Job层和Service层的职责边界
|
|
|
+3. **增强了可维护性**: 业务逻辑集中管理,便于后续维护
|
|
|
+4. **提升了可测试性**: 各层职责清晰,测试更容易编写
|
|
|
+
|
|
|
+这次重构为后续类似的Job类重构提供了良好的范例。
|