当前位置: 首页 > news >正文

如何优雅处理多条件组合场景

⭐引言

在软件开发中,我们经常遇到需要处理多个条件组合的场景。我们需要处理A、B、C这三个值(或更多)的存在与否的各种组合。

🌻背景

在业务中,多条件匹配是常见的需求。用户可能只修改A,也可能同时B和C,或者三者都不修改。

  1. 识别出所有可能的组合场景
  2. 判断每种场景是否允许操作
  3. 提供明确的错误提示
  4. 决定是否需要重新计算相关数据

🍁设计

🍄编码设计:二进制映射

// 编码规则:二进制位映射
// A -> 4 (100)
// B -> 2 (010)
// C -> 1 (001)
public static Integer calculateCode(boolean A, boolean B, boolean C) {return (A? 4 : 0) + (B? 2 : 0) + (C? 1 : 0);
}

这种设计的美妙之处在于:

  • 每个值对应二进制的一位
  • 组合场景编码 = 各二进制位之和
  • 保证了编码的唯一性和可计算性

🌾完整的场景枚举

// 8种可能组合(0-7) + 错误场景
NULL(0, "A/B/C均无数据", false, "无配置,无需处理", false),
ONLY_C(1, "仅C", true, "", false),
ONLY_B(2, "仅B", true, "", false),
ONLY_BC(3, "仅B+C", true, "", false),
ONLY_A(4, "仅A", true, "", true),
ONLY_AC(5, "仅A+C", true, "", true),
ONLY_AB(6, "仅A+B", true, "", true),
ALL(7, "ABC", false, "模式不支持混合使用", false),
ERROR(99, "未知场景", false, "模式无法识别", false);
/*** 编码*/
private final Integer code;
/*** 描述*/
private final String desc;
/*** 是否通过*/
private final boolean pass;
/*** 提示*/
private final String tips;
/*** 是否重算*/
private final boolean calculate;

🌲业务规则配置

🌴允许操作的场景

// 允许的场景:pass = true
ONLY_C(1)   // 仅C
ONLY_B(2)   // 仅B
ONLY_BC(3)  // 仅B+C
ONLY_A(4)   // 仅A
ONLY_AC(5)  // 仅A+C
ONLY_AB(6)  // 仅A+B

🌱禁止操作的场景

// 禁止的场景:pass = false
NULL(0)                // 三个值都没提供(无需处理)
ALL(7)                 // 三个值都提供(过于复杂,不允许)
ERROR(99)              // 未知场景

🍃需要重新计算的场景

// 需要重算的场景:calculate = true
ONLY_A(4)     // A变化
ONLY_AC(5)    // A+C变化
ONLY_AB(6)    // A+B变化

规则总结:只要A发生变化,就需要重新计算相关数据。

🍊工具方法

🍆识别方法

// 使用示例
TestEnum type = TestEnum.getByCalculate(hasA,  // 是否有AhasB,  // 是否有BhasC   // 是否有C
);// 获取处理建议
if (type.isPass()) {if (type.isCalculate()) {// 执行重算逻辑}// 执行正常处理
} else {String errorMsg = type.getTips(); // 获取错误提示// 处理错误
}

🍓编码查询

// 通过编码获取枚举
TestEnumtype = TestEnum.getByCode(5);
// type = ONLY_AC

🍒设计模式

🌽状态模式的应用

这个枚举本质上实现了状态模式

  • 每个枚举常量代表一个状态
  • 每个状态有自己的行为(是否通过、是否需要重算)
  • 状态转换由输入条件决定

🥕表驱动设计

通过枚举实现的表驱动设计:

// 相当于一个查找表
code | 场景描述    | 是否通过 | 提示信息
0    | 三个值都无  | false   | 无配置...
1    | 仅C        | true    | 
2    | 仅B        | true    |
// ... 更多

🍠职责明确

每个枚举常量包含所有相关信息:

  • 描述:给开发者和用户看
  • 是否通过:业务规则判断
  • 提示:失败时的友好提示
  • 是否重算:后续处理流程

🍑扩展

🍉支持更多维度

如果未来需要增加第四个维度(如"D"),当前设计如何扩展?

方案一:扩展二进制位

// 新增第四位(权值8)
D(8), A(4), B(2), C(1)
// 场景数从8种增加到16种

方案二:使用位图

// 使用int的32位表示32个维度
int bitmap = 0;
if (hasA) bitmap |= 0x01;
if (hasB) bitmap |= 0x02;
// ...

🍼总结

  1. 使用二进制编码处理多值组合场景,简洁高效
  2. 枚举优于魔法数字,提高代码可读性
  3. 集中管理业务规则,便于维护和修改
  4. 提供完整上下文信息,每个枚举常量自包含
  5. 设计可扩展,考虑未来可能的变化

优秀的代码不仅是功能的实现,更是对问题本质的深刻理解和优雅表达


结束

http://www.jsqmd.com/news/367462/

相关文章:

  • NexaVM瞄准VMware退出用户市场,阿里巴巴加持助力扩张
  • OpenAI被传“泄露“的超级碗广告为虚假信息
  • 基于非线性干扰观测器的自适应滑模反演控制:机械臂模型与Matlab仿真探索
  • 2026年2月农业灌溉制造商推荐,节水灌溉系统性能实测解析 - 品牌鉴赏师
  • 郑州学工管理系统-学工管理系统-智慧校园解决方案 - 学工系统|学工平台|学生管理系统|学生信息管理系统|学工管理平台|智慧学工|智慧学工系统
  • AI智能体编程时代的技术架构:Claude Agent与OpenAI Codex在Xcode中的集成原理
  • 超过13.5万个OpenClaw实例暴露于互联网面临网络安全威胁
  • Uber斥资3.35亿美元收购土耳其Getir配送业务
  • 基于随机森林算法RF的数据分类预测:从基础到实践
  • 唯众AI心理健康布局:全栈技术赋能,构建中国自主体系的心理服务新生态
  • STM32 通过 WIFI 实现远程 OTA 升级
  • AI多模态模型在移动端的集成:如何实现图像、文本、语音的联合处理?
  • BI的作用,体现在企业的哪些方面
  • 信息论与编码篇---信息论的对象与方法
  • 9to5Mac每日播客:全新CarPlay功能即将发布,iOS 26.4传言汇总
  • 【金融项目实战】1_项目总结 _项目回顾
  • 基于Simulink平台的整车八自由度仿真模型研究
  • 2026年2月电折水厂商推荐,电折水精准配置与稳定性能解析 - 品牌鉴赏师
  • AI.com域名以7000万美元成交创历史纪录
  • 探索Matlab/simulink中双馈风机在风电并网调频的奥秘
  • COGS 2546. 巴什博弈
  • 【Excel VBA基础编程】边玩边学:可视化程序开发
  • 2026桶装水灌装机厂家最新推荐,自动化洗灌封一体设备优选 - 品牌鉴赏师
  • Comsol 磁流变弹性体仿真:探索磁力耦合与磁场分布的奇妙世界
  • 2026贵阳房产收购方案大比拼:在贵阳如何选择靠谱的收房公司 - 精选优质企业推荐榜
  • 实用指南:无人机信息采集模块技术要点与难点
  • 2026年2月煤气管道流量计订做厂家推荐,管道专用厂家甄选 - 品牌鉴赏师
  • 非线性七自由度对比模型搭建与CarSim联合验证之旅
  • AI大模型-NLP - 努力-
  • BISHI33 Poi 的新加法(Easy Version)