092008-条件组消耗组类型处理逻辑统一优化.md 6.7 KB

条件组消耗组类型处理逻辑统一优化

时间: 2025年06月09日 20:08
任务类型: 代码重构
状态: 已完成

任务描述

Game模块中存在多处条件组类型(CONDITION_TYPE)和消耗组类型(CONSUME_TYPE)判断的重复性硬编码,用于处理类型描述、名称获取等工作,不利于维护。需要进行统一处理,消除重复代码,提升代码维护性。

问题分析

发现的问题

条件组类型重复问题:

  1. ConditionService - 大量switch语句处理不同条件类型
  2. ConditionGroupService - 重复的if-else判断获取目标名称
  3. GameConditionItem模型 - 重复的getTargetName方法
  4. GameConditionItemController - 重复的目标选项生成逻辑

消耗组类型重复问题:

  1. ConsumeService - 大量switch语句处理不同消耗类型
  2. ConsumeGroupService - 重复的if-else判断获取目标名称
  3. GameConsumeGroupController - 重复的目标名称显示逻辑
  4. GameConsumeItemController - 重复的目标选项生成逻辑

涉及的文件

  • app/Module/Game/Services/ConditionService.php
  • app/Module/Game/Services/ConditionGroupService.php
  • app/Module/Game/Services/ConsumeService.php
  • app/Module/Game/Services/ConsumeGroupService.php
  • app/Module/Game/Models/GameConditionItem.php
  • app/Module/Game/AdminControllers/GameConditionItemController.php
  • app/Module/Game/AdminControllers/GameConsumeItemController.php
  • app/Module/Game/AdminControllers/GameConsumeGroupController.php

解决方案

1. 创建统一的类型描述器

1.1 ConditionTypeDescriptor服务类

文件: app/Module/Game/Services/ConditionTypeDescriptor.php

主要功能:

  • 统一处理所有条件类型的名称获取
  • 统一处理目标名称的获取逻辑
  • 统一处理条件描述的格式化
  • 提供表单目标选项生成

核心方法:

// 获取条件目标名称
public static function getTargetName(int $conditionType, int $targetId, int $param1 = 0, int $param2 = 0): string

// 从GameConditionItem模型获取目标名称
public static function getTargetNameFromModel(GameConditionItem $item): string

// 格式化条件项显示
public static function formatConditionDisplay(int $conditionType, int $targetId, int $operator, int $value, int $param1 = 0, int $param2 = 0, bool $withBadge = true): string

// 获取条件类型的目标选项(用于表单)
public static function getTargetOptions(int $conditionType): array

1.2 ConsumeTypeDescriptor服务类

文件: app/Module/Game/Services/ConsumeTypeDescriptor.php

主要功能:

  • 统一处理所有消耗类型的名称获取
  • 统一处理目标名称的获取逻辑
  • 统一处理消耗描述的格式化
  • 提供表单目标选项生成
  • 转换消耗项为数组格式

核心方法:

// 获取消耗目标名称
public static function getTargetName(int $consumeType, int $targetId, int $param1 = 0, int $param2 = 0): string

// 从GameConsumeItem模型获取目标名称
public static function getTargetNameFromModel(GameConsumeItem $item): string

// 格式化消耗项显示
public static function formatConsumeDisplay(int $consumeType, int $targetId, int $quantity, int $param1 = 0, int $param2 = 0, bool $withBadge = true): string

// 获取消耗类型的目标选项(用于表单)
public static function getTargetOptions(int $consumeType): array

// 转换消耗项为数组格式(用于API返回)
public static function convertToArray(GameConsumeItem $item): array

1.3 扩展枚举类

CONDITION_TYPE枚举:

// 获取条件类型的详细信息
public static function getTypeInfo(int $type): array

CONSUME_TYPE枚举:

// 获取消耗类型的详细信息
public static function getTypeInfo(int $type): array

提供每种类型的详细描述信息,包括:

  • 名称和描述
  • 目标字段含义
  • 参数字段含义

2. 重构现有代码

2.1 模型层重构

  • GameConditionItem: 简化getTargetName方法,直接调用描述器

2.2 服务层重构

  • ConditionGroupService: 删除大量重复的if-else判断,使用统一描述器
  • ConsumeGroupService: 删除大量重复的if-else判断,使用统一描述器

2.3 AdminController重构

  • GameConditionItemController: 使用统一描述器获取目标选项
  • GameConsumeItemController: 使用统一描述器获取目标选项
  • GameConsumeGroupController: 使用统一描述器处理目标名称显示

实现效果

1. 代码简化

  • 删除了8个文件中的重复代码
  • 消除了约150行重复的switch语句和if-else判断
  • 统一了条件组和消耗组类型处理标准

2. 维护性提升

  • 新增条件类型时,只需在ConditionTypeDescriptor中添加一个case
  • 新增消耗类型时,只需在ConsumeTypeDescriptor中添加一个case
  • 类型显示逻辑统一,修改时只需改一处
  • 消除了硬编码,提升了代码的可维护性

3. 一致性保证

  • 所有条件类型显示都使用相同的格式化逻辑
  • 所有消耗类型显示都使用相同的格式化逻辑
  • 统一的错误处理和异常捕获
  • 表单选项生成逻辑统一

4. 功能增强

  • 支持带徽章和不带徽章的显示格式
  • 提供详细的类型信息描述
  • 支持复杂的参数处理
  • 统一的数组转换逻辑

技术细节

1. 设计模式

  • 策略模式: 不同类型使用不同的处理策略
  • 工厂模式: 统一创建类型描述对象
  • 单一职责原则: 每个方法只负责一种功能

2. 兼容性

  • 保持了原有的API接口不变
  • 向后兼容现有的调用方式
  • 渐进式重构,不影响现有功能

3. 扩展性

  • 新增类型时扩展简单
  • 支持复杂的类型描述逻辑
  • 预留了参数扩展空间

测试验证

1. 功能测试

  • 验证所有条件类型的名称获取正确
  • 验证所有消耗类型的名称获取正确
  • 验证类型显示格式化正常
  • 验证表单选项生成正确

2. 兼容性测试

  • 确保现有功能不受影响
  • 验证后台管理页面显示正常
  • 确认API返回数据格式一致

总结

本次重构成功解决了Game模块中条件组类型和消耗组类型处理的重复性硬编码问题:

  1. 创建了两个统一的描述器,集中处理所有类型相关逻辑
  2. 重构了8个相关文件,消除了大量重复代码
  3. 扩展了枚举功能,提供详细的类型信息
  4. 提升了代码维护性,新增类型时只需修改一处
  5. 保持了向后兼容性,不影响现有功能

这次重构进一步体现了"DRY(Don't Repeat Yourself)"原则的重要性,为Game模块的条件组和消耗组系统奠定了良好的架构基础。