简化条件表达式
Tip
清晰表达”在主要处理逻辑之前先做检查”的意图
中文名 | 英文名 | 时机 | 做法 | 意义 |
---|---|---|---|---|
分解条件表达式 | Decompose Conditional | 1 你有一个复杂的条件(if-then-else)语句 2 条件逻辑内,过长的函数,导致反而难以理解条件逻辑的场景 3 单个条件逻辑处理的函数过大 | ①对条件判断的每个分支分别运用提炼函数手法 ②如果条件表达式过长,对条件表达式运用提炼函数手法 ③优化当前条件逻辑(如使用三元表达式) 【注意】charge = summer() ? summerCharge() : regularCharge(); 不同分支应返回相同数据类型 | 简化逻辑 |
合并条件表达式 | Consolidate Conditional Expression | 1 你有一系列条件测试,都得到相同结果。 2 无其他副作用的嵌套if 条件语句的合并理由也同时指出了不要合并的理由:如果我认为这些检查的确彼此独立,的确不应该被视为同一次检查,我就不会使用本项重构。 | 使用适当的逻辑运算符,将两个相关条件表达式合并为一个。 顺序执行的条件表达式用逻辑或来合并,嵌套的if语句用逻辑与来合并。 ①确定条件表达式有副作用,先用将查询函数和修改函数分离的手法对其处理 【重复】{ ②如果是嵌套函数一般是用逻辑与合并,如果是并列的if一般是用逻辑或合并,如果两种均有,就要组合使用了(但是我更建议他们应该分离成多个判断) ③测试 } ④对合并后的条件表达式进行提炼函数手法(有必要的话) 保持数据格式不变 | 简化逻辑 |
以卫语句取代嵌套条件表达式 | Replace Nested Conditional with Guard Clauses | 1 函数中的条件逻辑使人难以看清正常的执行路径。 2 3 4 | 【重复】{ ①选取最外层需要被替换的条件逻辑,将其替换为卫语句(单独检查条件、并在条件为真时==立刻返回==的语句,叫做卫语句) ②测试 } ③从外而内 | 使用卫语句表现所有的特殊情况 |
以多态取代条件表达式 | Replace Conditional with Polymorphism | 1 多种并列或者嵌套的条件逻辑,让人难以理解 2 switch 3 同行为不同类型的判断 | ①确定现有的条件类是否具有多态性,如果没有,可以通过将行为封装成类(借助其他手法如函数组合成类等) ②在调用方使用工厂函数获得行为对象的实例 ③针对不同类型创建子类(相当于在超类在分化) ④调用方此时应当通过一个工厂返回合适的子类 ⑤将超类中针对子类类型所做的判断,逐一移入对应子类进行复写(相关子类复写超类的分支函数),超类只留下默认值 | 多态 |
引入特例 | Introduce Special Cas | 1 一个数据结构的使用者都在检查某个特殊的值,并且当这个特殊值出现时所做的处理也都相同。 2 多处以同样方式应对同一个特殊值 3 4 | ①在原类中为特例元素增加一个函数,用以标记这个特例的情况,默认返回一个写死的就行) ②为特例创建一个 Class,用以处理特例的正常逻辑和行为,需要把特例对象及其所有行为放到这个类 ③将本次特例的条件使用提炼函数手法抽成一个在类中的字段函数返回true ④修改所有调用者为第3步的函数 ⑤修改第一步创建的类。让它返回我们的特例对象 ⑥特例中的其他字段 你需要再三检查某对象是否为null。将null值替换为null对象。 | 减少重复代码 |
移除控制标记 | Remove Control Flag | 1 在一系列布尔表达式中,某个变量带有"控制标记"的作用。 2 3 4 | ①以break语句或return语句取代控制标记。 ⑧ | 简化逻辑,明确处理顺序 |
AA | AA | 1 2 3 4 | ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ | AA |
AA | AA | 1 2 3 4 | ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ | AA |
Tip
以卫语句取代嵌套条件表达式的精髓就是:给某一条分支以特别的重视。
如果使用if-then-else结构,你对if分支和else分支的重视是同等的
函数名中的 And 字样说明其中包含了两件事,所以我觉得应该将它们分开