借助十进制转二进制思路简化多条件校验场景下的冗余if判断
解决方案
你采用的是位掩码的设计思路,每个前置条件对应二进制的独立位,直接使用按位与运算就能快速判断某一项是否满足,不需要罗列所有可能的points值,同时你原有代码中的问题判断逻辑是反向错误的,优化方案如下:
核心原理
- 你给每个条件分配的权重1、2、4本质是2的0次、1次、2次幂,刚好对应二进制的第0、1、2位,条件满足时对应位会被设为1
- VBA中的
And运算符支持按位与操作,只要判断points And 对应权重的结果是否为0,就能识别问题项:结果为0说明对应位为0,即该条件未满足,属于问题项
优化后代码
Dim points As Integer points = 0 ' 条件校验逻辑保持不变 If Len(Range("A1")) = 6 Then points = points + 1 ' 对应二进制第0位,权重1 If CDbl(Range("B1")) >= CDbl(Date) Then points = points + 2 ' 对应二进制第1位,权重2 If Not IsEmpty(Range("C1")) Then points = points + 4 ' 对应二进制第2位,权重4 If points = 7 Then ' 原有业务逻辑 MsgBox "criteria met" Else ' 简化后的问题判断,无需罗列所有枚举值 If (points And 1) = 0 Then MsgBox "problem is A1" If (points And 2) = 0 Then MsgBox "problem is B1" If (points And 4) = 0 Then MsgBox "problem is C1" End If
扩展说明
如果后续新增前置条件,只需要依次给新条件分配8、16、32、64这类2的n次幂的权重,新增的问题判断仅需加一行对应按位与校验即可,即使扩展到7、8项条件也不会出现逻辑冗余的问题。
内容的提问来源于stack exchange,提问作者ben mazor
相关产品推荐
相关产品推荐

